https://www.jianshu.com/p/1f0a5fea9d79
相同点:
1) 都能实现访问资源服务的客户端验证, 都不需要session和cookie
2)两种方案都需要SSL安全保护,也就是对要传输的数据进行加密编码。安全地传输用户提供的私密信息,在任何一个安全的系统里都是必要的。否则任何人都可以通过侵入私人wifi,在用户登录的时候窃取用户的用户名和密码等信息。
不同点:
1)Token功能不一样,JWT的token是包含用户基本信息的,然后通过加密的方式生成的字符串,服务器端拿到这个token之后不需要再去查询用户基本信息,解析完token之后就能拿到。而access_token则仅仅只是一个token字符串,客户端需要拿着token去获取用户的信息
2) OAuth2也可以用在使用第三方账号登录的情况(比如使用weibo, qq, github登录某个app)
JWT是用在前后端分离, 需要简单的对后台API进行保护时使用.(前后端分离无session, 频繁传用户密码不安全)不能用于社交登录
OAuth2是一个相对复杂的协议, 有4种授权模式, 其中的code模式在实现时可以使用jwt才生成code, 也可以不用. 它们之间没有必然的联系.两者可以分开单独使用
3) Oauth2和jwt是完全不同的两种东西,一个是授权认证的框架,另一种则是认证验证的方式方法(轻量级概念)
jwt资料扩展:(参考https://segmentfault.com/a/1190000009164779)
+-----------+ +-------------+
| | 1-Request Authorization | |
| |------------------------------------>| |
| | grant_type&username&password | |--+
| | |Authorization| | 2-Gen
| Client | |Service | | JWT
| | 3-Response Authorization | |<-+
| |<------------------------------------| Private Key |
| | access_token / refresh_token | |
| | token_type / expire_in / jti | |
+-----------+ +-------------+
简短来说,响应一个用户请求时,将用户信息和授权范围序列化后放入一个JSON字符串,然后使用Base64进行编码,最终在授权服务器用私钥
对这个字符串进行签名,得到一个JSON Web Token
,我们可以像使用Access Token
一样的直接使用它,假设其他所有的资源服务器都将持有一个RSA公钥。当资源服务器接收到这个在Http Header中存有Token
的请求,资源服务器就可以拿到这个Token
,并验证它是否使用正确的私钥签名(是否经过授权服务器签名,也就是验签
)。验签
通过,反序列化后就拿到OAuth 2
的验证信息。
验证服务器返回的信息可以是以下内容:
-
access_token - 访问令牌,用于资源访问
-
refresh_token - 当访问令牌失效,使用这个令牌重新获取访问令牌
-
token_type - 令牌类型,这里是
Bearer
也就是基本HTTP认证 -
expire_in - 过期时间
-
jti - JWT ID
由于Access Token
是Base64编码
,反编码后就是下面的格式,标准的JWT格式。也就是Header
、 Payload
、Signature
三部分。
{
"alg":"RS256",
"typ":"JWT"
}
{
"exp": 1492873315,
"user_name": "reader",
"authorities": [
"AURH_READ"
],
"jti": "8f2d40eb-0d75-44df-a8cc-8c37320e3548",
"client_id": "web_app",
"scope": [
"FOO"
]
}
&:lƧs)ۡ-[+
F"2"Kآ8ۓٞ:u9ٴ̯ޡ 9Q32Zƌ$ec{3mxJh0DF庖[!뀭N)㥔knVVĖV|夻ׄE㍫}Ŝf9>'<蕱굤Bۋеϵov虀DӨ8C4K}Emޢ YVcaqIW&*uʝub!*Ť\՟-{ʖX܌WTq
使用JWT可以简单的传输Token
,用RSA签名
保证Token
很难被伪造。Access Token
字符串中包含用户信息和权限范围,我们所需的全部信息都有了,所以不需要维护Token
存储,资源服务器也不必要求Token
检查。
+-----------+ +-----------+
| | 1-Request Resource | |
| |----------------------------------->| |
| | Authorization: bearer Access Token | |--+
| | | Resource | | 2-Verify
| Client | | Service | | Token
| | 3-Response Resource | |<-+
| |<-----------------------------------| Public Key|
| | | |
+-----------+ +-----------+