OAuth是一个授权协议,解决的是应用可以访问用户在另一应用上的某些授权资源,但此应用不需要知道用户在另一应用上的账户密码,即无需向另一应用透露用户的凭据便可以访问另一应用上受控的资源。
-
2010年4月,OAuth 1.0协议发表为RFC 5849,一个非正式RFC。
-
2012年10月,OAuth 2.0发布,正式发表为RFC 6749。OAuth 2.0是OAuth协议的下一版本,但不向下兼容OAuth 1.0。OAuth 2.0关注客户端开发者的简易性,同时为Web应用、桌面应用、手机和智能设备提供专门的认证流程。
OIDC:参考https://baijiahao.baidu.com/s?id=172886314892482144
- OpenID团队不得不承认用户更喜欢OAuth2.0,因此,他们在OAuth之上定义了一个新的身份认证规范OpenID Connect(OIDC),这个规范基于OAuth2.0进行了小幅扩展,在OAuth2.0上构建了身份层,使其可用作身份认证协议。
-
OIDC中的Id token和OAuth2.0中核心的Access token各自效力或是关注的部分不同。
-
OAuth2提供了
Access Token
来解决授权第三方应用访问受保护资源的问题; -
OIDC遵循OAuth2.0协议流程在这个基础上提供了
ID Token
来解决第三方应用标识用户身份的问题。
1. 授权码流程:第三方应用通过浏览器重定向到授权服务器(OP)的认证页面来进行用户认证与执行授权流程。 重定向时使用的参数是基于OAuth2.0中的大部分参数。主要如下几个-
scope:必选。选择的授权范围,当是OIDC请求时,需要包含openid选项,如下示例所示。
-
response_type:必选。响应类型方式,使用授权码流程时,为code.
-
client_id:必选。第三方应用提前在授权服务器处注册得到的id值。
-
redirect_uri:必选。重定向到OP认证授权完毕后重定向到RP的地址。
-
state:推荐。第三方应用(RP)提供的一个字符串,授权服务器(OP)会原样返回给第三方应用(RP),以阻止CSRF攻击。
2. 隐式流程
3. 混合流程
-
就拿本站的三方登录来说,如何授权登录github,采用授权码流程:
- 第一步先去github的auth设置里面添加你要授权的网站,填写好授权的三方网站和授权回调地址(http://52sbl.cn/oauth/github/callback)会生成一个clientID和clientSecrets,这个配置在后端,用于服务器往github授权服务器的凭证。
2. 页面上点击github登录时,可以打开一个新的窗口,请求如下:
var authWin = window.open('/oauth/login/github', '_blank', 'width=800,height=600,menubar=no,toolbar=no,location=no')
3. 服务端会把你redirect到github授权服务器,并且携带上client_id和rediect_url,state是不可猜测的随机字符串。 它用于防止跨站请求伪造攻击。scope默认是空白,请求所有作用域。
4. 如果用户接受您的请求,GitHub 将重定向回自己的站点, 并且返回一个code
https://52sbl.cn/oauth/github/callback?code=XXXXXdd0eef0dee835&state=XXXXXXXbabf81abd0c8529721
5. 服务端用此 code
换访问令牌:
POST https://github.com/login/oauth/access_token
参数:
client_id 字符串 必填。您从 GitHub 收到的 OAuth 应用程序 的客户端 ID。
client_secret 字符串 必填。您从 GitHub 收到的 OAuth 应用程序 的客户端密钥。
code 字符串 必填。您收到的响应第 1 步的代码。
redirect_uri 字符串 用户获得授权后被发送到的应用程序中的 URL。
返回:
access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&scope=repo%2Cgist&token_type=bearer
6. 此时就可以使用这个access_token,去访问github的资源了,比如用户信息,拿到用户信息之后,然后封装你获取到的用户信息,(如果数据库里面没有这个github用户的信息,最好存一份这样可以方便自定义头像,名字啊啥的)。然后把用户信息设置到当前的sessionCache里面。
Authorization: token OAUTH-TOKEN GET https://api.github.com/user
7. 客户端,询盘查找当前的session是否登录成功(也就是询问后端我这个sessionid对应的后台缓存池里有没有github登录成功的信息,如果有的话返回给我,然后就关闭auth窗口)
网页三方授权:
微信小程序授权: