name@example邮箱注册免费,name_example邮箱注册

你有没有参加过必须出示身份证才能证明你是买票的人的活动? 索要身份的行为是一种身份验证形式,以便您获得进入的授权。

在网络上,这个过程以类似的方式工作。 为了请求某些服务或访问特定页面,您需要以某种方式表明自己的身份,并且这种身份证明必须是安全且唯一的。

在本文中,您将了解 JWT(“json Web Tokens”的首字母缩写词)标准是用于身份验证的,它在 Web 上被广泛使用。

name@example邮箱注册免费,name_example邮箱注册

什么是令牌

如今,我们经常听到与 NFT、元宇宙、加密货币等相关的代币一词。但在这个宇宙之外,代币是数字签名、密钥。

当您在银行开户时,您需要设置密码和您的个人数据。这些数据被转换为一个数字签名,该签名将唯一地识别您对该银行的身份,并且每次您访问您的银行并输入您的密码和个人数据时,银行都会理解并确认您是那个登录用户,类似于我们如何当我们出示身份证件时进入活动。

有几种算法和标准可以将您的信息转换为令牌,即对您当前尝试访问的服务或应用程序有意义的唯一身份验证密钥。一个这样的标准是 JWT,它是安全的,因为它允许通过签名令牌在两方之间进行身份验证。

什么是智威汤逊?

JWT 是 RFC7519 定义的身份验证和信息交换标准。在其中,可以安全、紧凑地存储 JSON 对象。此令牌是 Base64 代码,可以使用密钥或私钥/公钥对进行签名。

签名令牌可以验证其中包含的信息的完整性,这与隐藏此信息的加密令牌不同。如果 JWT 由公钥/私钥对签名,则签名证明拥有私钥的一方是实际签署它的一方。

JWT 是如何创建的?

它是一系列规格的一部分:JOSE 系列。

JOSE 代表 JSON 对象签名和加密。 JWT 是这个规范系列的一部分,代表令牌。您可以在下面看到该系列的其他规格:

  • JWT(JSON Web Tokens):代表令牌本身
  • JWS(JSON Web Signature):代表token的签名
  • JWE(JSON Web Encryption):表示用于加密令牌的签名
  • JWK(JSON Web Keys):代表签名的密钥
  • JWA(JSON Web Algorithms):表示用于签署令牌的算法

现在您已经了解了 JWT 是什么、它的用途以及何时使用它,让我们更深入地了解它的工作原理以及 JWT 的组件是什么。

JSON Web Token 的基本组件

JWT 具有由标头、有效负载和签名组成的基本结构。这三个部分由点分隔。所以它看起来像这样:header.payload.signature。让我们更好地了解这些部分!

标题

令牌的标头基本上是我们传递两条信息的地方:alg 告诉我们使用哪种算法来创建签名,typ 指示什么类型的令牌。

{
  "alg": "HS256",
  "typ": "JWT"
}

有效载荷

有效负载是我们可以找到身份验证数据(例如密码和电子邮件)的组件。

{
  "email": "name@example.com",
  "password": "agEastvIders"
}

签名

令牌签名是通过对标头和有效负载加上密钥进行编码而生成的,并由标头中指定的算法生成。

HS256SHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret_key)

结果是三个点分隔的字符串,可以在 HTML 环境和 HTTP 协议中轻松使用。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJlbWFpbCI6Im5hbWVAZXhhbXBsZS5jb20iLCJwYXNzd29yZCI6ImFnRWFzdHZJZGVycyJ9.
stLcZmJGIeGXw_HY9c8A28E9n-B-GLsXYZABCuNA0XA

创建 JWT 令牌

首先,让我们在您想要的目录中创建一个名为 jwt 的文件夹。 使用您选择的名称创建一个 javascript 文件,我使用的是 index.js。

然后,安装您选择的 jwt 库。 有几个库可以帮助您生成 JWT。 我将使用最流行的 jsonwebtoken 之一,但您可以随意探索其他选项。

第一步是在我们的文件中导入 lib:

const jwt = require('jsonwebtoken');

现在我们创建我们的密钥。 这个想法是只有您知道您的密钥,并且很难进行恶意攻击。 但它实际上可以是您选择的任何字符串。 这是我的样子:

