当我们在登录一些网站的时候,需要第三方的登录。比如,现在我们要登录简书https://www.jianshu.com/sign_in,我们使用微博登录,点击下方的一个微博的小按钮,就会出现这么一个地址https://api.weibo.com/oauth2/authorize?client_id=1881139527&redirect_uri=http%3A%2F%2Fwww.jianshu.com%2Fusers%2Fauth%2Fweibo%2Fcallback&response_type=code&state=%257B%257D。乍一看,这是什么玩意啊。我们来分解下:

https://api.weibo.com/oauth2/authorize?
client_id=&
redirect_uri=http%3A%2F%2Fwww.jianshu.com%2Fusers%2Fauth%2Fweibo%2Fcallback&
response_type=code&
state=%257B%257D

现在就要引出今天的主角了,OAuth2

那什么是OAuth2呢?

https://oauth.net/2/这是官网

https://open.weibo.com/wiki/授权机制,这是微博的授权机制

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html,这是阮一峰写的一篇对于OAuth2的介绍。

OAuth2.0是一个委托协议,它可用让那些控制资源的人允许某个应用代表这些人,而不是假冒和模仿这喜人,这个应用从资源的所有者哪里得到授权(Authentication)和Access Token,随后就可以使用这个Access Token来访问资源。(这里提到的假冒和模仿就是指在客户端复制一份用户名和密码,从而获取响应的权限)。是关于授权(Authentication)的,客户端应用可以请求Access Token,使用Tooken就可以访问API资源了。在上述的例子中,是微博给简书授权。

让客户端应用可以代表资源所有者(通常是用户)来访问被保护的资源,如下图:

资源所有者(Resource Owner),他拥有访问API资源的权限,并且他还可以委派权限(delegate)给其他应用来访问API。资源所有者通常是可以使用浏览器的人。

被保护的资源(Protected Resource)就是资源所有者拥有权限去访问的组件,它可以是很多种形式的,但是WebApi的形式还是最常见的。

客户端(Client)应用就是代表资源所有者访问被保护资源的一个软件,注意它既不是浏览器,也不是给你钱让你开发软件的人,在OAuth2里面,它是指被保护的API资源的消费者。

授权服务器(AS)是被受保护的资源所信任的,它可以发行具有特定目的的安全凭据给客户端应用,这个凭据就叫做OAuth的Access Token。

授权,如下图

 授权种类:

  1、Authentication Code

  2、Implicit

  3、Resource Owner Password Credentials,直接使用密码凭据(用户名和密码)作为授权来获得Access Token,只有当资源所有者和客户端之间高度新人的时候并且其它授权方式不可用的时候才可以使用这种授权方式。

  4、Client Credentials,有时候,资源或者叫资源服务器,并不属于某个最终用户,也就是没有资源所有者对该资源负责,但是客户端应用肯定还是要访问这些资源,这时候就只能使用Client Credentials这种授权方式了。

其他重要角色和组件:

  1、资源所有者Resource Owner  

  2、客户端Client

  3、被保护资源 Protected Resource

  4、授权服务器Authentication Server

  5、Access Token,它是用来访问被保护资源的凭据,授权服务器只是方形Token,被保护资源验证Token,客户端队友Access Token应该是完全健忘的。

  6、Scopes,被保护资源那里的一套权限,具有叠加性

  7、Refresh Token,用来获得Access Token的凭据,客户端是用Refresh Token来请求信的Access Token

通过refresh token来取得新的access token的流程

 重要端点:

  1、授权端点(Authentication Endpoint)是用来和资源所有者交互的,资源所有者在这里进行登录(身份认证),然后通过该端点可以对客户端进行授权(Authentication Grant)。授权服务器首先要验证资源所有者的身份,但是验证的方式并不在OAuth2的协议范围内。

  2、Token端点(Token Endpoint),客户端通过向Token端点展示它的授权(Authorization Grant)或Refresh Token来获取Access Token。除了Implicit之外所有的授权类型都需要使用该端点,因为Implicit和Access Token是直接发行的。

OpenId Connect(OIDC)

身份认证和授权。OAuth2不是身份认证(Authorization)协议,OpenId Connect可以进行身份认证(Authorization)。

一个比喻,授权,就好比生牛奶(多用途原料);身份认证,就好比奶茶(一个最终产品),以牛奶为主原料。OAuth2,是生牛奶,众多web安全架构的一种多用途的基本成分。OIDC,好比奶茶,基于OAuth2的身份认证协议,添加了一些组件来提供身份认证的能力。

更高级的协议,扩展并代替了OAuth2。OpenID Connect是建立在OAuth2协议上的一个简单的身份标识层,所以OpenID Connect兼容OAuth2。使用OpenID Connect,客户端应用可以请求Identity Token,它会和Access Token一同返回给客户端应用。这个Identity Token就可以被用来登录客户端应用程序,而客户端应用还可以使用Access Token来访问API资源。UserInfo端点,(OAuth2定义了Authorization端点和Token端点)它允许客户端应用和获取用户的额外信息。定义了不同类型的应用如何从身份识别提供商(IDP)安全的获取到这些Token。

