【问题标题】:hapi-auth-jwt2 works is not working in hapi.js app?hapi-auth-jwt2 作品在 hapi.js 应用程序中不起作用?
【发布时间】:2020-04-26 02:03:06
【问题描述】:

我刚刚开始学习hapi.js。我正在尝试理解身份验证的代码。这是如何工作的。为此,我关注了hapi-auth-jwt2

之后,当我从邮递员那里调用 API 时,我没有得到任何输出。

这是我的server.js 文件,我运行node server.js

'use strict';

const Hapi = require('@hapi/hapi');
const jwt = require('jsonwebtoken');
const people = {
  1: {
       id: 1,
       name: 'Jen Jones'
  }
};

// bring your own validation function
const validate = async function (decoded, request, h) {
  // do your checks to see if the person is valid    
  if (!people[decoded.id]) {
      return { isValid: false };
  }
  else {
      return { isValid: true };
  }
};

const init = async () => {
  const server = Hapi.server({
      port: 3000,
      host: 'localhost'
  });
  await server.register(require('hapi-auth-jwt2'));
  server.auth.strategy('test', 'jwt',
      {
          key: 'GSFDSFJDSKGJD;GJRTWERIUEWFJDKL;GVCXVNMXCVCNVS;DLGFJKGFJDHGJFKHGJERHTKERHERJHTKREHJ', // Random String
          validate,
          verifyOptions: { algorithms: ['HS256'] }
    });
  server.auth.default('test');


  server.route([
    {
        method: 'GET',
        path: '/restricted',
        config: {
            auth: 'test'
        },
        handler: function (request, h) {
            console.log("request.headers.authorization ::: ", request.headers.authorization);
            const response = h.response({ text: 'You used a Token!' });
            response.header("Authorization", request.headers.authorization);
            return response;
        }
    }
  ]);


  await server.start();
  return server;
};

process.on('unhandledRejection', (err) => {

  console.log(err);
  process.exit(1);
});

init().then(server => {
  console.log('Server running at:', server.info.uri);
})
.catch(err => {
   console.log(err);
});

来自邮递员

【问题讨论】:

    标签: node.js authentication hapi.js


    【解决方案1】:

    您需要使用以下(秘密)密钥为每个用户 (people) 创建一个令牌:

    const jwt = require('jsonwebtoken');
    
    (async() => {
      const key = 'GSFDSFJDSKGJD;GJRTWERIUEWFJDKL;GVCXVNMXCVCNVS;DLGFJKGFJDHGJFKHGJERHTKERHERJHTKREHJ';
      const payload = { id: 1, name: 'Jen Jones' };
      const token = await jwt.sign(payload, key);
      console.log(token);
    })();
    

    这是给定有效负载的令牌:

    $ node auth.js
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibmFtZSI6IkplbiBKb25lcyIsImlhdCI6MTU3ODQ5MzQwOH0._kFvxkURRmzq4DgAEzAURca9yIv6KCf7MsolCiWsmRY
    

    令牌包含有效负载,在validate 中再次检查,使用相同的密钥(实际上只需id 就足够了)。现在使用用户{ id: 1, name: 'Jen Jones' } 的令牌访问受限路由:

    $ curl -v -H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibmFtZSI6IkplbiBKb25lcyIsImlhdCI6MTU3ODQ5MzQwOH0._kFvxkURRmzq4DgAEzAURca9yIv6KCf7MsolCiWsmRY"   http://localhost:3000/restricted
    *   Trying 127.0.0.1...
    * TCP_NODELAY set
    * Connected to localhost (127.0.0.1) port 3000 (#0)
    > GET /restricted HTTP/1.1
    > Host: localhost:3000
    > User-Agent: curl/7.58.0
    > Accept: */*
    > Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibmFtZSI6IkplbiBKb25lcyIsImlhdCI6MTU3ODQ5MzQwOH0._kFvxkURRmzq4DgAEzAURca9yIv6KCf7MsolCiWsmRY
    > 
    < HTTP/1.1 200 OK
    < authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibmFtZSI6IkplbiBKb25lcyIsImlhdCI6MTU3ODQ5MzQwOH0._kFvxkURRmzq4DgAEzAURca9yIv6KCf7MsolCiWsmRY
    < content-type: application/json; charset=utf-8
    < cache-control: no-cache
    < content-length: 28
    < accept-ranges: bytes
    < Date: Wed, 08 Jan 2020 14:26:04 GMT
    < Connection: keep-alive
    < 
    * Connection #0 to host localhost left intact
    {"text":"You used a Token!"}
    

    【讨论】:

    • 嘿@pzaenger,我希望你做得很好。我检查了你的答案,它对我来说很好。感谢您的回答并向我解释它是如何工作的。除了validate 函数,我最了解代码。我的查询是,我只是调用 validate 函数而不传递 3 个参数。那么它是如何知道参数以及如何解码令牌的呢?
    • 我的理解是我们已经定义了server.auth.strategy('test',...,其中包括key。我们还设置了server.auth.default('test');,所以当任何身份验证将执行时,它可以直接从default 访问密钥。这样应用程序就可以直接decode 令牌。如果我走错了方向,请告诉我。
    • 很高兴,我可以帮助你:) 你的解释很好,基本上是正确的。也许看看source code 及其文档可以帮助您完全理解它。
    【解决方案2】:

    身份验证方案(例如 hapi-auth-jwt2 插件/模块)的关键目标之一是尽早拒绝对给定路由的任何请求,以避免消耗服务器上的资源。 因此,任何没有有效 JWT 的请求都将被拒绝,并且永远不会到达验证函数。

    要查看任何类型的 console.log,您需要发送带有 JWT 标头、cookie 或查询参数的格式良好的 http 请求。

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多