使用 CORS 登录 expressjs 应用程序

Posted

技术标签:

【中文标题】使用 CORS 登录 expressjs 应用程序【英文标题】:Logging into an expressjs app with CORS 【发布时间】:2014-07-06 03:34:00 【问题描述】:

我有 expressjs 坐在 nodejs 服务器上,我有一个客户端 cordova 应用程序向某些路由发出 ajax 请求。

这很好,直到我需要使用 passportjs 发出 POST 请求登录,发生了 302 重定向,所以我在拨打这个电话时得到了这个 302 Moved Temporarily

$('body').on('submit', '#logIn', function(e)
    e.preventDefault();

    var formData = $(this).serialize();

    $.ajax(
        url: "http://mydomain.io:3300/login",
        data: JSON.stringify(formData),
        type: "POST",
        crossDomain: true,
        dataType: "json",
        async: true,
        success: function(response)
            alert('succeeded!');
            console.log(response);
            alert(response);
        ,
        failure: function(message)
            alert("failed");
            console.log(message);
            alert(message);
        
    );

);

所以我的问题是如何使用 CORS 使用客户端 ajax 登录到应用程序?

【问题讨论】:

我不认为 CORS 是您的问题。您不应该使用护照通过 AJAX 登录 我觉得这并不理想,但我想不出任何其他方式,因为该应用程序是基于 expressjs 的,现在我将它转换为一个 cordova/phonegap 应用程序,这是我唯一能做的想想。 【参考方案1】:

CORS 不是你的问题。

Passport 想要重定向您的用户(基于您传递给passport.authenticate 的值)。例如:

app.get('/auth/facebook/callback',
  passport.authenticate('facebook',  successRedirect: '/',
                                      failureRedirect: '/login' ));

Passport 将通过返回302 告诉浏览器重定向到//login。您可以通过删除passport.authenticate的第二个参数来删除重定向:

app.get('/auth/facebook/callback',
  passport.authenticate('facebook'));

这将在认证成功时调用next()(否则返回401)。

此处的示例使用FacebookStrategy,但它适用于任何策略。

【讨论】:

哦哇,有道理,我真的没想到整个过程。现在试试看:) @MichaelJosephAubry 没问题 - 如果这回答了您的问题,请不要忘记投票/接受。 我当然会尝试一下,因为我可能有一些基本问题,我首先使用的是本地策略而不是 oauth facebook 策略(至少现在不是)我只是去掉了 successRedirect回调并有这样的 post 方法app.post('/login', passport.authenticate('local-login');? 太棒了,很高兴我能帮上忙。 好的,我得到了 401,但它出现了 401 Unauthorized 我会接受这个并对该错误进行研究。谢谢

以上是关于使用 CORS 登录 expressjs 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

ExpressJs 应用程序中的 cors-js 阻止了应该通过的请求

从不同来源获取时 Expressjs cors 问题

CORS 阻止 Expressjs 中的文件上传

尝试获取资源 Passport ReactJS 和 ExpressJS 时出现 NetworkError:CORS

ExpressJS 不同的域名 - CORS

如何使用基于网站的 ExpressJs 设置 CORS 和 JWT 令牌验证