Итак, мое веб-приложение использует 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();
});
});
});