【问题标题】:SailsJS Cannot set property 'authenticated' of undefinedSailsJS 无法设置未定义的属性“已验证”
【发布时间】: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


【解决方案1】:

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

这是我对您最终返回登录页面的最佳猜测。在您的政策中,您有一行:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 2021-01-07
      • 2022-10-30
      • 2023-02-10
      • 2023-01-02
      相关资源
      最近更新 更多