Пакет 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 ответ

Решение

Теперь я нашел ответ на этот вопрос.

Просто повторить проблему было:

  1. Office.context.mailbox.getUserIdentityToken Метод возвращает токен jwt.
  2. При расшифровке этот токен содержит amurl поле, которое указывает на публичный сертификат в виде текста.
  3. когда 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`
  }
Другие вопросы по тегам