SailsJS无法设置属性' authenticated'未定义的

时间:2018-03-06 11:33:14

标签: node.js sails.js passport.js passport-local

这是一个旧项目,并使用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,但重定向回登录页面。这个错误的原因应该是什么?我坚持这个问题。

提前致谢!

2 个答案:

答案 0 :(得分:0)

根据我们可以看到的所有代码,看起来你做得对...使用req.isAuthenticated()使用护照是正确的。 res.redirect('/')应该做你想做的事。

这是我最好的猜测,为什么你要回到登录页面。在您的政策中,您有以下行:

'*': ['passport', 'bearerAuth', 'sessionAuth'],

由于没有将特定路由应用于根URL /,因此将应用这些策略。其中一个可能是检查用户是否已登录,并查找(错误)他们不是,并将用户重定向到登录页面。

您可以在重定向之前在策略中添加console.log来测试其中任何一项。可能,您仍在尝试使用req.session.authenticated req.isAuthenticated()应该使用的地方。

希望这有帮助,祝你好运。

答案 1 :(得分:0)

您可能在会话适配器上配置错误