Symfony passwordEncoder为非身份验证目的生成的哈希在验证时失败

Symfony passwordEncoder为非身份验证目的生成的哈希在验证时失败,symfony,symfony4,Symfony,Symfony4,对于要在我的系统中注册的用户,我将发送一封带有生成链接的确认邮件。单击时,系统应将活动属性设置为true 为了创建确认链接,我生成了一个md5散列随机字节值。此值是我发送给用户的链接的一部分。该值用passwordEncoder散列并存储在我的数据库中 当用户单击链接时,系统将根据我的数据库中的哈希值检查该值,并应返回true,以完全激活用户。由于某种原因,验证失败了 我检查了register()中生成的$identifier值是否是发送给用户的值。他们匹配。所以这里没有错 起初我只想使用pas

对于要在我的系统中注册的用户,我将发送一封带有生成链接的确认邮件。单击时,系统应将活动属性设置为true

为了创建确认链接,我生成了一个md5散列随机字节值。此值是我发送给用户的链接的一部分。该值用passwordEncoder散列并存储在我的数据库中

当用户单击链接时,系统将根据我的数据库中的哈希值检查该值,并应返回true,以完全激活用户。由于某种原因,验证失败了

我检查了register()中生成的$identifier值是否是发送给用户的值。他们匹配。所以这里没有错

起初我只想使用password_verify(),但也没有成功

我根本不知道它为什么不起作用。我最后的猜测是,有一些Symfony黑魔法正在进行,我不知道

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()实际编码的是什么呢?如果有疑问,