【发布时间】:2021-10-13 00:29:19
【问题描述】:
我在 symfony 应用程序中使用外部前端 (vue) 进行身份验证时遇到问题。主要问题是“无效的 CSRF 令牌”错误。我在 vue 中有一个登录表单,它发送一个包含用户名、密码和 csrf 令牌(我从 symfony tokengenerator 获得)的对象。我有一个自定义身份验证器,我在其中创建用户护照并将令牌添加到其中。
public function authenticate(Request $request): PassportInterface
{
$username = $request->request->get('username', '');
$request->getSession()->set(Security::LAST_USERNAME, $username);
$this->logger->info('The token is', [$request->get('_csrf_token')]);
$passport = new Passport(
new UserBadge($username),
new PasswordCredentials($request->request->get('password', '')),
);
$passport->addBadge(new CsrfTokenBadge('authenticate', $request->get('_csrf_token')));
return $passport;
}
它通过 AuthenticationManager.php 进入 executeAuthenticator 方法。在从 CSRFProtectionListener 调度 CheckPassportEvent 之后出现错误。它在
if (false === $this->csrfTokenManager->isTokenValid($csrfToken)).
我试图在我的身份验证器中获取令牌管理器实例并在那里创建令牌并将其添加到护照中。
$token = $this->csrfTokenManager->getToken('authenticate'); $passport->addBadge(new CsrfTokenBadge($token->getId(), $token->getValue()));
这让我通过了身份验证,但随后,当它重定向到下一个路径时,它给了我一个错误“访问被拒绝,用户未完全通过身份验证;重定向到身份验证入口点。”。经过一番调试,似乎token存储是空的(调用getToken()方法时token被保存到存储中)。
当我使用 twig 模板进行身份验证时,它可以完美运行。 {{ csrf_token('authenticate') }} 究竟是如何制作和处理我不明白的令牌的。任何意见将不胜感激。
【问题讨论】:
标签: vue.js symfony authentication