深度剖析 JWT 认证
引言
API 模型近年来在应用中被广泛的使用。这是因为一个应用程序不能只依赖于它自己的数据,为了完全开发出项目的潜力,就必须使用第三方应用,和其他程序配合,并能让开发简单地访问数据。
想一想 Facebook 如何使用接口来抓取数据(当然这需要授权)。Facebook 同时也允许第三方应用或其他服务商来获取它的数据。这些都通过API 来实现。
现在,我们来探索其中一种标准(JSON Web Tokens)并看看怎么创建它。
什么是 JSON Web Tokens?
JSON Web 令牌(JWT)发音为“ jot”,是一种标准,因为它们携带的信息是通过 JSON 传输的。我们可以在这阅读更多关于JWT的内容,但是那并不是最棒的解释。
JSON Web tokens 可以在多种不同的编程语言中使用: JWTs 可以在 .NET, Python, Node.js, Java, PHP, Ruby, Go, JavaScript, 和 Haskell 中使用。 所以你可以看到它在很多不同的场景中被使用。
JWTs 是独立的:它们自身携带所有必要的信息。这意味着 JWT 将能够传输关于自身的基本信息、有效负载(通常是用户信息)和签名。
JWTs 可以很容易地被传递: 因为 JWTs 是独立的,所以在 API 认证时,完全可以在 HTTP 请求头中传递。你也可以通过 URL 传递它。
JWT 长什么样子?
JWT 能够非常容易的被识别。它由三段通过 .
拼接的字符串组成
例如:
aaaaaaaaaa.bbbbbbbbbbb.cccccccccccc
让我们分析一下这 三个部分,看看每部分的含义。
分析一个 JSON Web Token
使用 .
分割成的三个部分创建方式是不同的。这三个部分分别是:
- header
- payload
- signature
Header
header 携带两个信息:
- 类型声明,固定为
JWT
- 使用的哈希算法 (这个例子中使用
HMAC SHA256
)
例子:
{
"typ": "JWT",
"alg": "HS256"
}
将这部分内容使用 base64encode
方式进行编码, 我们就有了 JSON web token 的第一部分!
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload
payload 承载了 JWT 的大部分内容,这部分也被称为 JWT Claims。在这部分中将放置我们想传递的内容和令牌相关的其他信息。
我们能提供多种声明。这包括注册声明名称,公有声明名称和私有声明名称。
注册声明
非强制性的声明,其名称是为我们保留的。这包括:
iss
: token 的 issuersub
: token 的 subjectaud
: token 的 audienceexp
: 这可能是最常用的注册声明。这将在 NumericDate 值中定义到期时间。到期时间必须在当前日期/时间之后。nbf
: 定义不能接受 JWT 进行处理的时间iat
: JWT 的发布时间。可用于确定 JWT 的年龄。jti
: JWT 的唯一标识符。可用于防止 JWT 重放,这有利于一次性使用 token。
公共声明
这些是我们自己创建的声明,如用户名、信息和其他重要信息。
私有声明
生产者和消费者可以使用私有的索赔名称。这些容易发生碰撞,所以要小心使用。
关键示例
我们的关键示例有有两个已注册的(iss
和 exp
)和两个公共索赔(name
,admin
)。
{
"iss": "scotch.io",
"exp": 1300819380,
"name": "Chris Sevilleja",
"admin": true
}
这将编码为:
eyJpc3MiOiJzY290Y2guaW8iLCJleHAiOjEzMDA4MTkzODAsIm5hbWUiOiJDaHJpcyBTZXZpbGxlamEiLCJhZG1pbiI6dHJ1ZX0
这将是我们的 JSON Web 令牌的第二部分。
签名
我们的 JSON Web Token 的第三部分也是最后一部分将是签名。这个签名由下列组件的散列组成:
- the header //头部
- the payload //关键信息
- secret //密钥
这是我们如何获得 JWT 的第三部分:
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
HMACSHA256(encodedString, 'secret');
秘钥是服务器持有的签名。 这是我们的服务器能够验证现有令牌并签署新令牌的方式。
这给了我们 JWT 的最后一部分。
03f329983b86f7d9a9f5fef85305880101d5e302afafa20154d094b229f75773
现在我们有了完整的 JSON 网络令牌:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzY290Y2guaW8iLCJleHAiOjEzMDA4MTkzODAsIm5hbWUiOiJDaHJpcyBTZXZpbGxlamEiLCJhZG1pbiI6dHJ1ZX0.03f329983b86f7d9a9f5fef85305880101d5e302afafa20154d094b229f75773
Auth0 创建了一个 很棒的站点 来浏览和测试 JWT 是如何制作的。 当您动态更改内容时,您可以看到 JWT 立即更新。 Auth0 提供了很好的工具,他们还维护 jsonwebtoken Node 包来处理在 Node 中创建和验证 JWT 。
结论
JSON Web 令牌标准支持跨多种语言使用,并且可以快速、轻松地互换。
您可以在 URL、POST 参数或 HTTP 头中使用令牌。JSON Web 令牌的多功能性让我们可以通过令牌传递信息,快速而轻松地验证 API。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
博客:解析jwt实现逻辑