你有没有参加过必须出示身份证才能证明你是买票的人的活动? 索要身份的行为是一种身份验证形式,以便您获得进入的授权。
在网络上,这个过程以类似的方式工作。 为了请求某些服务或访问特定页面,您需要以某种方式表明自己的身份,并且这种身份证明必须是安全且唯一的。
在本文中,您将了解 JWT(“json Web Tokens”的首字母缩写词)标准是用于身份验证的,它在 Web 上被广泛使用。
什么是令牌?
如今,我们经常听到与 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 备注:小项目!
如若转载,请注明出处:https://www.zoodoho.com/33462.html
