Ionic + Passport isAuthenticated() returns 假
Ionic + Passport isAuthenticated() returns false
我的应用程序在 angularJs 1.6 中构建,使用 MEAN 堆栈运行良好,我正在使用 passport 进行身份验证。
当我决定使用 ionic 对其进行测试时,应用程序本身运行良好(文件基本上相同)但使用 passport 的身份验证被破坏
我可以注册和登录用户,但是当我想在我的服务器上使用 req.isAuthenticated() 检查用户是否登录时,它总是回答错误。
我认为这是因为当我从我的普通 angular 应用程序发出请求时,该请求包含一个带有密码和电子邮件的用户对象,但是当我从我的 ionic 应用程序发出请求时,用户丢失了
我已经花了一天时间处理它,任何帮助都会很棒!
编辑 1:
抱歉没有包含代码,我是第一次来这里
我的登录路径+我的登录函数
app.post('/api/login', login);
function login(req, res, next) {
//console.log(req);
passport.authenticate('local-login', function(err, user, info) {
if (err) {
return next(err); // will generate a 500 error
}
// Generate a JSON response reflecting signup
if (! user) {
return res.send({success : 'false', message : req.flash('loginMessage') });
}
req.login(user, function(err) {
if (err) { return next(err); }
//console.log(req);
return res.send({success : 'true', message : req.flash('loginMessage') });
});
})(req, res, next);
}
问题是,req.login被执行了,我得到了成功:是的,但是使用ionic/cordova应用程序,似乎什么都没有记住
之后,当我尝试检查用户是否使用此登录时
app.get('/api/login/loggedin', function(req, res) {
res.send(req.isAuthenticated() ? req.user : '0');
});
我总是得到'0',我认为这是因为cordova/ionic应用程序不能使用cookie(请求之间的区别也是ionic请求中缺少cookie),但我不明白如何管理一个既适用于我的网络 angular 应用程序又适用于它的离子版本(仍然带有护照)的解决方案
我刚刚找到的解决方案:
事实上,这是一个 CORS 问题,因为我不知道确切原因,但 Ionic/cordova 没有将 {user:...}
信息放入 post 请求
只需添加
var cors = require('cors');
app.use(cors({origin: 'http://localhost:8100', credentials: true}));
到您的服务器,它允许 req 包含所需的信息
并添加
{withCredentials: true}
所有将使用 isAuthenticated() 检查的请求。例如:
$http.get('http://localhost:8081/api/todos', {withCredentials: true});
因此发送的请求包含{user:...}部分
我不完全知道为什么你需要在客户端和服务器端都授权它,但它工作正常
我的应用程序在 angularJs 1.6 中构建,使用 MEAN 堆栈运行良好,我正在使用 passport 进行身份验证。
当我决定使用 ionic 对其进行测试时,应用程序本身运行良好(文件基本上相同)但使用 passport 的身份验证被破坏
我可以注册和登录用户,但是当我想在我的服务器上使用 req.isAuthenticated() 检查用户是否登录时,它总是回答错误。
我认为这是因为当我从我的普通 angular 应用程序发出请求时,该请求包含一个带有密码和电子邮件的用户对象,但是当我从我的 ionic 应用程序发出请求时,用户丢失了
我已经花了一天时间处理它,任何帮助都会很棒!
编辑 1:
抱歉没有包含代码,我是第一次来这里
我的登录路径+我的登录函数
app.post('/api/login', login);
function login(req, res, next) {
//console.log(req);
passport.authenticate('local-login', function(err, user, info) {
if (err) {
return next(err); // will generate a 500 error
}
// Generate a JSON response reflecting signup
if (! user) {
return res.send({success : 'false', message : req.flash('loginMessage') });
}
req.login(user, function(err) {
if (err) { return next(err); }
//console.log(req);
return res.send({success : 'true', message : req.flash('loginMessage') });
});
})(req, res, next);
}
问题是,req.login被执行了,我得到了成功:是的,但是使用ionic/cordova应用程序,似乎什么都没有记住
之后,当我尝试检查用户是否使用此登录时
app.get('/api/login/loggedin', function(req, res) {
res.send(req.isAuthenticated() ? req.user : '0');
});
我总是得到'0',我认为这是因为cordova/ionic应用程序不能使用cookie(请求之间的区别也是ionic请求中缺少cookie),但我不明白如何管理一个既适用于我的网络 angular 应用程序又适用于它的离子版本(仍然带有护照)的解决方案
我刚刚找到的解决方案:
事实上,这是一个 CORS 问题,因为我不知道确切原因,但 Ionic/cordova 没有将 {user:...}
信息放入 post 请求
只需添加
var cors = require('cors');
app.use(cors({origin: 'http://localhost:8100', credentials: true}));
到您的服务器,它允许 req 包含所需的信息
并添加
{withCredentials: true}
所有将使用 isAuthenticated() 检查的请求。例如:
$http.get('http://localhost:8081/api/todos', {withCredentials: true});
因此发送的请求包含{user:...}部分
我不完全知道为什么你需要在客户端和服务器端都授权它,但它工作正常