在 Web 开发中,认证(authentication)是非常重要的一个环节。Hapi 是一个流行的 Node.js Web 框架,也提供了认证插件 Hapi-auth-basic,本文将详细介绍其用法和原理。
Hapi-auth-basic 的使用
Hapi-auth-basic 是一个 Hapi 的认证插件,用于基本身份认证(basic authentication)。在 Hapi 的路由配置中,可以通过 auth: 'basic'
将该路由设置为需要身份认证的,具体示例代码如下:
// javascriptcn.com 代码示例 const Hapi = require('@hapi/hapi'); const users = { john: { username: 'john', password: 'password123', name: 'John Doe', } }; const init = async () => { const server = Hapi.server({ port: 3000, host: 'localhost' }); await server.register(require('@hapi/basic')); server.auth.strategy('simple', 'basic', { validate: async (request, username, password) => { const user = users[username]; if (!user) { return { isValid: false }; } const isValid = password === user.password; return { isValid, credentials: { name: user.name } }; }}); server.route({ method: 'GET', path: '/', handler: (request, h) => { return 'Hello World!'; }, options: { auth: 'simple' } }); await server.start(); console.log('Server running on %s', server.info.uri); }; init();
在以上示例代码中,我们定义了一个 users 对象,其包含一个用户名为 john 的用户和该用户的密码。在 Hapi server 的 validate
回调函数中,我们判断了传入的用户名是否在 users 对象中,若不存在则返回 { isValid: false }
,否则判断传入的密码是否与用户的密码相等,若相等则返回 { isValid: true, credentials: {name: user.name} }
,其中 credentials 对应的是该用户访问该路由的凭证。在路由配置中,我们将该路由的 auth 配置设置为 'simple',即使用我们刚刚定义的身份认证策略。
Hapi-auth-basic 的原理
Hapi-auth-basic 插件实际上是从 HTTP Basic 认证协议中得到启发,HTTP Basic 认证协议定义了一种用于 Web 认证的协议。当客户端向服务器请求需要认证的资源时,服务器会向客户端发送一个 401 Unauthorized
的响应,并附带一个 WWW-Authenticate
头,告诉客户端需要的认证方式,如下所示:
HTTP/1.1 401 Unauthorized WWW-Authenticate: Basic realm="Secure Area"
在接收到服务器的 401 Unauthorized
响应后,客户端会自动弹出登录框,要求用户输入用户名和密码。客户端会将用户名和密码封装到 HTTP 请求头部的 Authorization 字段中发送给服务器,格式如下所示:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
其中 QWxhZGRpbjpvcGVuIHNlc2FtZQ==
是将用户名和密码按分割符 :
连接后再进行 Base64 编码得到的字符串。
Hapi-auth-basic 插件在服务器收到请求后,会首先从请求头部的 Authorization 字段中获取用户名和密码,然后通过 validate 回调函数进行验证。如果验证通过,则认为该用户通过身份认证,否则返回 401 Unauthorized
响应。
总结
通过本文的介绍,我们了解到了 Hapi-auth-basic 插件的使用和原理,也了解到了 HTTP Basic 认证协议的一些基本概念。在进行 Web 开发中,认证作为安全的基础,非常重要,而 Hapi 提供的 Hapi-auth-basic 插件则为我们提供了一个方便的身份认证解决方案。希望本文能对大家有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65420fb77d4982a6ebbb538a