OAuth2.0

最近在看OAuth,即关于授权的一个开放网络标准,目前版本为2.0版,主要参考自阮一峰的网络日志:点击打开链接

作者点击打开链接,以简书通过QQ进行授权登陆为例,对OAuth2.0授权流程进行了梳理,详细请打开阅读。

OAuth2.0协议是一种近年来广泛应用于开放平台系统的访问控制协议,主要用于解决开放平台中的用户对第三方应用的授权问题。国内的腾讯、新浪、百度等互联网公司的开发平台都是使用该协议用于认证授权。该协议将开放平台划分为用户、客户端、授权认证服务器、资源服务器等,实现了在开放平台中用户数据与数据使用者分离的认证授权。但是,该协议主要面向在线用户使用在线应用的情况,不能解决用户离线时的授权问题。

一,应用场景理解

有一个“云冲印”网站,可以将用户存储在Google上的照片冲印出来,用户为了使用该服务,必须让“云冲印”读取自己存储在Google上的照片。

问题是,只有得到用户的授权,Google才会同意“云冲印”读取这些照片,那么“云冲印”怎样获取用户的授权?

传统方法是,用户将自己的Google用户名和密码,告诉“云冲印”,后者就可以读取用户的照片,这样做法有以下几个缺点:

1.“云冲印”为了后续服务,会保存用户名和密码,这样很不安全

2.Google不得不部署密码登录,而单纯的密码登录并不安全

3.“云冲印”拥有了获取用户存储在Google所有资料的权利,用户没法限制“云冲印”获得授权的范围和有效期

4.用户只有修改密码,才能收回赋予“云冲印”的权利,但是这样做会使得其他所有获得用户授权的第三方应用程序全部失效

5.只要有一个第三方应用程序被破解,就会导致用户名密码泄露,以及所有被密码保护的数据泄露

二,名词定义

1.Third-party application,第三方应用程序,本文中又称客户端(client),即例子中的“云冲印”

2.HTTP service,HTTP服务提供商,即例子中的Google

3.Resource Owner,资源拥有者,即用户

4.User Agent,用户代理,本文中指浏览器

5.Authorization server,认证服务器,即服务提供商专门用来处理认证的服务器

6.Resource server,资源服务器,即服务提供商存放用户生成的资源的服务器,它与认证服务器可以是同一台服务器也可不是

7.Access Token,访问令牌,用于获得授权的第三方应用访问数据

8.Refresh Token,刷新令牌,用于获得授权的第三方应用刷新Access Token

三,OAuth思路

OAuth在客户端和服务提供商之间,设置了一个授权层,客户端不能直接登录服务提供商,只能登录授权层,以此将用户与客户端分开来,客户端登录授权层所用的令牌(token)和用户的密码不同,用户可以在登录的时候,指定授权层令牌的权限范围和有效期。

客户端登录授权层以后,服务提供商根据令牌的权限范围和有效期,向客户端开放用户存储的资料。

四,运行流程

其流程图如下:


A,用户打开客户端,客户端要求用户给予授权

B,用户同意给客户端授权

C,客户端使用上一步获得的授权,向认证服务器申请令牌

D,认证服务器对客户端进行认证以后,确认无误,同意发放令牌

E,客户端使用令牌,向资源服务器申请获取资源

F,资源服务器确认令牌无误,同意向客户端开放资源

五,客户端的授权模式

客户端必须得到用户的授权,才能得到令牌,OAuth2.0定义了四种授权模式:

1.授权码模式(authorization code)

2.简化模式(implicit)

3.密码模式(resource owner password credentials)

4.客户端模式(client credentials)

六,令牌更新

如果用户访问的时候,客户端的访问令牌已经过期,则需要使用“更新令牌”申请一个新的访问令牌。

客户端发出更新令牌的HTTP请求,包含以下参数:

granttype,使用的授权模式,此处的固定值为“refreshtoken”,必选项

refresh_token,早前收到的更新令牌,必选项

scope,申请的授权范围,不可以超出上一次申请的范围,省略则表示与上一次一致

持续更新......