Неверный токен JWT вызывает 500 внутреннюю ошибку сервера - PullRequest
0 голосов
/ 22 февраля 2019

Перед запуском сервера все плагины и т. Д. Регистрируются.Я создаю свою стратегию и устанавливаю 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"
}

Хорошо, так что это доказывает, что мой маршрут успешно защищен.Теперь я продолжаю добавлять свой токен в Почтальон:

enter image description here

Затем я получаю эту ошибку:

{
    "statusCode": 500,
    "error": "Internal Server Error",
    "message": "An internal server error occurred"
}

Если я удаляюТокен от почтальона, я получаю «несанкционированную» ошибку.

Все, что я пытаюсь сделать, это заблокировать внешний доступ к моему API и разрешить доступ только тем, у кого есть разрешение.Это будут обычные пользователи, которые регистрируются.

Когда я вставляю свой токен в JWT.io, я вижу свои данные в правой части страницы, но JWT говорит мне, что это неверная подпись.

Я бы очень признателеннекоторая ясность здесь.Я использую hapi-auth-jwt2.

Заранее спасибо

1 Ответ

0 голосов
/ 25 февраля 2019

Хм, я писал вам другое сообщение, но затем я проверил документы hapi-auth-jwt2 для проверки параметров, и там написано:

validate - (required) the function which is run once the Token has been decoded with signature 
    async function(decoded, request, h) where:
    decoded - (required) is the decoded and verified JWT received in the request
    request - (required) is the original request received from the client
    h - (required) the response toolkit.
    Returns an object { isValid, credentials, response } where:
        isValid - true if the JWT was valid, otherwise false.
        credentials - (optional) alternative credentials to be set instead of decoded.
        response - (optional) If provided will be used immediately as a takeover response.

Просто попробуйте

server.auth.strategy(
    'jwt', 'jwt',
    { key: process.env.API_KEY,     
    validate: validate: () => ({isValid: true}),  // Temporarily using true          
    verifyOptions: { algorithms: [ 'HS256' ] }
});

Затемдавайте посмотрим, не исчезнет ли ошибка 500.

Возможно, что-то еще в вашем коде выдает ошибку.Вы включили отладку на вашем сервере?Вы должны увидеть подробности этой ошибки 500 в консоли вашего сервера.

...