Пакет jsonwebtoken не может проверить результат пользователя Office.context.mailbox.getUserIdentityToken
Я разрабатываю веб-надстройку для Outlook.
Я пытаюсь проверить токен, который я передаю на сервер, через node.js
библиотека, но она терпит неудачу, и я не могу понять, почему.
Это то, что я делаю, чтобы получить токен пользователя.
Office.context.mailbox.getUserIdentityTokenAsync(function(result) {
result.value // contains the token.
// send this value to server side, which I can see that it's working.
})
На стороне сервера я получаю токен и делаю ниже:
token; // contains the token passed from the web-app.
const jwt = require('jsonwebtoken');
const request = require('request');
let decoded = jwt.decode(token, {complete: true});
// Get the key, we'll need this later since we'll have to
// find the matching key from the config file.
let key = decoded.header.x5t;
let amurl = JSON.parse(decoded.payload.appctx).amurl;
// Make a request to the url to get the configuration json file.
request(amurl, {}, (err, response, body) => {
let keys = JSON.parse(body).keys;
// Filter the keys so we get the one which we can verify.
let s = keys.filter(t => t.keyinfo.x5t === key);
let cert = s[0].keyvalue.value;
// Fails the verification.
console.log(jwt.verify(token, cert));
});
Просто чтобы уточнить, я правильно получаю токен, и этот пакет npm, кажется, работает нормально для других токенов jwt. (Так что это не совсем проблема конфигурации)
1 ответ
Теперь я нашел ответ на этот вопрос.
Просто повторить проблему было:
Office.context.mailbox.getUserIdentityToken
Метод возвращает токен jwt.- При расшифровке этот токен содержит
amurl
поле, которое указывает на публичный сертификат в виде текста. - когда
jsonwebtoken.verify(token, certText)
называется, это не с сообщениемinvalid algorithm
(даже если вы укажете алгоритм из заголовка токена)
Проблема заключалась в форматировании текста сертификата. jsonwebtoken
Пакет искал определенное форматирование (разделенное на 64 символа в каждой строке вместе с начальной и конечной строками сертификата, поэтому при форматировании с помощью метода ниже - он начал работать правильно.
Исходный код взят здесь: https://github.com/auth0/node-jsonwebtoken/issues/68 и немного отформатирован в соответствии с потребностями.
/**
* @param {string} key - The certificate value retrieved from amurl property.
*/
formatKey: function(key) {
const beginKey = "-----BEGIN CERTIFICATE-----";
const endKey = "-----END CERTIFICATE-----";
const sanitizedKey = key.replace(beginKey, '').replace(endKey, '').replace('\n', '')
const keyArray = sanitizedKey.split('').map((l, i) => {
const position = i + 1
const isLastCharacter = sanitizedKey.length === position
if(position % 64 === 0 || isLastCharacter) {
return l + '\n'
}
return l
})
return `${beginKey}\n${keyArray.join('')}${endKey}\n`
}