Экспресс / паспорт: Auth0 регистрирует успешный вход в систему, но не инициализирует объект req.user - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь настроить систему аутентификации, используя Node, Express, Passport и Auth0.Всякий раз, когда пользователь пытается войти в систему, Auth0 регистрирует успешную регистрацию, но req.user все еще не определен в моем приложении.

Я ранее использовал Okta OIDC, и это сработало для меня.Я использовал этот учебник: https://auth0.com/docs/quickstart/webapp/nodejs/01-login для переключения.

Вот промежуточное ПО аутентификации, которое я использую из учебника:

// Perform the login, after login Auth0 will redirect to callback
router.get('/login', passport.authenticate('auth0', {
  scope: 'openid email profile'
}), function (req, res) {
  res.redirect('/');
});

// Perform the final stage of authentication and redirect to previously requested URL or '/user'
router.get('/callback', function (req, res, next) {
  console.log('entering final stage of authentication');
  passport.authenticate('auth0', function (err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function (err) {
      if (err) { return next(err); }
      const returnTo = req.session.returnTo;
      delete req.session.returnTo;
      res.redirect(returnTo || '/dashboard');
    });
  })(req, res, next);
});

После аутентификации пользователь перенаправляетсяна мой URL обратного вызова (/dashboard).

router.get('/dashboard', secured(), function (req, res, next) {
    const { _raw, _json, ...userProfile } = req.user;
    //....
    res.render('dashboard');
});

Это вызывает защищенное промежуточное ПО:

module.exports = function () {
  return function secured (req, res, next) {
    if (req.user) {  console.log('successfully authenticated'); return next();}
    console.log('failed authentication');
    req.session.returnTo = req.originalUrl;
    res.redirect('/login');
  };
};

Здесь req.user не определен, и поэтому пользователь снова перенаправляется на/ login и этот цикл повторяется, приводя к следующим журналам:

GET /login 302 5.512 ms - 0
failed authentication
GET /dashboard?code=UDY7WYrXdtAWspnN&state=gGFkqbi9BlxDizGwO6hS9aaj 302 11.138 ms - 56
GET /login 302 1.675 ms - 0
failed authentication
GET /dashboard?code=mcGKEI4SmmyMfUJW&state=U8jOr7GsoXtQNyxVyKwbfA6e 302 6.735 ms - 56
GET /login 302 1.398 ms - 0
failed authentication
GET /dashboard?code=9Evpigv7JMFqxrfM&state=YkQLHvCuTLn8RZNN8bfAAMdU 302 5.207 ms - 56

и т. д.

Вот моя экспресс-установка:

var express = require('express');

var createError = require('http-errors');
var path = require('path');
var logger = require('morgan');

var dotenv = require('dotenv');

var session = require("cookie-session");
var sess = {
    secret: <secret>,
}
var passport = require('passport');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var Auth0Strategy = require('passport-auth0');

dotenv.config();

var strategy = new Auth0Strategy(
  {
    domain: process.env.AUTH0_DOMAIN,
    clientID: process.env.AUTH0_CLIENT_ID,
    clientSecret: process.env.AUTH0_CLIENT_SECRET,
    callbackURL:
      process.env.AUTH0_CALLBACK_URL || 'http://localhost:8080/dashboard'
  },
  function (accessToken, refreshToken, extraParams, profile, done) {
    // accessToken is the token to call Auth0 API (not needed in the most cases)
    // extraParams.id_token has the JSON Web Token
    // profile has all the information from the user
    return done(null, profile);
  }
);

passport.use(strategy);

passport.serializeUser(function (user, done) {
  done(null, user);
});

passport.deserializeUser(function (user, done) {
  done(null, user);
});


var app = module.exports = express();

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser(<secret (same as express-session secret)>));

if (app.get('env') === 'production') {
  sess.cookie.secure = true; // serve secure cookies, requires https
}

app.use(session(sess));

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

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.json());

var userInViews = require('./node_modules/userInViews');
var authRouter = require('./routes/auth');
var indexRouter = require('./routes/public');
var usersRouter = require('./routes/users');

app.use(userInViews());
app.use('/', authRouter);
app.use('/', indexRouter);
app.use('/', usersRouter);
...