Сбой проверки подписи для JWT - узел / экспресс / identityServer / asp.net. - PullRequest
0 голосов
/ 24 мая 2018

У меня проблема с проверкой JWT на стороне сервера моего узла / экспресс-приложения.Токен создается в Identity Server в основном приложении asp.net.Сгенерированный токен имеет тип токена RS256, что означает, что при создании на Identity Server необходимо сгенерировать закрытый ключ и открытый ключ.Мне нужно получить действительный сертификат с действительной подписью.

На стороне клиента (Angular) я передаю токен Bearer на все запросы после входа в систему. Мне нужно как-то аутентифицировать этот токен.Способ сделать это с помощью типа токена RS256 - убедиться, что открытый ключ совпадает.Я использую

const jwt2 = require ('jwt-simple');

Для проверки JWT.

Проблема в секрете, вот документация jwt-simple ссылка jwt-simple .Если я сделаю третье значение в декодере ложным, он будет работать, потому что он игнорирует требуемый секрет / сертификат.

Я делаю эту проверку в промежуточном программном обеспечении, чтобы все конечные точки поразили его.Я видел эту проблему - SO Аналогичная проблема и запускал те же команды.Я все еще получаю сообщение об ошибке, потому что токен не имеет никакого отношения к сертификатам, потому что я получаю его из проекта Identity Server.Поэтому мне нужно получить сертификат открытого ключа из этого проекта.

Как я мог бы отправить этот сертификат в токен или каким-либо образом получить этот действительный сертификат?

v1 - (используя в качестве сертификата самозаверяющий server.crt и получая эту ошибку)

Ошибка: ошибка проверки подписи

App.js

//This is for a self-signed certificate locally with no correlation to the token itself.
const options = {
    key: fs.readFileSync('./key.pem', 'utf8'),
    cert: fs.readFileSync('./server.crt', 'utf8')
 };

app.use((req, res, next) => {
    if(!req.headers.authorization){
        return res.status(403).json({ error: 'No credentials sent!'});
    } else {
        let token = req.headers.authorization.split(' ')[1]

        var decoded = jwt.decode(token, options.cert);

        if(decoded){
            let currentTime = new Date().getTime()/1000
            if(decoded.exp <= currentTime){
                return res.status(403).json({
                    error: 'Token has expired'
                }); 
            }
        }
        else if(!decoded){
            return res.status(403).json({
                error: 'invalid token'
            }); 
        }
    }
    next();
})

Структура проанализированного токена JWT.io -

Заголовок

{
  "alg": "RS256",
  "kid": "1231231231231231231",
  "typ": "JWT",
  "x5t": "si7bdXd6......HnxhO4Wi_s"
}

Что я делаю с x5t?Извиняюсь за длинный пост.Спасибо.

1 Ответ

0 голосов
/ 24 мая 2018

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

Вам нужен какой-то другой механизм для совместного использования открытого ключа службы аутентификации.В зависимости от ваших требований к ротации ключей и того, как ваше приложение работает в целом, вы можете либо получить его по статическому пути / URL-адресу при запуске приложения, либо вы можете захотеть встроить механизм для периодической проверки обновленного действительного открытого ключа (s).

...