Symfony passwordEncoder为非身份验证目的生成的哈希在验证时失败
对于要在我的系统中注册的用户,我将发送一封带有生成链接的确认邮件。单击时,系统应将活动属性设置为true 为了创建确认链接,我生成了一个md5散列随机字节值。此值是我发送给用户的链接的一部分。该值用passwordEncoder散列并存储在我的数据库中 当用户单击链接时,系统将根据我的数据库中的哈希值检查该值,并应返回true,以完全激活用户。由于某种原因,验证失败了 我检查了register()中生成的$identifier值是否是发送给用户的值。他们匹配。所以这里没有错 起初我只想使用password_verify(),但也没有成功 我根本不知道它为什么不起作用。我最后的猜测是,有一些Symfony黑魔法正在进行,我不知道Symfony passwordEncoder为非身份验证目的生成的哈希在验证时失败,symfony,symfony4,Symfony,Symfony4,对于要在我的系统中注册的用户,我将发送一封带有生成链接的确认邮件。单击时,系统应将活动属性设置为true 为了创建确认链接,我生成了一个md5散列随机字节值。此值是我发送给用户的链接的一部分。该值用passwordEncoder散列并存储在我的数据库中 当用户单击链接时,系统将根据我的数据库中的哈希值检查该值,并应返回true,以完全激活用户。由于某种原因,验证失败了 我检查了register()中生成的$identifier值是否是发送给用户的值。他们匹配。所以这里没有错 起初我只想使用pas
public function register(EntityManagerInterface $entityManager, Request $request, UserPasswordEncoderInterface $passwordEncoder, MailerInterface $mailer)
{
// Register-Form
$form = $this->createForm(RegisterFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var User $user */
$user = $form->getData();
$user->setPassword($passwordEncoder->encodePassword(
$user,
$form['plainPassword']->getData()
));
// create activation hash
$identifier = md5(random_bytes(16));
$user->setActiveHash(
$passwordEncoder->encodePassword(
$user,
$identifier
)
);
// send activation mail with activation hash
$message = (new TemplatedEmail())
->subject('...')
->from('...')
->to($user->getEmail())
->textTemplate('emails/registration.txt.twig')
->context([
'mail' => $user->getEmail(),
'identifier' => $identifier,
])
;
$mailer->send($message);
// persist & flush
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash('success', '...');
//return $this->redirectToRoute('login');
return $this->render('home/index.html.twig');
}
return $this->render('security/register.html.twig', [
'registerForm' => $form->createView()
]);
}
/**
* @Route("/confirm/{email}/{identifier}", name="register.confirm")
*/
public function confirm($email, $identifier, EntityManagerInterface $entityManager, UserPasswordEncoderInterface $passwordEncoder)
{
$user = $entityManager->getRepository(User::class)->findOneBy([
'email' => $email,
'active' => false
]);
if (!$user) {
// fail no user with email
die('no such user');
}
if( !$passwordEncoder->isPasswordValid($user, $identifier) ){
// Hash verification failed
die('hash failed');
}
$user->setActive(true);
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash('success', '...');
return $this->redirectToRoute('login');
}
编辑:
我尝试用
password\u hash('a\u string',password\u ARGON2ID)
手动散列字符串,它抛出一个异常,即password\u ARGON2ID是一个未定义的常量。密码_ARGON2I有效。Symfony以某种方式使用Argon2ID作为我的密码字符串,而通过encodePassword()生成的activeHash字符串以“$Argon2ID…”开头,这怎么可能呢?好的。所以我在本地通过MAMP运行PHP7.2。正如msg在评论中提到的(在删除之前),Argon2ID散列可能是由钠提供的。7.2另一方面,password_verify()无法验证argon2id散列
升级到PHP7.3.7,不再有问题。如我所述。密码\u verify()也不起作用。我刚刚交换了
$passwordEncoder->isPasswordValid($user,$identifier)
with!密码验证($identifier,$user->getActiveHash())
一个基本问题是:Symfonys encodePassword()与password\u hash()基本相同吗?确定。所以$hash=$passwordEncoder->encodePassword($user,'password');dd([$hash,password_verify('password',$hash)])代码>失败。那么encodePassword()实际编码的是什么呢?如果有疑问,