KeystoneJS登录

Ser*_*aia 2 signing keystonejs

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

然而,我需要做的是通过使用API​​在外部进行通信以登录用户.如何生成_csrf?有另一种方式然后生成两个请求?

谢谢

JME*_*JME 5

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

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

在路由处理程序中,您可以创建一个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
  });
});
Run Code Online (Sandbox Code Playgroud)

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

// 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) {
    ...
});
Run Code Online (Sandbox Code Playgroud)

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

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

});
Run Code Online (Sandbox Code Playgroud)

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

// 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) {
    ...
});
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.