Паспорт deserializeUser никогда не вызывался, req.isAuthenticated всегда ложно (используется res.redirect) - PullRequest
0 голосов
/ 08 марта 2019

Я надеялся, что вы сможете мне помочь с этим, так как я довольно плохо знаком с паспортом и экспрессом. У меня проблемы с аутентификацией, вот мой код ...

Настройка сеанса:

// required for passport session
app.use(expressSession({
  secret: 'mySecret',
  cookie: {
    maxAge: 1000 * 60 * 60 * 24 * 7, // 1 week
    secure: false
  },
  saveUninitialized: false,
  resave: false
}));
app.use(passport.initialize());
app.use(passport.session());

// Add headers
app.use(function (req, res, next) {

  // Website you wish to allow to connect
  res.setHeader('Access-Control-Allow-Origin', '*');

  // Request methods you wish to allow
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

  // Request headers you wish to allow res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, X-AUTHENTICATION, X-IP, Content-Type, Accept");

  // Set to true if you need the website to include cookies in the requests sent
  // to the API (e.g. in case you use sessions)
  res.setHeader('Access-Control-Allow-Credentials', true);

  next();
});

app.use(bodyParser.json());

// Authentication
var authRoute = require("./Routes/AuthRoute");
app.use('/api', authRoute);

// Activities
var activityRoute = require("./Routes/ActivityRoute");
app.use('/api', activityRoute);

Вход в систему (внутри AuthRoute.js):

  router.post('/login', 
    function(request, response, next) {
        console.log(request.session)
        passport.authenticate('login', 
        function(err, user, info) {
            if(!user){ response.send(info.message);}
            else{

                request.login(user, function(error) {
                    if (error) return next(error);
                    console.log("Request Login successful.");
                    return response.send('Login successful');
                });
            }

        })(request, response, next);
    }
);

Звонок на мою конечную точку / логин после аутентификации на внешнем сайте, который перенаправляет на конечную точку моей / деятельности в случае успеха:

exports.stravaAuthenticateRedirect = function (req, res) {

        var code = req.query.code;
        var uri = "https://www.strava.com/oauth/token?client_id=" + process.env.STRAVA_CLIENT_ID + "&client_secret=" + process.env.STRAVA_CLIENT_SECRET + "&code=" + code;
        request.post(uri, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                console.log(body)
                var jsonData = JSON.parse(body);
                var accessToken = jsonData['access_token'];
                var username = jsonData['athlete']['username'];
                var requestData = { "username": username, "strava_access_token": accessToken };
                // Call made to /login route
                request({
                    url: process.env.BASE_API_URL + "login",
                    method: "POST",
                    json: requestData
                }, function (error, response, body) {
                    if (!error && response.statusCode === 200) {
                        res.redirect(process.env.BASE_API_URL + "activities");
                    }
                    else {
                        console.log("error: " + error)
                        //TODO: Redirect to error page.
                        return error;
                    }
                })
            }
        });
    }

Паспорт LocalStrategy:

passport.use('login', new LocalStrategy({
    usernameField: 'username',
    passwordField: 'strava_access_token'
},
    function (username, strava_access_token, callback) {
        var query = "SELECT * FROM user WHERE username = ?;";
        db.query(query, [username], function (err, result) {
            if (err) throw err;
            if (result.length < 1) {
                query = "INSERT INTO user set username = ?, strava_access_token = ?;";
                db.query(query, [username, strava_access_token], function (err, result) {
                    jsonResult = JSON.stringify(result);
                    if (result.insertId == 'undefined') {
                        return callback(null, false, { message: 'Error logging in, issue: creating new user.' });
                    }
                    var jsonUser = {
                        "id": result.insertId,
                        "username": username,
                        "strava_access_token": strava_access_token
                    };
                    return callback(null, JSON.stringify(jsonUser), { message: 'New user created.  Logged in successfully.' });
                })
            } else {
                var jsonResult = JSON.stringify(result[0]);
                console.log("JSON result is:" + jsonResult);
                return callback(null, jsonResult, { message: 'Logged in Successfully.' });
            }
        });
    }
));

Сериализация и десериализация (deserializeUser никогда не вызывается):

passport.serializeUser(function (user, done) {
    done(null, JSON.parse(user)['id']);
});

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

Конечная точка действий, которая вызывается после успешного входа в систему (внутри ActivityRoute.js):

var isAuthenticated = function (req, res, next) {
    if (req.isAuthenticated())
        return next();
    res.redirect(process.env.BASE_CLIENT_URL + 'login');
}

router.get('/activities', isAuthenticated, activityController.getActivities);

При вызове конечной точки / деятельностей я вижу, что req.sessionStore.sessions имеет активные сеансы с правильным идентификатором пользователя, однако isAuthenticated всегда возвращает false. Есть идеи, что может быть причиной этого? Может ли быть так, что проблема связана с вызовом res.redirect моей конечной точки деятельности? Любые мысли о том, почему deserializeUser никогда не вызывается?

Заранее спасибо!

...