【问题标题】:When hapi-auth-basic validate function gets called当 hapi-auth-basic 验证函数被调用时
【发布时间】:2026-01-21 15:30:01
【问题描述】:

我正在使用带有 hapi-auth-basic 的 hapijs,并尝试使用节点检查器进行调试。

在 github 页面上实现的示例稍作修改,要求在 /login 路径上进行基本身份验证,而不是全部获取:

const validate = function(username, password, callback) {
  const user = users['john']; //john exists in a user array
  if (!user) {
    return callback(null, false);
  }
  callback(null, true, {
    id: user.id,
    name: user.name
  });
};
...
server.register(require('hapi-auth-basic'), (err) => {
  server.auth.strategy('simple', 'basic', {
    validateFunc: validate
  });
});

{
  method: 'POST',
  path: '/login',
  config: {
    auth: 'simple',
    handler: require('../../public/api/handlers/login.js')
  }
}

所有其他路由都设置为 auth: false。 我知道它应用了“简单”策略,因为如果我将 /login 的 auth 设置为 false,我会在 login.js 文件中遇到断点。

问题是我在调用时收到 401,但我从未在 validate 函数中遇到断点。

编辑: 标头由客户端发送为:

Accept:*/*
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:accept, content-type
Access-Control-Request-Method:POST 
Connection:keep-alive
Host:localhost:3000 
Origin:http://mac.local:3000
Referer:http://mac.local:3000/ User-Agent:Mozilla/5.0
(Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36

内容为:

{"email":"a.b@com","password":"xcvx"}

我可能误解的是基本身份验证中的步骤。作为登录 POST,我是否需要发送 Authorization 标头?我认为这个页面会发送要处理的有效负载,然后如果成功,所有其他请求都会传递一些令牌,比如 jwt,包括一个 Authorization 标头。

我正在测试 aurelia-auth。制作call 的方法似乎没有设置任何标题。我需要配置任何设置吗?

【问题讨论】:

  • 你的验证函数在这里被调用:github.com/hapijs/hapi-auth-basic/blob/master/lib/index.js#L65。也许您的 401 来自该文件的较早部分。您是否缺少授权标头或格式不正确?你是如何提出要求的?浏览器?你能提供一个完整的代码示例来说明这个问题吗?
  • @MattHarrison 你是对的。缺少授权标头。 github.com/hapijs/hapi-auth-basic/blob/master/lib/index.js#L37 正在寻找一个。需要检查为什么客户不包括一个并更新问题。谢谢

标签: javascript node.js hapijs aurelia-auth


【解决方案1】:

我发现了我的问题。

  1. 我尝试使用 hapi-auth-basic 验证“登录”POST。这意味着它需要先前设置的身份验证密钥。但它不应该那样工作。您在有效负载中发送用户名和密码,依靠 https 来覆盖您的踪迹。然后服务器说 OK 并用您的加密标识发回 auth 标头。然后,您可以使用此标头对“受限”区域进行任何调用。

  2. 我无缘无故地将“jwt”方式与“基本”方式结合在一起。

还有第 3 课。阅读 github 源代码!

【讨论】: