2

我正在创建一个 keystone 项目,我需要提供允许或不允许用户使用 keystone 登录进行访问。但是,我发现 keystoneJS 会发送带有电子邮件、密码和 csrf 的表单数据。当用户访问登录页面时,此 csrf 将提供给用户。

尽管如此,我需要做的是通过使用 API 与外部通信以登录用户。如何生成 _csrf?还有另一种方法然后生成两个请求吗?

谢谢

4

1 回答 1

5

@Sericaia,您没有包含任何有关您打算如何实现登录页面的代码或细节,所以我的回答会有点含糊。

Keystone 有一个用于处理 CSRF 令牌创建和验证的内部 API。我认为它没有记录在案,但这里是它如何工作的要点。

在您的路由处理程序中,您可以创建一个 CSRF 令牌键/值对,然后您可以将其注入您的本地视图,然后在您的视图模板中使用。你可以像这样手动完成。

app.get('/login', function (req, res) {
  var keystone = require('keystone');
  var csrfTokenKey = keystone.security.csrf.TOKEN_KEY;
  var csrfTokenValue = keystone.security.csrf.getToken(req, res);

  res.render('login', {
    csrfTokenKey: csrfTokenKey, 
    csrfTokenValue: csrfTokenValue
  });
});

或者您可以使用提供的中间件。

// the middleware will automatically inject the CSRF token 
// into res.locals[keystone.security.csrf.LOCAL_KEY]
app.get('/login', keystone.security.csrf.middleware.init, function(req, res) {
    ...
});

您还可以验证从客户端收到的 CSRF 令牌。您可以手动执行以下操作:

app.post('/login', function(req, res) {
  if (keystone.security.csrf.validate(req)) {
    // CSRF is valid 
    ...
  } else {
    // CSRF is not valid
    ...
  }

});

或者您可以使用提供的中间件。

// the middleware will return 403 status with "CSRF token mismatch"
// of there's a error validating the CSRF token received
app.post('/login', keystone.security.csrf.middleware.validate, function(req, res) {
    ...
});

希望这可以帮助。

于 2015-03-25T00:26:35.167 回答