【问题标题】:Passport + Express4 not getting authenticated when using AJAX使用 AJAX 时 Passport + Express4 未通过身份验证
【发布时间】:2014-11-02 03:17:56
【问题描述】:

我在使用 Passport 时遇到问题:调用自定义端点时,我无法检查用户是否经过身份验证。

我已按以下方式配置了我的 Express4 应用程序:

app.use(morgan('dev')); // log every request to the console
app.use(cookieParser()); // read cookies (needed for auth)
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// required for passport
app.use(session({ secret: 'secretphrase' })); // session secret
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
app.use(checkAuth); // CHECK SESSION
app.use(flash()); // use connect-flash for flash messages stored in session
app.use(prepareRequests);

checkAuth() 中间件代码如下:

var checkAuth = function(request, response, next) {

    console.log("------------");
    console.log("checkAuth user: " + request.session.passport.user);
    console.log("checkAuth isAuthenticated: " + request.isAuthenticated());
    next();
}

我第一次尝试使用护照登录时,isAuthenticated 为假。一旦我登录,我对服务器的每次调用,当通过我的中间件时,isAuthenticated 也是错误的!!!但是,奇怪的是,如果我再次尝试登录,isAuthenticated 是真的。

这意味着只有我的 AJAX 调用返回 isAuthenticated = false,但是当我创建表单帖子或单击 API 链接时,它返回 true!然后存储会话,但不用于 AJAX 请求。

我做错了什么? cookie 没有通过吗?

【问题讨论】:

  • 您必须包括如何设置Passenger 的serializeUserdeserializeUser 方法,以及您使用的策略。
  • 正如我告诉你的,在接下来的调用中,serializeUser 和 deserializeUser 将被调用,同时使用本地和谷歌策略。
  • 我注意到在我的 AJAX 调用中没有 Cookie 被传递...我认为需要 cookie 来检查会话...
  • 我不知道,如果有的话,这听起来像是您如何登录的问题(assuming you aren't using a seperate domain). 该请求应该使用与您的其他请求相同的 cookie 和会话;是否是 AJAX 请求无关紧要。
  • 已修复 :-) 请在下方查看我的答案,感谢您的支持!

标签: javascript node.js ajax express passport.js


【解决方案1】:

如果您使用的是fetch

fetch('/my/url', { 
  method: 'GET',
  credentials: 'same-origin',
})
.then(res => res.json())
.then(...);

阅读更多MDN Fetch

【讨论】:

    【解决方案2】:

    似乎与 Dropped.on.Caprica 交谈有助于我找到解决方案....

    服务器已登录并成功保存会话。但是,您必须在以下 AJAX 请求中传递 Express 创建的 cookie (withCredentials = true)。 如果您使用的是 JQuery,请按以下方式:

    $.ajax({
        url: 'http://127.0.0.1:3003/users/me',
        type: 'GET',
        xhrFields: {
           withCredentials: true
        }}).done(function() {
          alert( "done" );
        });
    

    如果你不是:

    var request = window.XDomainRequest ? new XDomainRequest() : new XMLHttpRequest();      
    var pda;
    request.withCredentials = true;
    

    然后,在每次调用时,在您的 Node.JS 服务器中,请求 request.isAuthenticated() 将返回正确的值!!!

    其他提示: 不要忘记修改 Express 响应中的响应标头以允许凭据并指定来源以使其在 Chrome 中工作:

    response.header("Access-Control-Allow-Credentials", "true");
    response.header("Access-Control-Allow-Origin", "http://127.0.0.1:3008");
    

    【讨论】:

    • 很高兴你知道了!
    • 这是sequre吗?我认为这个标题默认为假是有原因的
    猜你喜欢
    • 2018-07-20
    • 2014-03-18
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多