gpt4 book ai didi

node.js - 使用 Angular $http 请求时,passport req.isAuthenticated 始终返回 false

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:46 25 4
gpt4 key购买 nike

我正在使用 Passportjs 进行用户身份验证。

通过使用 postman,我可以成功登录,并且 req.isAuthenticated 在登录后的后续请求中始终返回 true。

通过使用 Angular $http,但是,登录工作正常,但 req.isAuthenticated 在子序列请求中始终返回 false。我的 Angular 应用程序(localhost:3000) Node 应用程序(heroku)位于不同的域。我的想法是它可能与 CORS 或 session cookie 有关,因为我在浏览器中没有看到任何 cookie。

我做了什么

  1. 我尝试设置请求 header 以允许 CORS。
  2. 我还尝试在 Angular $http 和 Node 应用程序中设置 Access-Control-Allow-Credentials

不幸的是,所有尝试都失败了 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');
}
}

Angular

    $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
});

我的问题/我不明白的事情

  1. 是否是因为浏览器中未设置 session cookie 导致出现问题
  2. 如果与 CORS 相关,我是否遗漏了任何设置?
  3. 还有什么???

最佳答案

我根据 @robertklep 评论自行解决了该问题。基本上passportjs设置没有什么问题。这完全取决于如何以 Angular 发送 withCredentials 标志。而不是调用 $http 的 get 或 post 方法。我使用以下格式,它对我有用

$http({
method: 'GET',
url: 'xxxx',
data: {...},
withCredentials: true
}).success ....

引用: https://docs.angularjs.org/api/ng/service/ $http#usage

关于node.js - 使用 Angular $http 请求时,passport req.isAuthenticated 始终返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31335369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com