npm 包 @magneds/hapi-plugin 使用教程

前言

在前端开发中,构建 Node.js 应用程序时,常常需要使用到各种 npm 包来提高开发效率,加速项目的进度。而 @magneds/hapi-plugin 是一个功能强大、易于使用的 npm 包,它可以帮助我们轻松地在 Hapi 中实现身份验证功能。在本文中,我们将详细介绍 @magneds/hapi-plugin 的使用方法,以及如何在项目中正确地集成它。

安装

使用 @magneds/hapi-plugin 包之前,需要先安装它。可以通过下面的命令来完成安装:

npm install @magneds/hapi-plugin --save

使用

安装成功后,在你的项目中引入 @magneds/hapi-plugin:

const Hapi = require('@hapi/hapi');
const auth = require('@magneds/hapi-plugin');

const server = new Hapi.Server({
    port: 3000,
    host: 'localhost'
});

(async () => {
    await server.register(auth);

    server.route({
        method: 'GET',
        path: '/',
        handler: (request, h) => {
            return 'Hello World!';
        }
    });

    await server.start();
    console.log('Server running on %s', server.info.uri);
})();

上面的例子演示了如何在 Hapi 中引入 @magneds/hapi-plugin,并注册到服务器实例中。在这之后,就可以在路由配置中使用它了。

server.route({
    method: 'GET',
    path: '/profile',
    config: {
        auth: 'jwt',
        handler: (request, h) => {
            return 'Hello, ' + request.auth.credentials.name;
        }
    }
});

在这个例子中,我们在路由配置中使用了 @magneds/hapi-plugin 提供的身份验证功能。这里通过设置 auth 参数的值为 jwt,来启用 JWT 验证方式。在这个路由被访问时,Hapi 会自动根据请求头中的 JWT Token,获取到当前用户的身份信息,并将之存储到 request.auth 对象中,以便后续的逻辑中使用。

配置选项

@magneds/hapi-plugin 提供了多个选项,可以帮助我们进行个性化的配置。以下是它支持的配置项:

  • secret:JWT 签名所需的密钥,需确保该密钥的安全性
  • algorithm:JWT 签名所使用的算法,默认为 HS256
  • audience:JWT 的预期受众,表示这个 JWT 面向的对象是谁,一般是一个字符串或 URL
  • issuer:JWT 发行人,一般是一个字符串或 URL
  • cookieName:JWT 在 cookie 中存储时的名字,用于实现基于 cookie 的身份验证
  • tokenType:JWT Token 的类型,可以为 Bearer,JWT 等

示例

下面我们通过一个完整的示例来演示在 Hapi 中使用 @magneds/hapi-plugin 进行身份验证的具体流程。

'use strict';

const Hapi = require('@hapi/hapi');
const auth = require('@magneds/hapi-plugin');
const jwt = require('jsonwebtoken');

const users = {
    1: {
        id: 1,
        name: 'Alice'
    },
    2: {
        id: 2,
        name: 'Bob'
    }
};

const secret = 'my_secret';

(async () => {
    const server = new Hapi.Server({
        port: 8000,
        host: 'localhost'
    });

    await server.register(auth);

    server.route({
        method: 'POST',
        path: '/login',
        handler: (request, h) => {
            // 获取用户名和密码
            const { name, password } = request.payload;
            const user = Object.values(users).find(u => u.name === name);
            // 验证用户名和密码
            if (!user || password !== 'password') {
                return {
                    statusCode: 400,
                    error: 'Bad Request',
                    message: 'Invalid username or password'
                };
            }
            // 验证成功,生成 JWT Token
            const token = jwt.sign({
                sub: user.id,
                name: user.name
            }, secret, {
                expiresIn: '1h',
                algorithm: 'HS256',
                audience: 'http://localhost:8000',
                issuer: 'http://localhost:8000'
            });
            // 将 Token 存储到 Cookie 中
            const cookieOptions = {
                ttl: 60 * 60 * 1000, // 1 hour
                encoding: 'none',
                isSecure: false,
                isHttpOnly: false,
                clearInvalid: false,
                strictHeader: true
            };
            request.cookieAuth.set({ token });
            return h.response({ message: 'Login success' }).state('token', token, cookieOptions);
        }
    });

    server.route({
        method: 'GET',
        path: '/profile',
        config: {
            auth: {
                mode: 'required',
                strategy: 'jwt'
            },
            handler: (request, h) => {
                return 'Hello, ' + request.auth.credentials.name;
            }
        }
    });

    await server.start();
    console.log(`Server running on ${server.info.uri}`);
})();

在这个示例中,我们首先定义了一个数组 users,模拟了系统中的用户信息。然后在 /login 路由中,用户输入用户名密码后,服务器会根据输入的信息验证用户身份。如果验证成功,服务器会生成一个 JWT Token,将其保存到 Cookie 中,并返回给用户。在 /profile 路由中,通过 auth 配置项,可以对该路由进行身份验证。如果请求头中没有携带有效的 JWT Token,则该路由会返回 401 Unauthorized 的错误响应,否则则输出用户名。

结语

本文详细介绍了 @magneds/hapi-plugin 的使用方法和配置选项,并通过示例代码演示了如何在 Hapi 中使用该插件进行身份验证。希望通过本文的分析,读者能够深入了解该插件的背景和原理,并在实际开发中运用其提供的功能,以提高开发效率。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/600673e2fb81d47349e53da9


纠错
反馈