Spring Security实战--OAuth2.0协议说明

Spring Security实战–OAuth2.0协议说明


最近在做天猫精灵和小度音箱接入时,接触了OAuth2.0协议,在项目中也深入使用了由Spring Security提供的OAuth2.0框架,想着做一个总结以便后续回顾。下面是关于OAuth2.0的一些介绍和项目中的用法,供大家参考。

1 什么是OAuth2.0

OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAuth2.0是OAuth协议的延续版本,但不兼容OAuth 1.0(即完全废止了OAuth1.0)。
OAuth 2.0 规范定义了一个授权(delegation)协议。

2 应用场景

第三方应用授权登录:在APP或者网页接入一些第三方应用时,时常会需要用户登录另一个合作平台,比如QQ(或是微博,微信)的授权登录。在本人项目中目前用于天猫精灵和小度音箱的登陆授权。

3 OAuth2.0的四个重要角色

在OAuth2.0的完整授权流程中有4个重要的角色参与进来:
Resource Owner: 资源拥有者,上述例子中的用户。
Resource Server: 资源服务器,上述例子中的QQ(或是微博,微信)。
Client:客户端,上述例子中的第三方应用,代指任何可以消费资源服务器的第三方应用;
Authorization Server:授权服务器,管理Resource Owner,Client和Resource Server的三角关系的中间层。
其中Authorization server和Resource server可以是独立的服务提供商,也可以是在一起的,比如腾讯提供QQ作为资源服务器的同时也提供授权服务。
OAuth2.0解决问题的关键在于使用Authorization server提供一个访问凭据给Client,使得Client可以在不知道Resource owner在Resource server上的用户名和密码的情况下消费Resource owner的受保护资源。

4 四种授权模式

OAuth2.0提供了四种授权模式,如下:
①授权码模式(authorization code)
②简化模式(implicit)
③密码模式(resource owner password credentials)
④客户端模式(client credentials)
其中授权码模式(authorization code)是功能最完整、流程最严密的授权模式,本人在项目中使用的也是该模式。

5 授权码模式 Authorization code

Spring Security实战--OAuth2.0协议说明
(A)Client使用客户端(app或浏览器)访问Authorization server。实际就是访问提供的账户授权连接URL,该URL配置在小度和天猫开发者平台中(https://tzhome-auth.ziroom.com/oauth/authorize)
Spring Security实战--OAuth2.0协议说明

下面是天猫精灵访问授权服务器的账户授权连接示例:
https://zhome-auth.ziroom.com/oauth/authorize?redirect_uri=https%3A%2F%2Fopen.bot.tmall.com%2Foauth%2Fcallback%3FskillId%3D54644%26token%3DMzQ1NTIxNzQ3QUZFSElORkRWUQ%3D%3D&client_id=aligenie&response_type=code&state=0.8876685830307053
Client需要提供一下参数请求Authorization Server:
response_type:必选。值固定为“code”。
client_id:必选。第三方应用的标识ID。
redirect_uri:必选。授权成功后的重定向地址。
state:推荐。Client提供的一个字符串,服务器会原样返回给Client。
scope:可选。表示授权范围。
(B)Authorization server验证Client在(A)中传递的参数信息,如果无误则提供一个页面供Resource owner登陆,登陆成功后选择Client可以访问Resource server的哪些资源以及读写权限,在项目是选择用户希望授权的家庭。

Spring Security实战--OAuth2.0协议说明
(C)在(B)无误后返回一个授权码(Authorization Code)给Client。
(D)Client拿着(C)中获得的授权码(Authorization Code)和参数信息(客户端标识、重定向URL等信息)作为参数,请求Authorization server提供的Access Token URL获取访问令牌的URL。
(E)Authorization server返回访问令牌(Access Token)和可选的刷新令牌(Refresh Token)以及令牌有效时间等信息给Client。

Authorization Server会返回如下典型的信息:
access_token:访问令牌。
refresh_token:刷新令牌。
expires_in:过期时间。
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
“access_token”:“2YotnFZFEjr1zCsicMWpAA”,
“token_type”:“example”,
“expires_in”:3600,
“refresh_token”:“tGzv3JOkF0XG5Qx2TlKWIA”,
“example_parameter”:“example_value”
}

6 OAuth2.0刷新token

获取访问令牌(access_token)时,一般会提供一个过期时间和刷新令牌。以便在访问令牌过期失效的时候可以由客户端自动获取新的访问令牌,而不是让用户再次登陆授权。
通过调用配置的Access Token URL接口,刷新令牌获取新的访问令牌(access_token):
grant_type:必选。固定值“refresh_token”。
refresh_token:必选。客户端得到access_token的同时拿到的刷新令牌