我正在创建一个 keystone 项目,我需要提供允许或不允许用户使用 keystone 登录进行访问。但是,我发现 keystoneJS 会发送带有电子邮件、密码和 csrf 的表单数据。当用户访问登录页面时,此 csrf 将提供给用户。
尽管如此,我需要做的是通过使用 API 与外部通信以登录用户。如何生成 _csrf?还有另一种方法然后生成两个请求吗?
谢谢
我正在创建一个 keystone 项目,我需要提供允许或不允许用户使用 keystone 登录进行访问。但是,我发现 keystoneJS 会发送带有电子邮件、密码和 csrf 的表单数据。当用户访问登录页面时,此 csrf 将提供给用户。
尽管如此,我需要做的是通过使用 API 与外部通信以登录用户。如何生成 _csrf?还有另一种方法然后生成两个请求吗?
谢谢
@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) {
...
});
希望这可以帮助。