引言
现在很多网站都支持第三方授权登录,小伙伴们应该很常见这种授权登录方式了,那小伙伴们知道这种方式是以什么原理实现的么?
今天小编就为大家讲一讲里边的奥秘!
正文
OAuth简介
我们都知道,所有的第三方授权登录底层基本上采用 http/https
协议。但是由于 http/https
协议是不可靠的,而客户端和服务端都希望要达到100%的可靠性。所以以OAuth
为代表的,基于 http/https
协议的授权标准也由此诞生并变成了主流。最开始在2006年出现的是OAuth1.0,由于1.0出现了一些安全漏洞等一些问题,5年后的2011年,该团队发布了OAuth2.0标准。
由于目前各大网站已经基本淘汰了OAuth1.0,用OAuth2.0标准来实现的授权功能,所以这篇文章是针对OAuth2.0来介绍的。
角色介绍
OAuth可以分为四个角色,我们这里就拿掘金来举例:
-
resource owner:可以理解为用户,在这里就是你自己;只有这个用户同意第三方或者基于OAuth的授权方式时,才能进行后续操作。
-
resource server:资源服务器,在这里就是掘金这个平台。
-
client:即客户:如果你是用浏览器浏览的掘金网站的话,那浏览器就是client。
-
authorization server:授权服务器;使用微信,GitHub,还是微博来授权呢,使用哪种方式哪个平台就是authorization server。
运行流程
介绍完四个角色,接着让我们来介绍一下它的运行流程:
-
(A)
客户端
请求用户
的授权;用户
要告诉客户端
,是否要用第三方授权,是微信?QQ?还是微博? -
(B)当
用户
的同意授权后,把同意授权的消息发送到客户端
。 -
(C)当B结束后,
客户端
拿着这些同意授权的信息去请求授权服务器
,这里的授权服务器
就是你所选的微信授权的服务器还是QQ授权的服务器。 -
(D)如果
授权服务器
得到并验证这些授权信息有效的话,这时授权服务器会颁发客户端一个访问令牌
(在微信公众号的网页授权中,访问令牌
的字段名称是access_token
) -
(E)
客户端
收到令牌
,将其发送给资源服务器
申请资源,这里的资源服务器
就是我们的掘金服务器。 -
(F)
资源服务器
确认无误后,说明认证通过,资源服务器
可以将资源返回给客户端
。
客户端授权模式
在上面B步骤中,OAuth2.0
一共有四种授权模式,我们来一一做个介绍:
- 授权码模式(Authorization Code)
- 简化模式(Implicit)
- 密码模式(Resource Owner Password Credentials)
- 客户端模式(Client Credentials)
授权码模式(Authorization Code)
-
(A)用户带着
客户端标识符
,重定向的URI
,本地状态
和请求范围
这四个属性去请求授权服务器。这里的本地状态
是可选属性,可以选择不传。但是如果不传可能会遭受到CSRF
攻击,大家可以视情况而定; -
(B)
授权服务器
对用户
进行身份验证,用来确定用户
是授予还是拒绝; -
(C)假设
用户
被授予了访问权限,授权服务器
会将用户重定向到之前所提供的重定向URI
中。重定向URI
中还包括本地状态
和客户标识符
; -
(D)接着
客户端
将带着本地状态
和客户标识符
去请求授权服务器
,目的是换取对应的访问令牌
; -
(E)授权服务器接到客户端的请求后,检验
本地状态
和客户标识符
,如果验证通过,将为客户端
返回对应的访问令牌
和(可选)刷新令牌
。
这里是一篇典型以授权码模式来授权的文档,可以结合这读一下。
developers.weixin.qq.com/doc/offiacc…
简化模式(Implicit Grant)
-
(A)
客户端
代理用户
去请求授权服务器
; -
(B)
用户
决定是否给客户端授权; -
(C)当
用户
同意授权后,客户端
将重定向到重定向URI
,重定向URI
中并存在着访问令牌
; -
(D)接着浏览器请求
资源服务器
,并且不用带着访问令牌
; -
(E)
资源服务器
通过认证后,返回一个网页,并包含访问令牌
; -
(F)
浏览器
解析这个网页并提取访问令牌
; -
(G)
浏览器
发送令牌给到客户端
。
密码模式(Resource Owner Password Credentials)
-
(A)
用户
向客户端
提供用户名和密码; -
(B)
客户端
将用户
提供的资源请求授权服务器
; -
(C)
授权服务器
进行身份验证,通过后发出访问令牌
。
客户端模式(Client Credentials)
-
(A)
客户端
向授权服务器
进行身份验证,所要访问令牌
; -
(B)
授权服务器
向客户端
进行身份验证,如果有效,则发出访问令牌
。
参考资料
1,OAuth2.0文档:www.rfcreader.com/#rfc6749
2,阮一峰的《理解OAuth 2.0》的博客:www.ruanyifeng.com/blog/2014/0…