这是一个旧项目,并使用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('/');
});
});
Login.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
,但重定向回登录页面。这个错误的原因应该是什么?我坚持这个问题。
提前致谢!
答案 0 :(得分:0)
根据我们可以看到的所有代码,看起来你做得对...使用req.isAuthenticated()
使用护照是正确的。 res.redirect('/')
应该做你想做的事。
这是我最好的猜测,为什么你要回到登录页面。在您的政策中,您有以下行:
'*': ['passport', 'bearerAuth', 'sessionAuth'],
由于没有将特定路由应用于根URL /
,因此将应用这些策略。其中一个可能是检查用户是否已登录,并查找(错误)他们不是,并将用户重定向到登录页面。
您可以在重定向之前在策略中添加console.log
来测试其中任何一项。可能,您仍在尝试使用req.session.authenticated
req.isAuthenticated()
应该使用的地方。
希望这有帮助,祝你好运。
答案 1 :(得分:0)
您可能在会话适配器上配置错误