资讯专栏INFORMATION COLUMN

hapi入门之Authentication篇

wupengyu / 2585人阅读

摘要:里面的验证是基于和这两个概念的。另一方面,是一个预先配置的命名的实例。注册了一个插件该插件创建了一个命名为的。执行上述文件,访问。在弹出的登录框中输入用户名及密码,页面将展示如果报错,可使用模块替代,其余代码无需改变。

hapi里面的Authentication(验证)是基于scheme和strategies这两个概念的。
你可以把scheme理解为一个通用型的验证,是那种基础的,概要的的描述。
另一方面,strategy是一个预先配置的、命名的scheme实例。

为了更好地理解hapi中的Authentication,请看下面这个示例:

"use strict";

const Bcrypt = require("bcrypt");
const Hapi = require("hapi");
const Basic = require("hapi-auth-basic");

const server = new Hapi.Server();
server.connection({ port: 3000 });

const users = {
    john: {
        username: "john",
        password: "$2a$10$iqJSHD.BGr0E2IxQwYgJmeP3NvhPrXAeLSaGCj6IR/XU5QtjVu5Tm",   // "secret"
        name: "John Doe",
        id: "2133d32a"
    }
};

const validate = function (request, username, password, callback) {
    const user = users[username];
    if (!user) {
        return callback(null, false);
    }

    Bcrypt.compare(password, user.password, (err, isValid) => {
        callback(err, isValid, { id: user.id, name: user.name });
    });
};

server.register(Basic, (err) => {

    if (err) {
        throw err;
    }

    server.auth.strategy("simple", "basic", { validateFunc: validate });
    server.route({
        method: "GET",
        path: "/",
        config: {
            auth: "simple",
            handler: function (request, reply) {
                reply("hello, " + request.auth.credentials.name);
            }
        }
    });

    server.start((err) => {

        if (err) {
            throw err;
        }

        console.log("server running at: " + server.info.uri);
    });
});

上述代码做了如下几个操作:

定义了一个用户数据信息,包括用户名、密码等信息。
定义了一个验证函数,它是针对于hapi-auth-basic具体实现的一个功能,允许我们去验证用户提供给我们的凭证。
注册了一个插件(hapi-auth-basic),该插件创建了一个命名为basic的scheme。
执行上述文件,访问localhost:3000。在弹出的登录框中输入用户名及密码,页面将展示:hello, John Doe
tip:如果npm install bcrypt报错,可使用bcryptjs模块替代bcrypt,其余代码无需改变。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82561.html

相关文章

  • hapi入门文档

    摘要:对象包含服务器范围或者插件特定状态,该状态可以通过不同方法被分享。举个例子,当调用方法,有效的属性被路由和同一级别的拓展设置。当服务对象作为一个插件注册参数提供时,提供传递给方法的注册偏好。 server.realmrealm对象包含服务器范围或者插件特定状态,该状态可以通过不同方法被分享。举个例子,当调用server.bind()方法,有效的realm setting.bind属性被...

    Tamic 评论0 收藏0
  • hapi框架搭建记录(一):初始化项目

    摘要:框架,用官网的简介来说就是是构建应用程序和服务的丰富框架,它使开发人员能够专注于编写可重用的应用程序逻辑,而不是花时间构建基础设施。用自己的话简单来说,就是个类似,之类的服务基础框架。同时全局环境直接获取。 showImg(https://segmentfault.com/img/bVbrV3m?w=572&h=350); hapi框架,用官网的简介来说就是:Hapi是构建应用程序和...

    aristark 评论0 收藏0
  • hapi框架搭建记录(二):路由改造和生成接口文档

    摘要:框架,用官网的简介来说就是是构建应用程序和服务的丰富框架,它使开发人员能够专注于编写可重用的应用程序逻辑,而不是花时间构建基础设施。用自己的话简单来说,就是个类似,之类的服务基础框架。 showImg(https://segmentfault.com/img/bVbrV3m?w=572&h=350); hapi框架,用官网的简介来说就是:Hapi是构建应用程序和服务的丰富框架,它使开...

    opengps 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<