У меня проблема с проверкой 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? Извиняюсь за длинный пост. Спасибо.