OAuth2.0 原理简介

一、前言

之前在对接支付宝的当面付时,总是涉及到各种授权,常见的第三方授权,涉及到code,token,accessToken 还有各种privateKey,publicKey 等眼花缭乱的概念。只是照着支付宝的文档在进行对接,现在回过头来研究了下,发现它的整个第三方授权体系,就是用的OAuth2.0 的架构。

二、支付宝第三方应用授权逻辑

如下图示(图片来源蚂蚁开放平台)

1.开发者向用户提供授权url 或授权二维码

1.1.用户登录支付宝账号进行授权

1.2.支付宝返回授权code,跳转到开发者指定页面,这样开发者获得授权code

2.1.开发者通过上一步获得的code去换取访问令牌access_token

2.2.支付宝返回access_token,开发者获取到令牌后就可以通过令牌去支付宝上查询用户资源了

这里有一个疑问:为什么在支付宝返回code后,不直接使用访问用户资源,而是要先换取令牌后再通过令牌进行访问用户资源?

OAuth2.0 原理简介

三、典型的第三方应用授权

如下图所示,是归纳的整个授权的模型,核心还是在于第2步得到的code,和第4步得到的access_token。

OAuth2.0 原理简介

四、OAuth 是什么

OAuth 的英文全称是Open Authorization,它是一种开放授权协议。

OAuth目前共有2个版本,2007年12月的1.0版(之后有一个修正版1.0a)和2010年4月的2.0版,1.0版本存在严重安全漏洞,而2.0版解决了该问题。

五、OAuth2.0 的思路

OAuth 主要是在第三方应用(客户端)和服务商之间设置了一个授权层。第三方应用不能直接登录服务商,只能登录授权层(这个授权层 可以是直接在服务端的服务器上,也可以是专门的认证服务器)。

第三方应用登录授权层所用的令牌与用户密码不同,这里用户在登录授权的时候,可以指定授权层令牌(access_token)的权限范围和有效期。

第三方应用登录授权层后,服务商根据令牌的权限范围和有效期,来向第三方提供用户资源。

六、OAuth2.0 安全机制

OAuth 2.0 协议在设计时,考虑了很多安全因素,下面就是 授权码模式下的一些安全机制:

1.利用更新令牌来延长令牌的授权时间

一般为了安全考虑,授权令牌的有效期不会太长,但是也不能让每次都去获取令牌。那这里的处理机制就是第一次获取令牌的时候,服务端也会回给客户端一个refreshToken,在要刷新令牌的时候,通过refreshToken就可以获取一个新的令牌。

2.第三方应用需要在授权服务器上认证和注册

比如前言中提到,我们作为第三方,需要调用用户的支付宝信息,在使用第三方认证授权前,我们必须要先在支付宝上的认证服务器上进行认证。

OAuth 2.0 协议默认浏览器是一个不安全的环境,所以在授权码模式授权过程中,用户给予授权后,认证服务器不是直接返回访问令牌,而是返回认证码,并通过浏览器重定向给第三方应用。第三方应用需要用认证码换取访问令牌,而换取步骤需要认证服务器认证第三方应用身份并且不通过浏览器,以此保证授权过程的安全性。

这也就解释第二部分的疑问。

3.获取认证码请求中,加入state 参数防止CRSF攻击

CRSF 攻击是跨站点请求伪装。在第三方应用把用户重定向到认证服务器以获取认证码的请求中,需要加入state参数,且认证服务器要返回相同的state参数给第三方应用。CSRF攻击者要想诱导用户授权并插入自己的认证码,且被第三方应用接收,就需要猜出该state参数,这大大增加了CSRF攻击的难度。


参考:阮一峰 理解OAuth 2.0