如何生成令牌以通过网址验证帐户?

时间:2015-08-18 23:09:18

标签: php security laravel

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

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

在“预注册”之后,此网址(路线)可能包含用户标识,并且您的验证代码会保存在数据库中。

hostname/accountConfirm?user=token&cod=userCodeSavedOnTheDatabase

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

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

2 个答案:

答案 0 :(得分:2)

我建议使用类似的东西来生成代码

$code = bin2hex(openssl_random_pseudo_bytes(40));

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

答案 1 :(得分:1)

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

$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);

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

$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);

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

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

并验证令牌,验证令牌过期,user_email就像通常那样......

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

将挂起的注册保存到临时文件中这只是另一种方法,可以最大限度地减少垃圾邮件和机器人使数据库混乱,就像使用验证码一样。 希望这有帮助。