【问题标题】:How to generate token to validate account via url?如何生成令牌以通过 url 验证帐户?
【发布时间】:2015-11-12 01:51:33
【问题描述】:

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

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

此网址(路由)可能包含用户标识和您在“预注册”后保存在数据库中的验证码

hostname/accountConfirm?user=token&cod=userCodeSavedOnTheDatabase

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

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

【问题讨论】:

标签: php security laravel


【解决方案1】:

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

$code = bin2hex(openssl_random_pseudo_bytes(40));

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

【讨论】:

    【解决方案2】:

    像这样生成一个随机字符串,并使用用户电子邮件作为密码,这是一种选择,或者您使用任何内置的 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);
    

    向用户发送一封电子邮件确认,其中包含验证链接。 验证过程,一般会从url中获取参数;

    $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://...'];
    }
    

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

    【讨论】:

      猜你喜欢
      • 2018-11-21
      • 2011-08-24
      • 2014-10-15
      • 2017-10-19
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      相关资源
      最近更新 更多