web-dev-qa-db-fra.com

Node avec numéro de session express

J'utilise le code suivant qui fonctionne, cependant après quelques appels de réussite (5-10), nous obtenons parfois une erreur de serveur interne:

req.session["oidc:accounts.rvm.com"] is undefined

J'ai essayé toutes les versions latest open source.

Error: did not find expected authorization request details in session, req.session["oidc:accounts.rvm.com"] is undefined
at /opt/node_app/app/node_modules/openid-client/lib/passport_strategy.js:125:13
at OpenIDConnectStrategy.authenticate (/opt/node_app/app/node_modules/openid-client/lib/passport_strategy.js:173:5)
at attempt (/opt/node_app/app/node_modules/passport/lib/middleware/authenticate.js:366:16)
at authenticate (/opt/node_app/app/node_modules/passport/lib/middleware/authenticate.js:367:7)
at /opt/node_app/app/src/logon.js:92:7 *******
at Layer.handle [as handle_request] (/opt/node_app/app/node_modules/express/lib/router/layer.js:95:5)
at next (/opt/node_app/app/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/opt/node_app/app/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/opt/node_app/app/node_modules/express/lib/router/layer.js:95:5)
at /opt/node_app/app/node_modules/express/lib/router/index.js:281:22

Mon code de la pile est:

at /opt/node_app/app/src/logon.js:92:7

Quelle est la fin du code ici:

})(req, res, next);   // here is line 92 but not sure if it's related 

Ceci est le code complet (je passe le app qui est simplement un serveur Express):

Index.js

const express = require('express');
const logon = require('./logon');

const app = express();
const port = process.env.PORT || 4000;

logon(app)
  .then(() => {
    console.log('process started');
  });
app.use(express.json());

app.listen(port,
  () => console.log(`listening on port: ${port}`));

Logon.js

const { Issuer, Strategy } = require('openid-client');
const cookieParser = require('cookie-parser');
const cookieSession = require('cookie-session');
const azpi = require('./azpi');
const bodyParser = require('body-parser');
const passport = require('passport');

module.exports = async (app) => {
  let oSrv;
  const durl = `${process.env.srvurl}/.well-known/openid-configuration`;
  try {
    oSrv = await Issuer.discover(durl);
  } catch (err) {
    console.log('error occured', err);
    return;
  }

  app.get('/', prs(), passport.authenticate('oidc'));

  const oSrvCli = new oSrv.Client({
    client_id: process.env.ci,
    client_secret: process.env.cs,
    token_endpoint_auth_method: 'client_secret_basic',
  });

  passport.serializeUser((user, done) => {
    done(null, user);
  });
  passport.deserializeUser((obj, done) => {
    done(null, obj);
  });

  const cfg = {
    scope: 'openid',
    redirect_uri: process.env.ruri,
    response_type: 'code',
    response_mode: 'form_post',
  };

  const prs = () => (req, res, next) => {
    passport.use(
      'oidc',
      new Strategy({ oSrvCli , cfg }, (tokenset, done) => {
        const claims = tokenset.claims();
        // first log
        console.log(`1. ------------User claims received------------);
        const user = {
          name: claims.name,
          id: claims.sub,
          id_token: tokenset.id_token,
        };
        return done(null, user);
      }),
    );
    next();
  };
  app.use(
    bodyParser.urlencoded({
      extended: false,
    }),
  );
  app.use(cookieParser('csec'));
  app.use(
    cookieSession({
      name: 'zta-auth',
      secret: 'csect',
    }),
  );

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

  app.get('/redirect', async (req, res, next) => {
    await passport.authenticate('oidc', async (err, user) => {
    // print second log
    console.log('2. ------------redirect Called!------------');
      if (err) {
        console.log(`Authentication failed: ${err}`);
        return next(err);
      }
      if (!user) {
        return res.send('no identity');
      }

      req.login(user, async (e) => {
        if (e) {
          console.log('not able to login', e);
          return next(e);
        }
        try {
          const url = await azpi.GetUsers(user.id_token);
          // print last log
          console.log('3. ------------user process finished successfully----');
          return res.redirect(url);
          
        } catch (er) {
          res.send(er.message);
        }
      });
    })(req, res, next);   //here is the error
  });
};

Parfois, lorsque je débogé, je vois que la fonction est à court de GetUsers qui est une fonction asynchrone et s'arrête dans })(req, res, next);, c'est peut-être une question asynchrable.

Nous voulons utiliser ce code dans Prod au lieu de la précédente Java Mise en œuvre.

Si je peux utiliser une autre technique pour l'OIDC, merci de me le faire savoir.


[~ # ~ ~] Mise à jour [~ # ~]

Chacun devrait être un appel unique et connecter cet ordre:

1. ------------User claims received------------
2. ------------redirect Called!------------
3. ------------user process finished successfully----

Mais quand j'obtiens l'erreur :

1. ------------User claims received------------
2. ------------redirect Called!------------
3. ------------user process finished successfully----

2. ------------redirect Called!------------
Authentication failed: Error: did not find expected authorization request details in session, req.session

Tous les appels réussi ont la bonne commande de journal (1-3).

Quand il échoue, le premier appel User claims received Ne se produit pas, juste la deuxième et l'erreur.

S'il y a une autre façon d'y parvenir (d'autres libernes, etc.), merci de me le faire savoir.


J'ai trouvé - this bibliothèque qui peut aider comme il n'utilise pas de passeport (je souhaite réduire les DEP pour voir où le problème vient de).

Quand j'essaie quelque chose comme ça:

app.use(
    auth({
     issuerBaseURL: `${URL}/.well-known/openid-configuration`,
     authorizationParams: {
    ...
     response_mode: 'form_post',
    }

Je reçois cette erreur: issuer response_mode supporting only "query" or "fragment", Mais lorsque j'exécute le code ci-dessus (au début du message) avec le même issuer et response_mode, Tout fonctionne, toutes les idées ?

12
Beno Odr

Nous avons fait face à un problème similaire, mais nous avons eu un comportement plus intermittent, nous avons eu l'erreur lors de votre connexion sur Safari mais pas sur Chrome.

D'après ce que j'ai compris, c'est parce que le cookie de la session est configuré lorsque nous sommes d'abord authentifier, ce qui stocke le state, code-verifier (uniquement si vous utilisez Pkce Flow) et d'autres valeurs, le client de l'OIDC doit valider l'authentification.

Toutefois, lorsque l'URL/Callback est touchée, le navigateur envoie ce cookie de session sur le serveur pour compléter l'authentification.

Chaque fois que ce cookie n'est pas envoyé, c'est quand cette erreur se produit, car le rappel suppose que cela constitue une nouvelle demande et qui se bloque ...

pour nous, cela se comparait de 2 façons.

  1. Cookie {même site: 'Lax' Secure: True}

    Fonctionne pour chrome mais cela n'a pas fonctionné sur Safari

  2. Cookie {même site: 'Aucun' Secure: True}

    Fonctionne pour chrome et sur safari

cela doit être défini sur le middleware Express-session (désolé je ne suis pas sûr de la syntaxe qui est nécessaire)

0
user2296208