概要
Oauth2是一种开放标准,方便于第三方平台授权,在不接触用户隐私信息(用户名和密码等信息)的情况下,被用户授予访问开放平台资源接口的部分资源权限,它不仅保护了用户的隐私和安全,还为第三方应用提供了便捷的资源访问方式。
主要成员构成
Client(客户端)
:需要访问资源接口的应用程序,需要向开放平台注册Resource Owner(资源拥有者)
:用户,授予客户端访问受保护资源的凭证Resource Server(资源服务器)
:资源存放处Authorization Server(授权服务器)
:校验客户端权限凭证并发放Access-Token(访问令牌)
和Refresh-Token(刷新令牌)
User-Agent(用户代理)
:浏览器或者APP等
注:资源服务器和授权服务器可以放在一起,也可以都是单独的实体
基本流程
Client
请求Resource Owner
获取访问受保护资源的凭证,最好是通过Authorization Server(授权服务器)
为中介获取,也就是客户端直接向授权服务器申请,但是实际审批是资源拥有者Client
收到授权凭证,根据不同授权模式有不同的体现Client
携带授权凭证请求Authorization Server
颁发令牌Authorization Server
验证客户端身份和授予凭证,并颁发Access-Token
以及Refresh-Token
Client
携带Access-Token
请求Resource Server
访问受保护资源Resource Server
验证访问令牌,有效则满足客户端服务请求
注:Refresh-Token(刷新令牌)
用于访问令牌失效后,不用再次走一遍流程,而直接访问授权服务器的刷新令牌接口,直接获取新的访问令牌
四大授权模式
授权码模式(推荐)
Client
引导Resource Owner
通过用户代理(APP、Web等)到Authorization Server
进行验证- 授权服务器验证资源所有者身份,并确定是否允许客户端访问请求
- 资源拥有者同意,则根据客户端提供的
重定向URL
携带授权码code
和本地状态state
(非必要)- 客户端接回调接口校验
state
是否本地拥有,确定授权者平台身份- 客户端携带
Client_id
、Client_secret
、code
、grant_type=authorization_code
请求授权服务器获取访问令牌和刷新令牌- 授权服务器验证客户端身份是否注册,以及验证授权码,颁发访问令牌和刷新令牌,返回重定向URL
- 客户端用访问令牌请求资源服务器访问受保护资源
- 资源服务器校验令牌有效性,并开放资源接口
申请令牌接口
简单模式(隐式授权)
在授权码的基础上减少了申请授权码的过程,授权服务器直接返回令牌给客户端,不安全容易暴露令牌。
相比于授权码模式,令牌会存储在客户端的后端,在后端进行对资源服务器的访问,安全性更
密码模式
用户直接将用户名和密码给客户端,客户端使用信息访问授权服务器获取令牌
需要用户对客户端的高度信任
客户端模式
客户端直接以自己的名义对授权服务器进行申请
场景选择
- 授权码模式: 适用于桌面应用程序和服务器端应用程序。
- 简化模式: 适用于移动应用程序和单页面应用程序。
- 密码模式: 适用于无状态客户端,如浏览器扩展程序。
- 客户端模式:适用于移动端
总结
无论是哪种授权模式,都是都是为了从认证服务器获取Access Token,用来访问资源服务器。在选择模式进行应用的时候,需要考虑到安全性和可支持性。
SpringSercurity整合Oauth2还待实践。