Перед запуском сервера все плагины и т. Д. Регистрируются.Я создаю свою стратегию и устанавливаю JWT в качестве метода аутентификации по умолчанию для сервера.
await server.register(require('hapi-auth-jwt2'));
await server.register(require('~/utils/jwt-key-signer'));
server.auth.strategy(
'jwt', 'jwt',
{ key: process.env.API_KEY,
validate: true, // Temporarily using true
verifyOptions: { algorithms: [ 'HS256' ] }
});
server.auth.default('jwt');
Вот мой маршрут.Я передаю полезную нагрузку из запроса обработчика в плагин, который подписывает мой ключ и возвращает токен:
'use strict';
const Boom = require('boom');
exports.plugin = {
name: 'user-create',
register: (server, options) => {
server.route({
method: 'POST',
path: '/user/create',
options: { auth: 'jwt' },
handler: async (request, h) => {
const { payload } = await request;
const { JWTKeySigner } = await server.plugins;
const token = await JWTKeySigner.signKeyReturnToken(payload);
const cookie_options = {
ttl: 365 * 24 * 60 * 60 * 1000, // expires a year from today
encoding: 'none', // we already used JWT to encode
isSecure: true, // warm & fuzzy feelings
isHttpOnly: true, // prevent client alteration
clearInvalid: false, // remove invalid cookies
strictHeader: true // don't allow violations of RFC 6265
}
return h.response({text: 'You have been authenticated!'}).header("Authorization", token).state("token", token, cookie_options);
},
options: {
description: 'Creates a user with an email and password',
notes: 'Returns created user',
tags: ['api']
}
});
}
};
Вот как я подписываю свой ключ:
const jwt = require('jsonwebtoken');
exports.plugin = {
name: 'JWTKeySigner',
register: (server, options) => {
server.expose('signKeyReturnToken', async (payload) => {
jwt.sign(payload, process.env.API_KEY, { algorithm: 'HS256' }, async (err, token) => {
if (err) {
console.log(err)
}
await console.log(`TOKEN${token}`);
return token;
});
})
}
};
Затем я посещаю свой маршрутот Почтальона, затем передайте моего пользователя, который содержит адрес электронной почты и пароль, обратно в раунд как JSON, и вот такой ответ я получаю:
{
"statusCode": 401,
"error": "Unauthorized",
"message": "Missing authentication"
}
Хорошо, так что это доказывает, что мой маршрут успешно защищен.Теперь я продолжаю добавлять свой токен в Почтальон:
Затем я получаю эту ошибку:
{
"statusCode": 500,
"error": "Internal Server Error",
"message": "An internal server error occurred"
}
Если я удаляюТокен от почтальона, я получаю «несанкционированную» ошибку.
Все, что я пытаюсь сделать, это заблокировать внешний доступ к моему API и разрешить доступ только тем, у кого есть разрешение.Это будут обычные пользователи, которые регистрируются.
Когда я вставляю свой токен в JWT.io, я вижу свои данные в правой части страницы, но JWT говорит мне, что это неверная подпись.
Я бы очень признателеннекоторая ясность здесь.Я использую hapi-auth-jwt2.
Заранее спасибо