与OAuth 2.0之间的角色映射关系

  1、身份供应商(Identity Provider,IdP)

  2、依赖方(Relying Party,RP,可以理解Wie客户端)

  3、OAuth2里面可以分为两部分

    a、资源所有者/客户端应用

    b、授权服务器/被保护资源

  4、身份认证协议里也是两大不分

    a、依赖方

    b、身份提供商

  5、映射OAuth2------OIDC

   授权服务器/被保护资源------身份提供商进行映射

   资源所有者--------最终用户

   客户端应用-----依赖方(RP)

Auth 2.0 与 OIDC 角色映射

 抽象流程:

依赖方(RP)发送请求到OpenID提供商(OP,也就是身份提供商)。

OpenID提供商验证最终用户的身份,并获得了用户委派的授权

OpenID提供商返回响应,里面呆着ID Token,也通常带着Access Token

依赖方现在可以使用Access Token发送请求到用户信息的端点

用户信息端点返回用户的声明(claims,相当于是用户的信息)。

OpenId Connect身份认证流程

Authorization Code Flow: 

  在Authorization Code流程里,一个授权码(Authorization Code)会被返回给客户端,这个授权码可以被直接用来交换ID Token和Access Token。该流程也可以在客户端使用授权码兑换Access Token之前对其身份认证。但是该流程要求客户端的身份认证动作在后台使用Client 和Secret来获得Tokens,这样就不会把Tokens暴露给浏览器或者其他访问浏览器的恶意应用了。

  要求客户端应用可以安全的在它和授权服务器之间维护客户端的Secret,也就是说只适合这样的客户端应用。它还适合于长时间的访问(通过Refresh Token)。授权码来自于授权端点,而所有的Tokens都来自于Token端点。

  Authorization Code流程的步骤如下:

    客户端准备身份认证请求,请求里包含所需要的参数

    客户端发送请求到授权服务器

    授权服务器对最红用户进行身份认证

    授权服务得最终用户的统一/授权

    授权服务器把最终用户发送回客户端,同时带着授权码

    客户端使用授权码向Token端点请求一个响应

    客户端接收到响应,响应的Body里面包含在和ID Token和Access Token

    客户端验证ID Token,并获得用户的一些身份信息

Implicit Flow:

  Implicit在请求Token的时候不需要明确的客户端身份认证,它使用重定向URI的方式来验证客户端的身份,因为这一点,Refresh Token也就无法使用了,这同样也不适合于长时间有效的Access Token。

  所有的Tokens都来自于授权端点,而Token端点并没有用到。

  该流程主要用于浏览器内的应用,Access Token和ID To恩一同被直接返回给客户端,因为这个原因,这些Tokens也会暴露于最终用户和跨域访问该浏览器的其他应用了。它并不适合于长时间的访问。

  Implicit流程的步骤如下:

    客户端准备身份认证请求,请求里包含所需要的参数

    客户端发送请求到授权服务器

    授权服务器对最终用户进行身份认证

    授权服务器获得最终用户的同意/授权

    授权服务器把最终用户发送客户端,同事带着ID Token,如果也请求了Access Token的话,那么Access Token也会一同返回。

    客户端验证ID Token,并获得用户的一些身份信息。

Hybrid Flow:

  Hybrid Flow是前两者的混合,在该流程里。有一些Tokens和授权码来自于授权重点,而另外一些Tokens则来自于Token端点。该流程允许客户端立即使用ID Token,并且只需要一次往返即可获得授权码。这种流程也要求客户端应用可以安全的维护Secret,它也适合于长时间的访问。

  Hybrid Flow的步骤如下:

    客户端准备身份认证请求,请求里包含所需要的参数

    客户端发送请求到授权服务器

    授权服务器对最终用户进行身份认证

    授权服务器获得最终用户的统一/授权

    授权服务器把最终用户发送回客户端,同事带着授权码,根据响应类型的不同,也考嫩恶搞带着一个躲着多个其他的参数

    客户端使用授权码向Token端点请求一个响应

    客户端接收到响应,响应的body里面包含着ID Token和Access Token

    客户端验证ID Token,并获得用户的一些身份信息。

三种流程特点的比较

 返回值类型的比较

 三种类型,根据response_type的不同,分为:

  response_type=code id_token、response_type=code token、response_type=code id_token token。

  注意:为了表明是OpenID Connect协议的请求,scope参数里必须包含OpenID。

esponse_type=code id_token

response_type=code token

response_type=code id_token token

Identity Server:

建立Identity Provider项目

dentityServer4.Templateshttps://github.com/IdentityServer/IdentityServer4.Templates

安装工具:

dotnet new -i identityserver4.templates

重置 “dotnet new” 功能列表: dotnet new --debug:reinit

模板:

