【发布时间】: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 的
serializeUser和deserializeUser方法,以及您使用的策略。 -
正如我告诉你的,在接下来的调用中,serializeUser 和 deserializeUser 将被调用,同时使用本地和谷歌策略。
-
我注意到在我的 AJAX 调用中没有 Cookie 被传递...我认为需要 cookie 来检查会话...
-
我不知道,如果有的话,这听起来像是您如何登录的问题(assuming you aren't using a seperate domain). 该请求应该使用与您的其他请求相同的 cookie 和会话;是否是 AJAX 请求无关紧要。
-
已修复 :-) 请在下方查看我的答案,感谢您的支持!
标签: javascript node.js ajax express passport.js