使用 Token 进行认证是现代 Web 应用程序的主要方式之一。它可以很好的解耦身份验证和认证逻辑,允许从不同的系统上获取到访问令牌,这些系统可以是 OAuth 2.0 身份验证、自定义身份验证逻辑和第三方认证等。在 Hapi 框架中,我们可以使用 hapi-auth-token
插件来轻松地实现 Token 认证,本文将详细介绍该插件的使用方法。
安装和配置 hapi-auth-token
首先,我们需要安装 hapi-auth-token 插件:
npm install hapi-auth-token --save
在安装完成后,我们需要在 Hapi 应用程序中注册该插件。具体代码如下:
// javascriptcn.com 代码示例 const Hapi = require('@hapi/hapi'); const Token = require('hapi-auth-token'); const init = async () => { const server = new Hapi.Server({ port: 3000, host: 'localhost', }); server.register({ plugin: Token, options: { token: { secret: 'supersecretkey', }, }, }); await server.start(); console.log(`Server running on port ${server.info.uri}`); }; init();
在该示例代码中,我们将 hapi-auth-token
插件注册到 Hapi 应用程序中,使用 options
对象来配置插件。特别的,我们使用该对象中的 token.secret
属性传递一个用于签名 Token 的私钥。这个私钥必须保持机密性,不要分享给其他人。
生成 Token
在 Hapi 应用程序中,我们可以使用 hapi-auth-token
插件中的 Token.generate()
方法来生成 Token。以下是一个生成 Token 的例子:
const token = Token.generate({ sub: '12345', exp: '1h', jti: 'unique_token_id', }); console.log(token); // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NSIsImV4cCI6IjFoIiwianRpIjoidW5pcXVlX3Rva2VuX2lkIn0.KQzgVsosxUEbrKzgG9XVg82f6-IX7pU5MVfU5C5b5WA
在以上代码中,我们通过 Token.generate()
方法生成了一个 Token,并在 sub
中传递了用户 Id,exp
中传递了 Token 的过期时间,以及 jti
中传递了 Token 的唯一标识。在生产中,建议使用 uuid 库生成唯一标识 jti。
验证 Token
在 Hapi 应用程序中,我们可以使用 hapi-auth-token
插件中的 Token.validate()
方法来验证 Token。以下是一个验证 Token 的例子:
// javascriptcn.com 代码示例 server.route({ method: 'GET', path: '/', config: { auth: 'token', handler: (request, h) => { return 'Hello World!'; }, }, }); Token.generate({ sub: '12345', exp: '1h', jti: 'unique_token_id', }) server.inject({ url: '/', method: 'get', headers: { authorization: `Bearer ${token}`, }, }, (res) => { console.log(res.result); // "Hello World!" });
在以上代码中,我们在 Hapi 应用程序中的路由配置对象中添加了一个 auth
属性,告诉 Hapi 使用 Token 验证用户身份。然后,在请求头添加了一个 Authorization
头并使用 Bearer 方式携带 Token。在 Hapi 应用程序处理请求时,它会自动验证 Token 的合法性并返回 “Hello World” 消息。
总结
在本文中,我们介绍了如何在 Hapi 框架中使用 hapi-auth-token
插件进行 Token 认证。通过使用该插件,我们可以轻松地在 Hapi 应用程序中实现身份验证和授权,使我们的应用程序更加安全。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654b4e567d4982a6eb533a26