关于php:如何生成令牌以通过URL验证帐户?

How to generate token to validate account via url?

在我的系统中,任何用户都不允许注册。必须通过电子邮件邀请他们。

我需要验证用户是否在系统上处于活动状态。为此,用户将收到一封电子邮件,其中包含验证您帐户的特定URL。

此URL(路由)可能包含用户标识和在"预注册"后保存在数据库中的验证代码。

1
hostname/accountConfirm?user=token&cod=userCodeSavedOnTheDatabase

令牌必须从用户电子邮件生成。

如何生成令牌并检查它以识别用户?


我建议使用类似的方法来生成代码

1
$code = bin2hex(openssl_random_pseudo_bytes(40));

将它与识别用户可能需要的任何其他信息存储在数据库中。在注册过程中验证代码,然后将其删除或以某种方式使其无效(例如设置"已使用"标志)


生成这样的随机字符串,并使用用户电子邮件作为密码,这是一个选项,或者使用任何内置的PHP函数来生成令牌。

1
2
3
4
5
6
7
$pool ='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';  
$token= '';
for ($i = 0; $i < 8; $i++){
   $token.= substr($pool, mt_rand(0, strlen($pool) -1), 1);
}
$cipher = new McryptCipher($user_email);
$encrypted_token= $cipher ->encrypt($token);

就验证而言,您可以选择将令牌和一些用户数据保存到表中,或者向令牌添加过期时间,并清除函数以删除过期的注册和垃圾邮件注册。另一种选择是将临时注册保存到文件中。

1
2
3
4
$epxire_time = timestamp() + 1800; // 30 min
$pending_registration = json_encode['token' => $encrypted_token, 'user' => $user_email,'epxire' => $epire_time];

file_put_contents($path/to/file/,$pending_registrations);

向用户发送电子邮件确认,并提供验证链接。验证过程中,您通常会从URL检索参数;

1
2
3
4
5
$token = $_GET['token'];
// additional param
// decrypt the token
$token = $cipher->decrypt($token );
$file = file_get_contents($path/to/file);

和验证令牌,验证令牌过期,用户电子邮件,就像你通常做的那样……

1
2
3
4
5
6
if($valid_token){
  // save user, redirect to login  
}else{
    // return response invalid token  
     return json_encode['statusCode' => 400, 'errorMessage' => 'Invalid ...','urltorequestnewotken' => 'http://...'];
}

将挂起的注册保存到一个临时文件中,这只是另一种减少垃圾邮件和僵尸程序干扰数据库的方法,就像使用验证码一样。希望能帮上忙。