【发布时间】:2018-08-14 06:03:27
【问题描述】:
这是一个旧项目,曾使用sailsjs 和passport js 进行登录认证。当我尝试登录时,它以 JSON 格式返回用户详细信息,这是正确的,但它会重定向回登录页面。但是,它也会返回一个错误,即TypeError: Cannot set property 'authenticated' of undefined,它被设置为boolean。
AuthController.js
passport.callback(req, res, function (err, user, challenges, statuses) {
if (err || !user) {
return tryAgain(challenges);
}
req.login(user, function (err) {
if (err) {
return tryAgain(err);
}
req.session.authenticated = true;
res.redirect('/');
});
});
登录.ejs
<form role="form" action="/auth/local" method="post">
<div id="usernameBox" class="form-group">
<input class="form-control" type="text" name="identifier" placeholder="Username or Email"/>
</div>
<div id="passwordBox" class="form-group">
<input class="form-control" type="password" name="password" placeholder="Password"/>
</div>
<div id="forgotPasswordBox" class="form-group" hidden>
<input id="resetEmail" class="form-control" type="text" name="email" placeholder="Email address"/>
</div>
<div id="forgotPasswordBox" class="form-group">
<div id="forgotPasswordButton" class="btn btn-white block full-width m-b">Forgot Password?</div>
</div>
<div id="signinBox" class="form-group">
<button class="btn btn-primary block full-width m-b" type="submit">Sign in</button>
</div>
<div id="submitResetBox" class="form-group" hidden>
<button id="submitResetButton" class="btn btn-primary block full-width m-b">Reset Password</button>
</div>
</form>
routes.js
'POST /api/locallogin': 'AuthController.localCallback',
'get /login': 'AuthController.login',
'get /logout': 'AuthController.logout',
'get /register': 'AuthController.register',
'get /register/user': 'UserController.createUser',
'get /register/user/:token': 'UserController.createUserFromInvite',
'post /register/user/:token': 'UserController.createUserCallback',
'post /auth/local': 'AuthController.callback',
'post /auth/local/register': 'AuthController.doRegister',
'post /auth/local/:action': 'AuthController.callback',
'get /auth/:provider': 'AuthController.provider',
'get /auth/:provider/callback': 'AuthController.callback',
'get /auth/:provider/:action': 'AuthController.callback',
policies.js
module.exports.policies = {
'*': ['passport', 'bearerAuth', 'sessionAuth'],
'auth': {
'*': ['passport']
},
UserController: {
requestPasswordReset: true,
passwordCancel: true,
passwordReset: true,
getPasswordReset: true,
createUserFromInvite: true,
createUserCallback: ['passport']
},
PaymentController: {
token: true,
webhook: true
},
NewReportController: {
reportComplete: true,
reportFailed: true
},
ClashTestController: {
exportComplete: true,
exportFailed: true
}
};
我曾尝试对此问题进行一些研究,但最终将 req.session.authenticated = true; 更改为 if 语句,如下所示:
req.login(user, function (err) {
if (err) {
return tryAgain(err);
}
if (req.isAuthenticated()) {
res.redirect('/');
}
});
它与根据输入的用户凭据返回详细信息的结果相同,req.isAuthenticated() 返回到true,但重定向回登录页面。这个错误的原因应该是什么?我被困在这个问题上。
提前致谢!
【问题讨论】:
-
我们需要更多信息。一件事-您是否通过发布表格来实现此方法?通过ajax调用?二 - 你的问题可能在这些方法之外,无论你的应用在
/根 url 处提供什么服务。您是否为此路由设置了策略或路由? -
@arbuthnott 实际上,我是护照和sailsjs 的新手。我只是继续追踪他们。关于表格,是的。这是一个ajax调用。我将使用表格、路线和政策更新问题。
标签: node.js sails.js passport.js passport-local