我在使用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为false。登录后,每次通过中间件iAuthenticated调用服务器时,我进行的每次调用也是错误的!!!但是,奇怪的是,如果我尝试再次登录,则isAuthenticated为true。
这意味着只有我的AJAX调用返回isAuthenticated = false,但是当我进行表单发布或单击指向API的链接时,它返回true!然后存储会话,但不存储AJAX请求。
我做错了什么?Cookie是否没有通过?
似乎与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");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句