OAuth 2 标准中定义了以下几种角色:
下面是 OAuth 2 一个大致的授权流程图:
OAuth 协议的授权模式共分为 4 种,分别说明如下:
Oauth基于客户端与认证服务器验证的能力定义了两种客户端类型(以及,维护客户端认证信息的能力): 客户端模式、密码模式。
基础参数定义:
认证服务器给客户端下发客户端标识--一个代表了注册信息的唯一字符串。客户端标识不是秘密;它被暴露给资源拥有者,并且不能单独用来客户端验证。客户端标识对认证服务器来说是唯一的。
常用于访问公共资源(无需登录):网站首页
该模式没有refresh_token,过期可以直接认证获取匿名令牌。
http://localhost:8080/oauth/token
grant_type:client_credentials client_id:46582ae7217343a8b252e3977e7cc421 client_secret:cgGvf5Rotv7D76m9JaArfY3YG6fDec47
{ "access_token": "9fae1382-8d9c-4c64-a01c-d67817137fd4", "token_type": "bearer", "expires_in": 27689, "scope": "read write" }
密码模式在客户端基础上,从用户方获取帐号密码,再访问授权服务器认证授权。
常用于访问个人资源(必须登录):个人资料
http://localhost:8080/oauth/token
grant_type:password client_id:46582ae7217343a8b252e3977e7cc421 username:18565783136 password:AC1DAdo9ZcY4dKAdtyPRzoICWZlkR7WDgtO06S5fVCUS6A/67rMxeW+2mKKbo2N1FQ== client_secret:cgGvf5Rotv7D76m9JaArfY3YG6fDec47
{ "access_token": "41d74d86-bd30-4935-a6f1-c61614a1b72b", "token_type": "bearer", "refresh_token": "1ba402f7-394b-420b-9805-39578d6176f8", "expires_in": 30063, "scope": "read write" }
授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。
常用于 第三方登录,例如:QQ登录网易音乐。
GET http://localhost:8080/authorize?response_type=code&client_id=cgGvf5Rotv7D76m9JaArfY3YG6fDec47&state=userId&redirect_uri=www.baidu.com
response_type code 代表授权模式为授权码模式 client_id 客户端ID redirect_uri 表示重定向URL编码后的URI(第三方服务器) state 表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。(常用:用户标识)
{ "access_token": "41d74d86-bd30-4935-a6f1-c61614a1b72b", "token_type": "bearer", "refresh_token": "1ba402f7-394b-420b-9805-39578d6176f8", "expires_in": 30063, "scope": "read write" }
不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,即没有code,直接返回令牌。
用于单页面应用,没有后台
GET http://localhost:8080/authorize?response_type=token&client_id=cgGvf5Rotv7D76m9JaArfY3YG6fDec47&state=userId&redirect_uri=www.baidu.com
response_type token 代表授权模式为简化模式 client_id 客户端ID redirect_uri 表示重定向URL编码后的URI(第三方服务器) state 表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。(常用:用户标识)
重定向 www.baidu.com?access_token=41d74d86-bd30-4935-a6f1-c61614a1b72b&state=userId
当访问令牌过期时候,刷新重新获取令牌。
Access Token 是客户端访问资源服务器的令牌。拥有这个令牌代表着得到用户的授权。然而,这个授权应该是 临时 的。这是因为,Access Token 在使用的过程中 可能会泄漏。给 Access Token 限定一个 较短的有效期 可以降低因 Access Token 泄漏带来的风险。
然而引入了有效期之后,客户端使用起来就不那么方便了。每当 Access Token 过期,客户端就必须重新向用户索要授权。这样用户可能每个几天,甚至每天都需要进行授权操作。这是一件非常影响用户体验的事情。希望有一种方法,可以避免这种情况。
传入 refresh_token
和 client_id
,认证服务器验证通之后,返回一个新的 Access Token。为了安全, OAuth2.0 引入了两个措施:
refresh
接口的时候,一定是从服务器到服务器的访问。client_secret
机制。即每一个 client_id
都对应一个 cleint_secret
。这个 client_secret
会在客户端申请 client_id
时,随着 client_id
一起分配给客户端。客户端必须把这个client_secret
妥善保管在服务器上,绝不能泄漏。刷新 Access Token 时,需要验证这个 client_secret
合法性。http://localhost:8080/oauth/token
grant_type:refresh_token refresh_token: 1ba402f7-394b-420b-9805-39578d6176f8 client_id:46582ae7217343a8b252e3977e7cc421 client_secret:cgGvf5Rotv7D76m9JaArfY3YG6fDec47
{ "access_token": "6d8cffd1-a90e-4846-838f-176050ed49b4", "token_type": "bearer", "refresh_token": "1ba402f7-394b-420b-9805-39578d6176f8", "expires_in": 43199, "scope": "read write" }
原文:https://www.cnblogs.com/yuarvin/p/13203858.html