Я использую passjs для аутентификации пользователя.
Используя postman, я могу успешно войти в систему и req.isAuthenticated всегда возвращает мне true в запросах подпоследовательности после входа в систему.
Использование углового $ http. Однако вход в систему работает нормально, но req.isAuthenticated всегда возвращает мне false в запросе подпоследовательности. My угловое приложение (localhost: 3000) и приложение (heroku) находятся в другом домене. Мои мысли заключались в том, что это может относиться либо к CORS, либо к cookie сеанса, поскольку я не вижу куки в моем браузере.
То, что я сделал
- Я попытался установить заголовок запроса, чтобы разрешить CORS.
- Я также попытался установить Access-Control-Allow-Credentials как в угловом $ http, так и в узле.
К сожалению, все попытки оказались неудачными T_T
Nodejs настройки
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
if ('OPTIONS' == req.method) {
res.send(200);
} else {
next();
}
});
passport.serializeUser(function(account, done) {
done(null, account.id);
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
Account.findById(id, function(err, account) {
done(err, account);
});
});
passport.use('local-signup', new LocalStrategy({
usernameField: 'email'
}, function(email, password, done) {
....
}));
passport.use('local-login', new LocalStrategy({
usernameField: 'email'
}, function(email, password, done) {
....
}));
app.use(morgan('dev')); // log every request to the console
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(cookieParser(config.app.sessionSecret));
app.use(session({
secret: config.app.sessionSecret,
resave: false,
saveUninitialized: true,
cookie: { httpOnly: true, maxAge: 2419200000 }
}));
// Passport for account authentication
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
///////////////////////////////////////////////////////////////////route controller function
authenticate: function(req, res) {
if (!req.isAuthenticated()) {
res.redirect('/login');
} else {
res.status(200).send('successful');
}
}
Угловое
$http.post('http://xxxxx/login',
{ email: $scope.user.email,
password: $scope.user.password
})
.then(function(response) {
...
}, function(response) {
...
});
$http.get('http://xxxxx/authenticate',
{ withCredentials: true }).success(function() {
...
})
.error(function() {
... // always get here with 302 redirect
});
Мои вопросы/вещи, которые я не понимаю
- Это потому, что куки сессии не установлен в браузере вызывает проблему
- Если он относится к CORS, я не пропустить какие-либо настройки?
- Что еще ????
ЗАКАНЧИВАТЬ [ 'withCredentials'] параметр конфигурации (https://docs.angularjs.org/api/ng/service/$http). – robertklep
@robertklep Я включил эту опцию в свой угловой код. Проверьте мою угловую часть $ http.get ('xxxx', {withCredentials: true}). Успех ..... – eded
Простите, пропустил это :-( – robertklep