随着互联网应用的发展,越来越多的应用需要进行用户认证才能提供更安全的服务。JSON Web Token (JWT) 是一种用于认证的开放标准,它可以让应用进行无状态的、基于令牌的认证。在本文中,我们将探讨如何在 Deno 中使用 JWT 进行用户认证,包括实现和示例代码。
什么是 JWT?
JWT 是一种轻量级的、无状态的标准,由三部分组成:头部、载荷和签名。下面是一个 JWT 的实例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWT 的头部包含两部分信息:令牌的类型和使用的加密算法。载荷包含声明,例如用户 ID 或其他信息。签名则使用密钥进行计算,以确保数据的完整性和安全性。
JWT 的优点在于可以让应用进行无状态的认证。每个请求都包含了令牌,这样应用就可以根据令牌进行认证,而无需保持会话状态。另外,JWT 还允许客户端使用密钥进行加密和解密,从而确保数据的机密性。
如何在 Deno 中使用 JWT?
在使用 JWT 进行认证之前,我们需要先安装 Deno 和一个用于处理 JWT 的模块。Deno 是一个安全、现代化的 JavaScript 和 TypeScript 运行时,而 JWT 模块则可以让我们轻松地生成和验证 JWT 令牌。
安装 Deno:
$ curl -fsSL https://deno.land/x/install/install.sh | sh
安装 JWT 模块:
$ deno install --allow-read --allow-write --name=jwt https://deno.land/x/djwt/cli.ts
安装完成后,我们就可以使用 JWT 进行用户认证了。下面是一个示例程序:
// www.javascriptcn.com code example
import { Application, Router } from 'https://deno.land/x/oak/mod.ts';
import { makeJwt, setExpiration, Jose, Payload } from 'https://deno.land/x/djwt/create.ts';
import { validateJwt } from 'https://deno.land/x/djwt/validate.ts';
import key from './key.ts';
const app = new Application();
const router = new Router();
const header: Jose = {
alg: 'HS256',
typ: 'JWT',
};
router
.post('/login', async (ctx) => {
const { value } = await ctx.request.body();
const user = { id: '1234', name: 'John Doe' };
if (value.username === 'john' && value.password === 'doe') {
const payload: Payload = {
iss: 'localhost',
aud: 'example.com',
exp: setExpiration(new Date().getTime() + 30000),
sub: user.id,
name: user.name,
};
ctx.response.body = {
token: makeJwt({ key, header, payload }),
};
} else {
ctx.response.body = { message: 'Invalid credentials' };
ctx.response.status = 401;
}
})
.get('/protected', async (ctx) => {
const headers = ctx.request.headers;
const authHeader = headers.get('Authorization');
if (authHeader) {
const token = authHeader.split(' ')[1];
const jwtValidation = await validateJwt(token, key, { isThrowing: false });
if (jwtValidation.isValid) {
ctx.response.body = { message: 'Hello, ' + jwtValidation.payload.name + '!' };
} else {
ctx.response.body = { message: 'Invalid token' };
ctx.response.status = 401;
}
} else {
ctx.response.body = { message: 'Authorization header not found' };
ctx.response.status = 401;
}
});
app.use(router.routes());
app.use(router.allowedMethods());
console.log('Listening on http://localhost:8000');
await app.listen({ port: 8000 });这个示例程序使用 Oak 框架来创建 HTTP 服务器,并定义了两个路由:/login 和 /protected。当用户访问 /login 路由时,程序会检查用户名和密码是否正确,如果正确,则生成一个 JWT 令牌并返回给客户端。客户端可以存储这个令牌,并在每个请求中将其作为 Authorization 请求头发送给服务器。
当用户访问 /protected 路由时,程序会检查是否有 Authorization 请求头,并从中提取 JWT 令牌。然后,程序会使用密钥来验证令牌的完整性和有效性,并根据令牌中的信息来执行相应的操作。在这个示例程序中,程序会检查令牌中的 name 值,并用它来向客户端发送一条欢迎消息。
总结
通过本文,我们学习了如何在 Deno 中使用 JWT 进行用户认证。我们了解了 JWT 的优点以及如何安装和使用 JWT 模块。最后,我们还编写了一个基于 Oak 框架的示例程序,展示了如何在 Deno 中实现基本的用户认证功能。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/64a6acfe48841e98943515fa