首页 > 解决方案 > Ionic + Passport isAuthenticated() 返回 false

问题描述

我在 angularJs 1.6 中使用 MEAN 堆栈构建的应用程序运行良好,我正在使用护照进行身份验证。

当我决定使用 ionic 对其进行测试时,应用程序本身运行良好(文件基本相同)但使用护照的身份验证被破坏

我可以注册和登录用户,但是当我想检查用户是否在我的服务器上使用 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 应用程序不能使用cookies(请求之间的区别也是离子应用程序缺少cookie),但我不明白如何管理一个同时适用的解决方案使用我的网络角度应用程序,它是离子版本(仍然有护照)

标签: angularjspassport.jspassport-localionic-v1

解决方案


我刚刚找到的解决方案:

事实上,这是一个 CORS 问题,因为我不知道确切原因,但 Ionic/cordova 没有{user:...}在发布请求中添加信息

只需添加

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:...} 部分

我不完全知道为什么您需要在客户端和服务器端都对其进行授权,但它工作正常


推荐阅读