Я надеялся, что вы сможете мне помочь с этим, так как я довольно плохо знаком с паспортом и экспрессом. У меня проблемы с аутентификацией, вот мой код ...
Настройка сеанса:
// 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 никогда не вызывается?
Заранее спасибо!