Проблема с получением сертификата / секрета для аутентификации JWT. (Узел / Экспресс / C # / IdentityServer) - PullRequest
0 голосов
/ 15 мая 2018

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

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

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

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

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

Я получаю эту ошибку -

Ошибка: ошибка: 0906D06C: процедуры PEM: PEM_read_bio: без начальной строки

Я делаю эту проверку в промежуточном программном обеспечении, чтобы все конечные точки поразили его. Я видел эту проблему - 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();
})

v2 - (используя случайный текст в качестве сертификата и получая эту ошибку)

Ошибка: ошибка: 0906D06C: процедуры PEM: PEM_read_bio: нет начальной строки

App.js

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 secret = new Buffer('newsecret').toString('base64')
        var decoded = jwt2.decode(token, secret);
        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 голосов
/ 30 мая 2018

Я немного копаю и вот мое расследование:

Из node-jsonwebtoken docs ваш секретный ключ должен быть действительным закрытым ключом.

secretOrPrivateKey - это строка, буфер или объект, содержащий секрет для алгоритмов HMAC или PEM-закодированный закрытый ключ для RSA и ECDSA. В случае закрытого ключа с парольной фразой объект {ключ, passphrase} может использоваться (на основе крипто документации), в этом случае не забудьте передать параметр алгоритма

Кроме того, будет лучше указать 'RS256' в качестве третьего параметра в encode и decode функции.

Оформить заказ ниже образец кода:

app.js

var jwt = require('jwt-simple');
var fs = require('fs')
var payload = { foo: 'bar' };
var secret = fs.readFileSync(__dirname + '/private.key');
var token = jwt.encode(payload, secret, 'RS256');
console.log(token);

var decoded = jwt.decode(token, secret, 'RS256');
console.log(decoded);

исполнение:

$ node app.js
  eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.SKLxSFErngKdXEYQOP5faOZXHe2N_2EG1KjesPWKaZVvV6m5vTA_n77Y0K4x3ngCFQhv_CCwnAaK8BeBChgs5JUW9nMqnpTl73GkJLTzICC1Kl2hiH9724JuDyweAwoUsMntxFWMDhERhBPehHi10LZbH2BINmO-xxuLkMeemL0
{ foo: 'bar' }

образец личного ключа:

-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCGMBPo1UPwep2kHj1auLvyi6tJwwf/BS6rv3dDlwyXcQq4fLY4 ldNc+FOpYOKQF33ZltmNkmi2IQukNKZtzJtFyMRNARXIcttTARGL6NIfsYU80kmB RCXjTc3rt088fmxij9HiXFQSpraKrt86ZQXnnkJyEGsQNuftm7yF7A3MOwIDAQAB AoGAGGuxg+MkHSTDgbW7JsKN+eMvRhpHX0L7LmiG9PcNZJY/BDo2E3A46ieLWjz2 npCX57yLVTd69QJokva9/yeIblQpOIXw1U5PlID5mgjTTxJNzLPbXxjuWixZXKJ3 VHZXIAktbM36jdBj5gpxPmWgHa1+572pkx60QIXppKm+8AkCQQDHhQLpP3Z1Mq28 tnoL1NE9Ytxs0DHBkvWEFIbbPhhLPVMWLpCKuh92fNuTQrajMZtQOabaqz/ARI4u Ty8uyM0lAkEArCyJaH2rRxFZuT7zrQKhuG9pDb/SDAplDEA1iREZmpWV4ClBN+7+ kMEypx7jz5kdlhN/y4oCS/BAaJgaoc3l3wJBAJBTMDLnfFn0yeZ7nTdXv/AGxmpU A9oB42Wir5aCiXJLrwGZt2cSkdXVJcSVeqX8KVxUB9WgEOKU9MCc+QV/rZ0CQBzE XDkPNjzrkzg2YnR3yhmM09quQCQu4G9JkyhRqRuA/sezXOhBkFsTTKlLqfiXtq/K lkGlz3hsrfZL47dBNbUCQQDHUPfaAXQdbAns9O6s0wwXncaKo1r4QU4ZOQOc3mM0 e15fW/Ya22J2z9DUx8lNwMnoGzqBcVEPdHnFqbUJPZsw -----END RSA PRIVATE KEY-----

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...