Я пытаюсь настроить систему аутентификации, используя 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);