Использование passport- azure -ad BearerStrategy с использованием клиентского перенаправления для получения токенов - PullRequest
0 голосов
/ 11 февраля 2020

Итак, мое веб-приложение использует OIDCStrategy, и это прекрасно работает, если я использую прокси для связи с конечной точкой Microsoft. Я пытаюсь избавиться от Прокси и использовать для этого BearerStratgy.

Я делаю перенаправление клиента, чтобы заставить клиента получить токен.

https://login.microsoftonline.com/my tennant / oauth2 / v2.0 / authorize? Client_id = мой идентификатор клиента & response_type = id_token + token & redirect_uri = myhost / auth / openid / return & response_mode = form_post & scope = openid + профиль + электронная почта и состояние = 12345 & nonce = uBiBPP & domain_hint = 100 * 100 * 100 * мой * Похоже, я получил и идентификатор, и токен доступа, но подпись на маркере доступа не работает. Я пытаюсь только запросить id_token, но затем происходит сбой с отсутствующим токеном.

Буду признателен за любые подсказки, какие настройки я делаю неправильно. Смысл этого упражнения состоит в том, чтобы не дать серверу разговаривать с inte rnet.

Ошибка: {"имя": "AzureAD: стратегия переноса", "имя хоста": "имя хоста", "pid": 25985, "уровень": 30, "msg": "сбой аутентификации из-за : недопустимая подпись "," время ":" 2020-02-10T21: 02: 48.814Z "," v ": 0}

и, конечно, на веб-странице отображаются несанкционированные.

Спасибо за вашу помощь.

var express = require('express');
var passport = require('passport');
var fs = require('fs');
var https = require('https');
var certificate = fs.readFileSync('/app/key/server.crt', 'utf8');
var privateKey  = fs.readFileSync('/app/key/server.key', 'utf8');
const { constants } = require('crypto');
var request = require('request');
var reqoptions = {
    uri: 'https://<a host on our netowrk>/azuread/discovery/v2.0/keys/',
    timeout: 30,
    method : 'GET'
  };

request(reqoptions, function (error, response, body) {
  var info = JSON.parse(body);

  var ssloptions = {
               key: privateKey,
               cert: certificate,
               secureOptions: constants.SSL_OP_NO_SSLv3 | constants.SSL_OP_NO_TLSv1 | constants.SSL_OP_NO_TLSv1_1,
               ciphers: [
                         "HIGH",
                         "!MD5",
                         "!RC4",
                         "!DSA",
                         "!DESede",
                         "!DES",
                         "!aNULL",
                        ].join(':'),
              };


  var BearerStrategy = require("passport-azure-ad").BearerStrategy;

  var options =  {
    identityMetadata: 'https://login.microsoftonline.com/<tenant>/v2.0/.well-known/openid-configuration',
    clientID: '<client id>',
    loggingLevel: "info",
    verifyIssuer: false,
    loggingNoPII: false,
    passReqToCallback: false,
    // keys are in a json dictionary under keys
    jweKeyStore: info['keys'],
};
  console.log(options)
  var bearerStrategy = new BearerStrategy(options, function(token, done) {
    done(null, {}, token);
  });

  var app = express();

  app.use(require('morgan')('combined'));
  app.use(require('cookie-parser')());
  app.use(require('body-parser').urlencoded({ extended: true }));
  app.use(require('express-session')({ secret: 'keyboard cat', resave: true, saveUninitialized: true }));
  app.use(passport.initialize());
  passport.use(bearerStrategy);

  app.get("/",
     function(req, res) {
        console.log('in /');
        res.status(200).json({ name: 'no name in /' })
     }
  );

  app.get('/auth/openid',
  // Client Redirect to get tokens
          function(req, res) {
              var ms_start = 'https://login.microsoftonline.com/<tenant</oauth2/v2.0/authorize?client_id='
              var ms_middle = '&response_type=id_token+token&redirect_uri='
              var ms_end = '&response_mode=form_post&scope=openid+profile+email&state=12345&nonce=replaceme&domain_hint=comcast.com'
              var rURL = 'https://<my host>/auth/openid/return'

              var mURL = ms_start+'<client id>'+ms_middle+rURL+ms_end
              var noncestr           = '';
              var characters       = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
              var charactersLength = characters.length;

              for ( var i = 0; i < 6; i++ ) {
                noncestr += characters.charAt(Math.floor(Math.random() * charactersLength));
                  }

           //console.log('logon URL '+ms_login_url);
           //console.log('noncestr '+noncestr);
           var ms_login_url = mURL.replace("replaceme", noncestr);
           console.log('Modified logon URL '+ms_login_url);
           res.redirect(ms_login_url);
      });

  app.post('/auth/openid/return',
    //return url for azure-ad
    passport.authenticate("oauth-bearer", { session: true }),
    function(req, res) {
      var claims = req.authInfo;
      console.log("User info: ", req.user);
      console.log("Validated claims: ", claims);
      res.status(200).json({ name: claims["name"] });
    }
  );

// Run this

  var httpsServer = https.createServer(ssloptions, app);
  var server = httpsServer.listen(443, function () {
    if (server.address()) {
      console.log("server listening");
    } else {
      console.log('something went wrong');
      process.exit();
    }
    process.on('SIGINT', function () {
      console.log('stopping web server.. bye!');
      server.close();
      process.exit();
    });
  });
});
...