hapi-auth-jwt2 работает не работает в приложении hapi. js? - PullRequest
1 голос
/ 08 января 2020

Я только начал изучать хапи. 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);
});

От почтальона

iamge

1 Ответ

1 голос
/ 08 января 2020

Вам потребуется создать токен для каждого пользователя (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!"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...