Как использовать пакет Jsonwebtoken NPM для проверки токена JWT, выпущенного Azure AD? - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь использовать пакет jsonwebtoken NPM для проверки токена JWT, выпущенного Azure Active Directory. Ниже приведен код node.js, который я написал:

  var jwt = require('jsonwebtoken');
  var token = '<valid JWT token>';
  var x5cString = '<x5cSTring>';
  var publicKey = '-----BEGIN CERTIFICATE-----\n' + x5cString + '\n-----END CERTIFICATE-----';

    var verifiedToken = jwt.verify(token, publicKey) //, verifyOptions);

Обратите внимание, что в приведенном выше коде я использую фактическую строку x5c из https://login.microsoftonline.com/common/discovery/keys. Это работает нормально, и я получаю ожидаемый результат. Но строка X5C, которая является открытым ключом, постоянно меняется. Я пытаюсь понять, как автоматически получить этот открытый ключ.

EDIT

Я нашел пример кода на веб-сайте пакета Jsonwebtoken NPM. В этом коде signatureKey - это то, что я хочу. Ниже приведен код.

var jwksClient = require('jwks-rsa');
var client = jwksClient({
  jwksUri: 'https://login.microsoftonline.com/common/discovery/keys'
});
function getKey(header, callback){
  client.getSigningKey(header.kid, function(err, key) {
    var signingKey = key.publicKey || key.rsaPublicKey;
    callback(null, signingKey);
  });
}

jwt.verify(token, getKey, options, function(err, decoded) {
  console.log(decoded.foo) // bar
});

В приведенном выше коде jwt.verify вызывает getKey, который принимает заголовок и обратный вызов в качестве параметра. Я не понимаю, как функция jwt.verify передала параметр 'header' в getKey. Ниже приведен заголовок, который я получил. как передать этот заголовок getKey в jwt.verify?

var decoded = jwt.decode(token, {complete: true});
var header = decoded.header

1 Ответ

0 голосов
/ 09 марта 2019

Хорошо, я нашел решение.Ниже приведен окончательный код, который у меня есть.

var jwksClient = require('jwks-rsa');
var jwt = require('jsonwebtoken');

    token = 'valid JWT token';
    var decoded = jwt.decode(token, {complete: true});
    var header = decoded.header

    var verifyOptions = {
     algorithms: ['RS256'],
     header: decoded.header

  };


    var client = jwksClient({
      jwksUri: 'https://login.microsoftonline.com/common/discovery/keys'
    });
    function getKey(header, callback){
      client.getSigningKey(header.kid, function(err, key) {
        var signingKey = key.publicKey || key.rsaPublicKey;
        callback(null, signingKey);
      });
    }

    jwt.verify(token, getKey, verifyOptions, function(err, decoded) {
      //This will display the decoded JWT token.
      console.log(decoded)  
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...