OAuth2.0是一种用于访问授权的行业标准协议,OAuth2.0用于为互联网用户提供将其在某个网站的信息授权给其他第三方应用、网站访问,但是不需要将网站的账号密码给第三方应用、网站。
举个例子:
我在Github上有一个账号,现在我要访问其他网站如leetcode.cn,但又不想在LeetCode上重新填入各种身份信息创建账号。那能否复用我在github.com上的一些信息数据?
如果github.com和leetcode.cn实现了OAuth2.0协议,那么我就可以授权leetcode.cn到github.com上访问我的在github.com上的基本账户信息(如用户名、头像、邮箱、手机号)等。
OIDC,即OpenID Connect。
OpenID Connect
是基于OAuth 2.0的身份认证协议,增加了Id Token。
OIDC是OAuth2.0的超集,可以理解为OIDC=身份认证+OAuth2.0.
OAuth2.0主要定义了资源的授权,而OIDC主要关注的是身份的认证。(身份信息也属于资源,但是OAuth2.0中没有对身份信息包含哪些内容以及认证过程做完整定义)
举个例子:
我有一个google账号,我会使用许多google系的应用,如Gmail、Chrome等。通过ODIC(可能是定制版本),我可以使用同一个google账号去登录这些google系应用(以及以google作为身份提供商的第三方应用)。甚至这些应用间可以以Goolge账号系统提供的ID Token来认证是不是同一个用户。
OAuth2.0 中包含四个角色
在互联网系统场景下:
资源拥有者通常是网站的最终用户
资源服务器和授权服务器通常是同一个网站/应用里的子系统/模块,如微信中的数据库模块和认证模块。
客户端-client通常是一些第三方网站/应用,如微信里的小程序。
evernotecid://7D20C308-3D50-459D-A54D-B87FB1FC2C81/appyinxiangcom/11494076/ENResource/p1015
client
向 Resource-Owner
请求认证授权。client
获得 Resource-Owner
授权的凭据。client
通过向 Authorition-Server
进行身份验证并显示授权来请求访问令牌Access Token
。client
获得 Access Token
client
使用前面获得的 Access Token
请求被保护的资源client
获得 被保护的资源在OAuth2.0的运行流程中,
(C)->(F)实现相对单一,就是后台获取Access Token
,以及用Access Token
来访问资源。
(A)->(B)则有比较大的操作空间,如果请求Resource-Owner
的授权,以及获得的是什么样的凭据,可以根据场景需要来实现。
OAuth 2.0定义了四种授权方式
authorization code
授权码模式是最常用、最安全的授权方式,适用于有后端的Web应用。
授权码模式的基本原理是:
client
不直接向Resource Owner
请求授权,而是利用Authorization Server
作为一个中间媒介,
client
将Resource Owner
引导至Authorization Server
的页面(会带上client
的页面地址)。Resource Owner
在Authorization Server
的页面完成认证后,生成authorization code
重定向回client
页面。client
有了Authorization Server
提供的凭据authorization code
即可进行后续动作,请求Access Token
implicit
简化模式是将OAuth2.0运行流程中的(A)->(B), (C)->(D)两次交互合并成一次交互,即client
不获取authorization code
, 而是再第一次交互直接获取Access Token
.
简化模式中获取Access Token
的过程和授权码模式中获取authorization code
相似。
resource owner password credentials
密码模式是Resource Owner
直接向client
提供账号密码,client
使用账号密码来向Authorization Server
请求Access Token
密码模式适用于client
高度可信的场景。
client credentials
客户端模式指:客户端以自己的名义,而不是以Resource Owner
的名义,向authorization Server
进行请求授权。这里就不存在Resource Owner
的授权了。
OpenID Connect协议族 及其依赖的基础如下图所示:
evernotecid://7D20C308-3D50-459D-A54D-B87FB1FC2C81/appyinxiangcom/11494076/ENResource/p1017
OpenID使用OAuth2.0作为其授权协议,在此基础上定义了身份认证的过程。
evernotecid://7D20C308-3D50-459D-A54D-B87FB1FC2C81/appyinxiangcom/11494076/ENResource/p1016
ID-Token
(通常为访问令牌)进行响应。OIDC的核心在于授权过程中,一并提供用户的身份认证信息ID-Token(使用JWT来包装)给到第三方客户端,OP通常还提供了GetUserInfo的接口,用于获取用户更完整的信息。
OpenID Provider 是OpenID Connect最关键的组件。
OAuth2.0 RFC
OpenID Connect 1.0 RFC
oauth.net
理解OAuth 2.0 - 阮一峰的网络日志
OAuth2.0 详解
OIDC 与 OAuth2.0 综述
OpenID Connect FAQ and Q&As