原文作者:UC 国际研发 子逍
背景
随着互联网的巨头大佬逐渐积累了海量的用户与数据,用户的需求越来越多样化,为了满足用户在不同平台活动的需求,平台级的厂商则需要以接口的形式开放给第三方开发者,这样满足了用户的多样性需求,也可以让自己获得利益,让数据流动起来,形成给一个良性的生态环境,最终达到用户、平台商、第三方开发者共赢。
OAuth 思路
OAuth协议(详情见官网http://oauth.net)是为用户资源的授权方位提供一个安全、开放的标准,OAuth协议并不需要接触用户的账号信息,即账号密码,就可以完成第三方对用户信息访问的授权(http://zh.wikipedia.org/wiki/OAuth)
整体思路
OAuth在"客户端"与"服务提供商"之间,设置了一个授权层(authorization layer)。用户同意发起是否第三方授权,"客户端"拿到用户的命令后,去"服务提供商"申请授权,登录授权层以后,"服务提供商"根据令牌的权限范围和有效期,向"客户端"开放一定范围的资料。
OAuth 授权过程
1、角色涵盖
首先要先知道几个角色:普通用户(Consumer),客户端(ISV第三方应用),平台商(Platform提供服务资源或者认证服务器)
2、整体授权流程
(1)用户先对(客户端)ISV的应用进行访问,用户发起请求
(2)ISV接受到请求之后,导向平台商请求request token,并且带上其中的申请的appId
(3)平台验证appid后,返回一个request token,这个token是有效时间的,用于请求令牌
(4)ISV应用引导用户进入授权页面,并带上需要调转的回调链接,appid
(5)用户在platform平台商页面上输入密码账号,直接登录platform授权
(6)platform通过第三方ISV提供的回调链接,回调返回access token
(7)第三方ISV拿到access token,取到用户授权的数据,进行加工返回用户,授权完成。
OAuth 授权模式
- 授权码模式(authorization code)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
授权码模式(authorization code)
这里主要说下授权码模式,它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。
(A)用户访问客户端,客户端将用户导向平台商。
1、客户端给平台商发起的请求:
- response_type:表示授权类型,必选项,此处的值固定为"code"
- appId:表示客户端的ID,必选项
- redirect_uri:表示重定向URI,可选项
- scope:表示申请的权限范围,可选项
- state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
(B)客户端引导用户授权, 平台商根据URI返回授权码
- code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
- state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
(C)客户端引导平台商登录页面,该页面附上早先的"重定向URI"+授权码+appid,请求令牌(需要用户登录)
(D)如果用户登录,平台服务商将用户导向客户端事先指定的URI,登录授权
(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端的重定向URI发送访问令牌(access token)和更新令牌(refresh token)。
简化模式(implicit grant type)
不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。
主要访问:
用户授权后返回access token
密码模式(Resource Owner Password Credentials Grant)
用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。
用户授权后返回 access token。
客户端模式(Client Credentials Grant)
指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。
认证服务器必须以某种方式,验证客户端身份。
更新令牌
如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌。
客户端发出更新令牌的HTTP请求,包含以下参数:
- granttype:表示使用的授权模式,此处的值固定为"refreshtoken",必选项。
- refresh_token:表示早前收到的更新令牌,必选项。
- scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。
参考文档:(阿里淘宝)大型分布式网站架构设计与实践 陈康贤