引言
现在很多网站都支持第三方授权登录,小伙伴们应该很常见这种授权登录方式了,那小伙伴们知道这种方式是以什么原理实现的么?
今天小编就为大家讲一讲里边的奥秘!
正文
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…