深度剖析 JWT 认证

Laravel

引言

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 的 issuer
  • sub: token 的 subject
  • aud: token 的 audience
  • exp: 这可能是最常用的注册声明。这将在 NumericDate 值中定义到期时间。到期时间必须在当前日期/时间之后。
  • nbf: 定义不能接受 JWT 进行处理的时间
  • iat: JWT 的发布时间。可用于确定 JWT 的年龄。
  • jti: JWT 的唯一标识符。可用于防止 JWT 重放,这有利于一次性使用 token。

公共声明

这些是我们自己创建的声明,如用户名、信息和其他重要信息。

私有声明

生产者和消费者可以使用私有的索赔名称。这些容易发生碰撞,所以要小心使用。

关键示例

我们的关键示例有有两个已注册的(issexp)和两个公共索赔(nameadmin)。

{
  "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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://scotch.io/tutorials/the-anatomy-...

译文地址:https://learnku.com/laravel/t/61736

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!