OAuth2、OpenID Connect简介
当我们在登录一些网站的时候,需要第三方的登录。比如,现在我们要登录简书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://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简介的更多相关文章
- Identity Server 4 预备知识 -- OpenID Connect 简介
我之前的文章简单的介绍了OAuth 2.0 (在这里: https://www.cnblogs.com/cgzl/p/9221488.html), 还不是很全. 这篇文章我要介绍一下 OpenID C ...
- Identity Server 4 原理和实战(完结)_----选看 OpenId Connect 简介
Identity Procider:身份提供商
- PHP下的Oauth2.0尝试 - OpenID Connect
OpenID Connect OpenID Connect简介 OpenID Connect是基于OAuth 2.0规范族的可互操作的身份验证协议.它使用简单的REST / JSON消息流来实现,和之 ...
- OpenID Connect + OAuth2.0
一.问题的提出 现代应用程序或多或少都是如下这样的架构: 在这种情况下,前端.中间层和后端都需要进行验证和授权来保护资源,所以不能仅仅在业务逻辑层或者服务接口层来实现基础的安全功能.为了解决这样的问题 ...
- IdentityServer4+OAuth2.0+OpenId Connect 详解
一 Oauth 2.0 1 定义 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. ...
- ASP.NET没有魔法——ASP.NET OAuth、jwt、OpenID Connect
上一篇文章介绍了OAuth2.0以及如何使用.Net来实现基于OAuth的身份验证,本文是对上一篇文章的补充,主要是介绍OAuth与Jwt以及OpenID Connect之间的关系与区别. 本文主要内 ...
- ASP.NET OAuth、jwt、OpenID Connect
ASP.NET OAuth.jwt.OpenID Connect 上一篇文章介绍了OAuth2.0以及如何使用.Net来实现基于OAuth的身份验证,本文是对上一篇文章的补充,主要是介绍OAuth与J ...
- SSO的通用标准OpenID Connect
目录 简介 OpenID Connect是什么 ID Token 请求ID Token ID Token可以做什么 Open Connect认证码授权的例子 User Info 简介 OpenID C ...
- 一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3
今天推荐的是我一直以来都在关注的一个开源的OpenID Connect/OAuth 2.0服务框架--IdentityServer3.其支持完整的OpenID Connect/OAuth 2.0标准, ...
随机推荐
- Python实现的手机信息骚扰技术,切勿用作违法!
今天我来讲讲我最近找到的一个小思路,利用python进行短信轰炸 首先 这是一个网站,他的业务存在短信发送 这个时候,我们打开神器burp或者其他抓包工具(最好用burp,因为repeater模块可以 ...
- composer入门 一些简单常用的命令介绍
composer是什么 composer是PHP的插件依赖管理工具,我个人感觉和java的Maven.Gradle很类似. Windows OS下安装composer 参考: https://www. ...
- 如何从Mac删除恶意广告软件,摆脱那些通过弹出广告或工具栏入侵Mac的恶意软件
厌倦了那些利用弹出式广告和工具栏之类入侵Mac的恶意软件?该如何摆脱Mac上的恶意软件呢?今天小编为大家带来两种方法从Mac 删除广告软件,甚至阻止它到达您的Mac,感兴趣的朋友一起来看看吧! 方法一 ...
- PL/SQL Developer查詢已經執行過的SQL語句記錄 Ctrl+E
PL/SQL Developer查詢已經執行過的SQL語句記錄 最近提数比较多,没有已存在的脚本信息,就手工写呀... 一次性打开了多个提数脚本文件,结果执行完后把脚本保存好了,但是最后的整理其它脚本 ...
- 使用系统定时器SysTick实现精确延时微秒和毫秒函数
SysTick定时器简介 SysTick定时器是存在于系统内核的一个滴答定时器,只要是ARM Cortex-M0/M3/M4/M7内核的MCU都包含这个定时器,它是一个24位的递减定时器,当计数到 0 ...
- 【译】浅谈SOLID原则
SOLID原则是一种编码的标准,为了避免不良设计,所有的软件开发人员都应该清楚这些原则.SOLID原则是由Robert C Martin推广并被广泛引用于面向对象编程中.正确使用这些规范将提升你的代码 ...
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU开发那些事 - 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是恩智浦i.MX RTxxx系列微控制器相关知识. 恩智浦半导体于2018年10月发布的i.MX RTxxx系列开启了ML/AI MCU ...
- Java 基础复习 基础数据类型与包装器类型
Java 基础 基础数据类型与包装器类型 基础数据类型 java 中包含哪些基础数据类型,默认值分别是多少? 基础数据类型 byte short int long double float char ...
- JavaScript 标准内置对象Promise使用学习总结
Javascript标准内置对象Promise使用学习总结 by:授客 QQ:1033553122 1. 基础用法 var condition = true; let p = new Prom ...
- 使用jeecg-boot心得
使用jeecg-boot心得: Jeect-boot,采用主流最新的开发技术,是个强大的快速开发平台. 刚开始发现jeecg-boot时便对其精致美观的页面深深的迷住了.下载项目运行发现其中也有想要的 ...