Перенаправление на redirectUrl passport-azure-ad OIDCStrategy

#node.js #azure #passport.js #passport-azure-ad

#node.js #azure #passport.js #passport-azure-ad

Вопрос:

Я пытаюсь войти в систему через Azure AD Passport.js Стратегия OIDC. До сих пор я использовал следующие две страницы (помимо Google и рассматривал вопросы здесь, в stackoverflow) в качестве ресурсов больше всего:

У меня есть следующие вопросы, поскольку я также хочу расширить свои знания о passport.js и рекламная стратегия Azure:

  1. Когда я захожу в /auth/AzureAD, я перенаправляюсь на https://login.microsoftonline.com / форма входа в систему. Однако, когда я ввожу действительные учетные данные для входа, я перенаправляюсь на redirectUrl. Что я делаю не так?
  2. Должен ли также быть router.post для /auth/AzureAD/обратного вызова, и если да, то почему?
  3. Для других passport.js стратегии (google и локальные) нам нужно было сохранить некоторые детали в нашем MongoDB. Не следует ли это также сделать для стратегии Azure AD, и если да, то какие детали?
  4. Когда вы используете BearerStrategy вместо OIDCStrategy?

Я совершенно уверен, что правильно настроил identityMetadata и ClientID. Я не делюсь этой информацией, поскольку не уверен, что это правильно.

Большое спасибо, если вы можете помочь мне двигаться в правильном направлении!!!

passport.js

 const passport = require('passport');
const OIDCStrategy = require('passport-azure-ad').OIDCStrategy
const mongoose = require('mongoose');
const User = require('../Models/User');

  passport.use(
    new OIDCStrategy(
      {
        identityMetadata: 'https://login.microsoftonline.com/XXX.onmicrosoft.com/v2.0/.well-known/openid-configuration',
        clientID: 'XXX',
        responseType: 'code id_token',
        responseMode: 'form_post',
        redirectUrl: 'http://localhost:3000/auth/AzureAD/callback',
        allowHttpForRedirectUrl: true,
        clientSecret: 'XXX',
        validateIssuer: false,
        isB2C: false,
        issuer: null,
        passReqToCallback: false,
        scope: ['profile', 'offline_access'],
        loggingLevel: 'info',
        nonceLifetime: null,
        nonceMaxAmount: 6,
        clockSkew: 300,
          },
  function(iss, sub, profile, accessToken, refreshToken, done) {
    if (!profile.oid) {
      return done(new Error("No oid found"), null);
    }
    // asynchronous verification, for effect...
    process.nextTick(function () {
      findByOid(profile.oid, function(err, user) {
        if (err) {
          return done(err);
        }
        if (!user) {
          // "Auto-registration"
          users.push(profile);
          return done(null, profile);
        }
        return done(null, user);
      });
    });
  }
));
 

app.js

 //Passport middleware - Express Session
  session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false,
    store: new MongoStore({ mongooseConnection: mongoose.connection, collection: 'sessions' }),
  })

app.use(passport.initialize());
app.use(passport.session());
 

auth.js

 const express = require('express')
const passport = require('passport')
const router = express.Router()

// @desc    Auth with Google
// @route   GET /auth/AzureAD
router.get('/AzureAD', passport.authenticate("azuread-openidconnect", { scope: ['profile'] }))

// @desc    AzureAD auth callback
// @route   GET /auth/AzureAD/callback
router.get(
  '/AzureAD/callback',
  passport.authenticate("azuread-openidconnect", { failureRedirect: '/login' }),
  (req, res) => {
    res.redirect('/')
  }
)
 

login.ejs

 <div class="section">
    <a href="/auth/AzureAD" class="btn red darken-1">
        <i class="fab fa-microsoft"></i> Log In With Azure
    </a>
</div>
 

Ответ №1:

  1. Это ожидаемое поведение.
  2. Да, поскольку вы устанавливаете режим ответа на form_post.
  3. В этом нет необходимости.
  4. User OIDCStrategy перенаправляет пользователя на форму входа в Azure AD и, если получает идентификационный токен при успешном входе в систему. Используйте BearerStrategy для проверки токена доступа, прикрепленного к HTTP-запросу.