const secretKey = 'Oa1tz8arFmnXURkg4aJQ';

现在让我们使用 sign 方法创建我们的令牌。 此方法按此顺序接受有效负载、密钥和标头作为参数。

const myToken = jwt.sign(
  {
    email: "name@example.com",
    password: "agEastvIders",
  },
  secretKey,
  {
    expiresIn: "1y",
    subject: "1",
  }
);

对于这个 JWT,我在有效负载中输入了电子邮件和密码; 我的密钥; 在标题中,我输入了一个主题,在这个例子的库中,它就像一个 id。 另外我是说我们的代币将在 1 年内到期。 默认情况下,加密算法为 HS256。

现在,如果我们将此令牌记录到终端,我们应该会看到以下内容:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im5hbWVAZXhhbXBsZS5jb20iLCJwYXNzd29yZCI6ImFnRWFzdHZJZGVycyIsImlhdCI6MTY2MTU0ODMwNCwiZXhwIjoxNjkzMTA1OTA0LCJzdWIiOiIxIn0.bYWpwadW8xgstrSydwpnGnQExYuFxLMBh3JQRvtEPmw

验证我们的 JWT 令牌

为了验证我们的令牌,我们可以使用 jsonwebtoken 库本身中的一个方法,称为 decode 传递生成的令牌。

const generatedToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im5hbWVAZXhhbXBsZS5jb20iLCJwYXNzd29yZCI6ImFnRWFzdHZJZGVycyIsImlhdCI6MTY2MTU0ODMwNCwiZXhwIjoxNjkzMTA1OTA0LCJzdWIiOiIxIn0.bYWpwadW8xgstrSydwpnGnQExYuFxLMBh3JQRvtEPmw';console.log(jwt.decode(generatedToken))

代码的输出是:

{
  email:"name@example.com",
  password:"agEastvIders",
  iat:1661548304,
  exp:1693105904,
  sub:"1"
}

其中 iat、exp 和 sub 参数分别是创建和过期日期,采用 UTC 格式,创建令牌的时间和过期时间,以及我们在代码中传递的值为 1 的主题。

现在,您可能会问自己,“既然我知道 JSON Web Token 是什么以及它是如何工作的,那么如何在我的前端应用程序中使用它?”

使用令牌进行身份验证

想象一下,您是一名开发人员,正在为一家银行创建应用程序的前端。 例如,在登录页面上,您获取用户数据并使用 fetch 将其发送到 API。

fetch(`${baseUrl}/auth/login`, {
  method: "POST",
  headers: {
    "Content Type": "application/json",
  },
  body: user,
})
.then((res) => {
  ...
})
.catch((err) => {
  ...
});

服务器将获取此数据并返回一个标识该用户的令牌。现在,每次该用户登录平台时,他都会进行身份验证,如果数据一切正常,他将被授权访问应用程序的某些区域,例如查看余额。通常这种加密和令牌生成由后端完成,但您需要确保此登录用户可以继续访问应用程序的其他区域。

您还可以将令牌保存在浏览器的会话存储或本地存储中,以确保只要令牌没有过期,用户就会保持登录到应用程序。此外,重要的是,在登录时,用户会被重定向到主页,在那里他可以看到应用程序的其他功能。

例如,当此用户尝试访问显示其余额的页面时,您可以发出请求,使用 fetch 在标头中传递带有生成令牌的“授权”字段。这将导致服务器检查是否允许用户访问该特定页面。

fetch(`${baseUrl}/balance`, {
  headers: {
    "Authorization": Token,
  }
})
.then((res) => {
  ...
})
.catch((err) => {
  ...
});

结论

在本文中,您了解了 JSON Web 令牌是什么、它们的用途、它们的组件是什么以及如何在您的应用程序中使用它们。 您还了解了如何在前端应用程序中使用令牌进行用户身份验证。

谢谢阅读! 喜欢我的内容请关注我,欢迎互动。 祝你有美好的一天,很快再见!

关注七爪网,获取更多APP/小程序/网站源码资源!

创业项目群,学习操作 18个小项目,添加 微信:790838556  备注:小项目

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 zoodoho@qq.com举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.zoodoho.com/33462.html