Пакет jsonwebtoken не может проверить результат пользователя Office.context.mailbox.getUserIdentityToken - PullRequest
0 голосов
/ 08 февраля 2019

Я разрабатываю веб-надстройку для 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 Ответ

0 голосов
/ 11 февраля 2019

Я нашел ответ на этот вопрос.

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

  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`
  }
...