Open tomoya06 opened 3 years ago
OAuth 2.0 是一种授权机制,主要用来颁发token。RFC标准解释了OAuth如下:OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。
请求url、参数、返回样例可参考阮一峰的博客
Authorization
字段grant_type=refresh_token
)OAuth 2.0 规定了四种获得令牌的流程。开发者可以选择最适合自己的那一种,向第三方应用颁发令牌。下面假设B是资源所有者,A是客户端。
特点:最常用,安全性最高。它适用于那些有后端的 Web 应用,授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。
流程:
redirect_uri
,用户点击后就会跳转到 B 网站的登陆授权页。redirect_uri
,并附带一个授权码。redirect_uri
也是A 网站可控的,所以这时A就拿到了授权码,然后可以在后端向B请求access token,请求时会指定另一个redirect_uri
。redirect_uri
指定的网址,发送一段 JSON 数据。特点:把令牌直接传给前端,只能用于一些安全要求不高的场景,并且令牌的有效期必须非常短,通常就是会话期间(session)有效,浏览器关掉,令牌就失效了。
流程:
redirect_uri
,要求用户跳转到 B 网站,授权用户数据给 A 网站使用。redirect_uri
参数指定的跳转网址,并且把令牌作为 URL 锚点参数(eg.: https://a.com/callback#token=ACCESS_TOKEN
),传给 A 网站。令牌的位置是 URL 锚点(fragment),而不是查询字符串(querystring),这是因为 OAuth 2.0 允许跳转网址是 HTTP 协议,因此存在"中间人攻击"的风险,而浏览器跳转时,锚点不会发到服务器,就减少了泄漏令牌的风险。
特点:允许用户把用户名和密码,直接告诉该应用,应用直接用来申请令牌。
流程:
grant_type=password
)。特点:适用于没有前端的命令行应用,即在命令行下请求令牌。这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。
流程:
grant_type=client_credentials
)。单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
本节参考这篇博客
CAS框架实现的SSO流程示意图如下。
首次登录app的流程为:
首次登录app2的流程如下:
与OAuth2.0相比,两者的差异在于:
接口鉴权方式
1. SESSION
登录之后为请求方提供一个session id,对应的登录信息由服务端存储,客户端以cookie的形式保存session id,并在随后的请求中都带上session id。服务器会为每个session设置有效期,失效之后会将session删除。
Java端可以调用
session.invalidate()
方法主动让session失效。更多用法参考知乎博客。2. JWT TOKEN
JWT,全称Json Web Token。与session不同,JWT方案是让客户端保存会话数据,每次请求都发回服务器。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。
token格式
token由服务器生成,发放给客户端。
token = (Header).(Payload).(Signature)
Header和Payload的完整格式参考阮一峰的博客。Signature是对两者的签名,防止数据篡改。签名使用的密钥仅有服务器知道,签名公式如下:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
最佳实践
Authorization
字段。