#javascript #node.js #azure #azure-active-directory #passport.js
Вопрос:
Я работал над приложением узла, которое использует аутентификацию Azure AD OIDC через Passport (через пакет passport-azure-ad). Функции входа в систему всегда работали нормально, но я нахожусь на последнем этапе и пытаюсь исправить функцию выхода из системы. Моя проблема в том, что форма выхода из Azure AD не перенаправляет меня туда, куда я прошу, через ?post_logout_redirect_uri — она просто выдает мне сообщение «Вы вышли из своей учетной записи — рекомендуется закрыть все окна браузера». Мой маршрут выхода из системы очень прост — сначала он вызывает функцию выхода из системы Passport (), а затем перенаправляет на форму выхода из системы AzAD, которая (теоретически) должна перенаправить обратно на домашнюю страницу моего приложения после завершения. В моем коде ниже я использую https://login.microsoftonline.com/{мой идентификатор арендатора}/oauth2, но я также пытался использовать https://login.microsoftonline.com/common/oauth2 — у обоих одна и та же проблема.
router.get('/logout', function (req, res) {
req.logout();
res.redirect(`${process.env.AZ_TENANT_URL}/oauth2/v2.0/logout?post_logout_redirect_uri=${encodeURIComponent(process.env.APP_URL)}`);
});
APP_URL-это просто полное доменное имя моего веб-сайта, которое я также добавил в качестве URI перенаправления и URL-адреса выхода из системы на первом канале при регистрации приложения Azure. У меня есть отдельные приложения Azure, зарегистрированные для prod и dev, поэтому URL-адрес приложения задан в качестве переменной среды, но, очевидно, я пытался жестко закодировать его безрезультатно (у меня та же проблема в prod и dev). Я в недоумении, в чем должна быть проблема. Для полноты картины я также включаю свою стратегию паспорта ниже, хотя, как я уже сказал, мои маршруты входа в систему в порядке (и мои маршруты выхода из системы работают в основном так, как ожидалось — моя единственная проблема в том, что AzAD не перенаправляет на мой post_logout_redirect_uri):
function AzureOpenIdStrategy() {
this.passport = require("passport");
this.AzureOpenIdStrategy = require("passport-azure-ad").OIDCStrategy;
this.passport.use("azad", new this.AzureOpenIdStrategy({
identityMetadata: process.env.AZ_IDENTITY_METADATA,
clientID: process.env.AZ_CLIENT_ID,
responseType: 'id_token',
responseMode: 'form_post',
redirectUrl: `${process.env.APP_URL}/auth`,
allowHttpForRedirectUrl: false,
clientSecret: process.env.AZ_APP_KEY,
scope: ['profile', 'email', 'openid', 'offline_access', 'https://graph.microsoft.com/mail.read']
},
function (iss, sub, profile, accessToken, refreshToken, done) {
if (!profile.oid) {
return done(new Error("No oid found"), null);
}
const user = profile._json;
done(null, user);
}));