Ошибка «Не удалось сериализовать пользователя в сеанс» при использовании passport.js для Azure AD - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь следовать учебному руководству по API Office 365 здесь .

Однако я продолжаю сталкиваться с приведенной ниже ошибкой после входа в систему.

Error: Failed to serialize user into session
    at pass (C:\Users\SODS\devzone\src\nodejs\o365-graph\graph-tutorial\node_modules\passport\lib\authenticator.js:271:19)
    at serialized (C:\Users\SODS\devzone\src\nodejs\o365-graph\graph-tutorial\node_modules\passport\lib\authenticator.js:276:7)
    at passport.serializeUser (C:\Users\SODS\devzone\src\nodejs\o365-graph\graph-tutorial\app.js:20:3)
    at pass (C:\Users\SODS\devzone\src\nodejs\o365-graph\graph-tutorial\node_modules\passport\lib\authenticator.js:284:9)
    at Authenticator.serializeUser (C:\Users\SODS\devzone\src\nodejs\o365-graph\graph-tutorial\node_modules\passport\lib\authenticator.js:289:5)
    at IncomingMessage.req.login.req.logIn (C:\Users\SODS\devzone\src\nodejs\o365-graph\graph-tutorial\node_modules\passport\lib\http\request.js:50:29)
    at Strategy.strategy.success (C:\Users\SODS\devzone\src\nodejs\o365-graph\graph-tutorial\node_modules\passport\lib\middleware\authenticate.js:235:13)
    at verified (C:\Users\SODS\devzone\src\nodejs\o365-graph\graph-tutorial\node_modules\passport-azure-ad\lib\oidcstrategy.js:98:21)
    at Strategy.signInComplete [as _verify] (C:\Users\SODS\devzone\src\nodejs\o365-graph\graph-tutorial\app.js:63:10)
    at process._tickCallback (internal/process/next_tick.js:68:7)

Метод serializeUser выглядит следующим образом:

//Configure passport
//In-memory storage of users 
let users = {};
//Call serializeUser and deserializeUser to manage users
passport.serializeUser((user, done) => {
  //Use the OID prop of the user as the key
  users[user.profile.oid] = user;
  done(null, user.profile.oid);
}); 

passport.deserializeUser((id, done) => {
  done(null, users[id]);
});

Проблема может заключаться в том, что user.profile.oid, по-видимому, не определен внутри функции обратного вызова serializeUser (пробовал также заменить функции стрелок на обычные, но тоже не работал).

Но oid устанавливается во время входа в систему, и я вижу его, когда отслеживаю значения в приведенном ниже коде.

//Callback when the sign-in is complete and an access token has been obtained
async function signInComplete(iss, sub, profile, accessToken, refreshToken, params, done) {
  console.log('iss profile oid -->' + profile.oid);
  if (!profile.oid) {
    return done(new Error("No OID found in user profile."), null);
  }

  try {
    const user = await graph.getUserDetails(accessToken);

    if (user) {
      //Add properties to profile
      profile['email'] = user.mail ? user.mail : user.userPrincipalName;
    }
  } catch(err) {
    done(err, null);
  } 

  //Create simple oauth token from raw tokens
  let oauthToken = oauth2.accessToken.create(params);

  //Save the profile and token in users storage
  users[profile.oid] = {profile: oauthToken};
  return done(null, users[profile.oid]); 
}

Какой призыв к OIDCStratergy.

//Configure OIDC stratergy
passport.use(new OIDCStaregy(
  {
    identityMetadata: `${process.env.OAUTH_AUTHORITY}${process.env.OAUTH_ID_METADATA}`,
    clientID: process.env.OAUTH_APP_ID,
    responseType: 'code id_token',
    responseMode: 'form_post',
    redirectUrl: process.env.OAUTH_REDIRECT_URI,
    allowHttpForRedirectUrl: true,
    clientSecret: process.env.OAUTH_APP_PASSWORD,
    validateIssuer: false,
    passReqToCallback:  false,
    scope: process.env.OAUTH_SCOPES.split(' ')
  },
  signInComplete
));

Итак, вопрос в том, является ли неопределенный users.profile.oid проблемой здесь? Если да, то где и почему он теряется?

...