dotnet new is4empty、 dotnet new is4ui 、dotnet new is4inmem 、dotnet new is4aspid、 dotnet new is4ef 、dotnet new is4admin (收费)

使用Identity Server 建立Authorization Server:https://www.cnblogs.com/cgzl/p/7780559.html

OAuth2、OpenID Connect简介的更多相关文章

  1. Identity Server 4 预备知识 -- OpenID Connect 简介

    我之前的文章简单的介绍了OAuth 2.0 (在这里: https://www.cnblogs.com/cgzl/p/9221488.html), 还不是很全. 这篇文章我要介绍一下 OpenID C ...

  2. Identity Server 4 原理和实战(完结)_----选看 OpenId Connect 简介

    Identity Procider:身份提供商

  3. PHP下的Oauth2.0尝试 - OpenID Connect

    OpenID Connect OpenID Connect简介 OpenID Connect是基于OAuth 2.0规范族的可互操作的身份验证协议.它使用简单的REST / JSON消息流来实现,和之 ...

  4. OpenID Connect + OAuth2.0

    一.问题的提出 现代应用程序或多或少都是如下这样的架构: 在这种情况下,前端.中间层和后端都需要进行验证和授权来保护资源,所以不能仅仅在业务逻辑层或者服务接口层来实现基础的安全功能.为了解决这样的问题 ...

  5. IdentityServer4+OAuth2.0+OpenId Connect 详解

    一  Oauth 2.0 1 定义 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. ...

  6. ASP.NET没有魔法——ASP.NET OAuth、jwt、OpenID Connect

    上一篇文章介绍了OAuth2.0以及如何使用.Net来实现基于OAuth的身份验证,本文是对上一篇文章的补充,主要是介绍OAuth与Jwt以及OpenID Connect之间的关系与区别. 本文主要内 ...

  7. ASP.NET OAuth、jwt、OpenID Connect

    ASP.NET OAuth.jwt.OpenID Connect 上一篇文章介绍了OAuth2.0以及如何使用.Net来实现基于OAuth的身份验证,本文是对上一篇文章的补充,主要是介绍OAuth与J ...

  8. SSO的通用标准OpenID Connect

    目录 简介 OpenID Connect是什么 ID Token 请求ID Token ID Token可以做什么 Open Connect认证码授权的例子 User Info 简介 OpenID C ...

  9. 一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3

    今天推荐的是我一直以来都在关注的一个开源的OpenID Connect/OAuth 2.0服务框架--IdentityServer3.其支持完整的OpenID Connect/OAuth 2.0标准, ...

随机推荐

  1. 防止 window.open 被拦截

    window.open('/app/dashbuilder.html?' + group.id, '_blank'); // 一般_self不会被拦截 // 改为 let newTab = windo ...

  2. AndroidStudio初识

    大家好,欢迎来到下码看花,伟大领袖毛爷爷曾经说过:“ ‘走马看花不如驻马看花,驻马看花不如下马看花.’我希望你们都要下马看花.”,比喻停下来,深入实际,认真调查研究,这就是咱们公众号名字的由来.与君初 ...

  3. js解决客户端与服务器时间不一致的问题

    引出 最近在写一个项目时,要根据时间进行不同的展示,直接用new Date().getTime()获取当前时间,结果就出问题了.有些用户擅自修改自己的本地时间,导致获取到的时间并不是当前时间,尴尬. ...

  4. linux源码安装mysql,shell编程学习,ubuntu

    一.mysql安装 以源码安装的方式编译和安装Mysql 5.6. 1.卸载旧版本 rpm -qa | grep mysql 检查是否有旧版本 查询结果:mysql-libs-5.1.73-7.el6 ...

  5. Http中URI协议 和URL协议的区别和联系

    虽然说URL和URI是整个网络协议栈很常用的东西.可是,假如你去面试求职者其中的差别,估计十个人有八个人答复不上来. 想要熟悉基础知识的朋友最好还是看一下我这个文章. “A Uniform Resou ...

  6. C# Replace字符替换函数

    它可以将字串内的字符替换为别的字符,可以嵌套使用,如下: 需要注意的是,它可以把字符替换为空,但不可以替换空字符,当不确定字符串是否为空时,可以进行以下判断,再替换: 示例的完整代码: string ...

  7. tornado框架中redis使用

    一.安装依赖 pip3 install tornado-redis 二.导入模块 import tornadoredis 三.创建redis对象 import tornadoredis CONNECT ...

  8. Linux创建Jenkins启动脚本以及开机启动服务

    1.jenkins.sh #!/bin/bash ###主要目的用于开机启动服务,不然 启动jenkins.war包没有java -jar的权限 JAVA_HOME=/usr/lib/jdk1.8.0 ...

  9. socket互传对象以及IO流的顺序问题

    UserInfo.java package com.company.s6; import java.io.Serializable; public class UserInfo implements ...

  10. arcgis api 4.x for js 自定义叠加图片图层实现地图叠加图片展示(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...