【问题标题】:Angular authentication using Passport for Ionic App使用 Passport for Ionic App 进行 Angular 身份验证
【发布时间】:2015-06-06 04:39:44
【问题描述】:

我为我的网络应用构建了一个 API,它是使用 MEAN 堆栈构建的。 现在我正在尝试在使用 Ionic Framework 构建的移动客户端上使用这个 API。 我正在使用此代码对 API 执行 $http 调用:

    $http.post(ServerIP+'/login', {username: $scope.credentials.username, password: $scope.credentials.password}).success(function(response) {
        $scope.authentication.user = response;
        $location.path('/');
    }).error(function(response) {
        $scope.error = response.message;
    });

它通过用户对象获得有效响应,但如果我尝试从 API 的受保护部分获取一些信息,它不起作用并且正在重置身份验证。

在网络应用程序上,我使用相同的代码并且一切正常。 此问题仅发生在 Ionic 应用程序上。 我已经这样设置了 CORS:

app.use(function(req, res, next) {
 res.header('Access-Control-Allow-Origin', '*');
 res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
 res.header('Access-Control-Allow-Headers', 'Content-Type,  Authorization, Content-Length, X-Requested-With');

 // intercept OPTIONS method
 if ('OPTIONS' === req.method) {
   res.sendStatus(200);
 }
 else {
   next();
 }
});

请帮帮我!

【问题讨论】:

  • 你是在生成并使用tokens或一些策略来匹配req吗?
  • 您是否设置 withCredentials = true globaly?
  • 我正在使用 passport-local-mongoose 作为本地策略。

标签: angularjs node.js ionic-framework ionic mean-stack


【解决方案1】:

尝试在您的角度配置中添加这一行:

app.config(function ($httpProvider) {
    $httpProvider.defaults.withCredentials = true;
});

【讨论】:

  • 我已经尝试过了,但它似乎不起作用。在控制台中,我收到以下消息:“不能在 'Access-Control-Allow-Origin' 中使用通配符 '*'”
  • 要解决“通配符”错误,您必须指定要访问的网址,例如: res.header('Access-Control-Allow-Origin', 'myfrontendapp.com');但是您在 Ionic,我认为您没有域(我不确定),查看此博客可能会有所帮助 blog.ionic.io/handling-cors-issues-in-ionic
  • 我通过使用 jsonwebtoken 和 express-jwt 解决了我的问题。似乎最好的方法就是让它基于 Token
【解决方案2】:

我通过添加基于令牌的身份验证解决了这个问题。

这篇文章展示了如何做到这一点:https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

我的“登录”路径示例:

router.post('/login', passport.authenticate('local'), function(req, res, next){
    if (req.user) {
        var token = jwt.sign(req.user, secret, {expireInMinutes: 60*24*7});
        res.json(token);
    };
});

为了在受保护的路由上获取用户对象,我使用expressJwt({secret: secret}) 中间件。

【讨论】:

    猜你喜欢
    • 2018-02-04
    • 1970-01-01
    • 2019-01-31
    • 2016-09-28
    • 2019-12-20
    • 2015-08-22
    • 2018-01-31
    • 2021-10-11
    • 2015-08-29
    相关资源
    最近更新 更多