在上一篇,我们介绍了 Web Token 的概念,也提到了 JSON Web Token。这里,再来对 JWT 进行深入的研究,看看在实际应用中的场景。
JWT 目前的场景都是用来记录用户登录信息数据的。这很容易让人想起近些年各大平台所采用的 OAuth 2.0,这也是用来进行登录授权的,它们有什么关系和区别?
⭐️ ️️OAuth 2.0 - Tokens
OAuth 启源于平台希望共享自己的内容给第三方,和第三方共同成长。但 OAuth 协议本身并未对 token 进行约定。
可以说 JWT 和 OAuth 协议本身并不在一个层面上,JWT 负责数据传输中的标准格式,而 OAuth 则负责签发证书和负责证书有效时长等。
但 OAuth 使用者比较要传递 token 啊,token 长什么样,如何定义?
这就有了 Bearer Token,JWT 实际上是在和它进行对比。
🔅 OAuth Bearer Token 举例
比如说这是一个 password 类型的 grant_type
1 | grant_type=password&client_id=3MVG9lKcPoNINVBIPJjdw1J9LLM82Hn |
这是它的返回值:
1 | { |
注意到,返回值中有 access_token 和 token_type=”Bearer”
🔅 常见 OAuth Token 方案:
其中的 Bearer 就是 OAuth 扩展协议 RF6750 加入的对 Token 具体的约定,当然了,结合上两讲的 Web Token,这里还会有其它类型的方案,像 RFC7523 的 JWT Profile 和 RFC7522 的 SAML2.0.
- The OAuth 2.0 Authorization Framework: Bearer Token Usage
- JWT Profile for OAuth 2.0 Client Authentication and Authorization Grants
- SAML 2.0 Profile for OAuth 2.0 Client Authentication and Authorization Grants
🔅 OAuth 2.0 - Bearer token
OAuth 2 里,其实并未说明 token 的 DSF,后来才加入的 Bearer Token
https://tools.ietf.org/html/rfc6750
Bearer Token 的格式 JWTs 传递 Toke 就是利用新定义的
1 | Bearer XXXXXXXX |
其中 XXXXXXXX 的格式為 b64token ,ABNF 的定義:
1 | b64token = 1*( ALPHA / DIGIT / "-" / "." / "_" / "~" / "+" / "/" ) *"=" |
正则表达式/Regular Expression 为:
1 | /[A-Za-z0-9\-\._~\+\/]+=*/ |
HTTP Authorization 格式:
1 | Authorization: Bearer <token> |
🔅 OAuth 2.0 - SAML Bearer Token
🔅 OAuth 2.0 - JWT Bearer Token
JSON Web Token (JWT):RFC7519 - JSON Web Token (JWT),该协议定义了一种自包含 Token 类型及完整性校验方法;
RFC7797 - JSON Web Signature (JWS) Unencoded Payload Option,该协议对 RFC7519 的更新
JWT 是 access_token 的格式的一种实现。
⭐️ ️️微服务下的 JWT
OAuth2 负责签发 Token,而 Edge Service 做自己的 JWT,在 JWT 的 payload 中放入自己的数据。
当然 OAuth provider 也可以用 JWT,如果他们需要带上一些附属信息的话,而 Edge Service 可以根据自己的情况,做自己的 JWT。