Laravel:生成随机唯一令牌

时间:2015-10-25 20:48:30

标签: php laravel laravel-4 laravel-5

我的数据库中有一个名为keys的表,它具有以下结构:

id | user_id | token_id | token_key

每次用户登录我的网站时,我都需要为该用户生成新的token_idtoken_key集。如何为token_idtoken_key生成随机令牌,同时保持这两个值唯一?

例如,如果:

  • token_iddfbs98641aretwsg
  • token_keysdf389dxbf1sdz51fga65dfg74asdf

含义:

id | user_id | token_id         | token_key
1  | 1       | dfbs98641aretwsg | sdf389dxbf1sdz51fga65dfg74asdf

表中没有其他行与令牌组合。我怎么能这样做?

4 个答案:

答案 0 :(得分:19)

在生成令牌方面,您可以使用Laravel's Helper Functions之一; str_random()

这将生成一个指定长度的随机字符串,例如str_random(16)将生成一个16个字符的随机字符串(大写,小写和数字)。

根据您使用令牌的方式,他们真的需要完全独特吗?鉴于它们将与用户匹配,或者我假设您可能正在使用token_id,然后针对token_key验证这是否真的重要,如果它们中的一个加倍? - 虽然这个机会非常小!

但是,如果确实需要它们才能真正独一无二,那么您始终可以使用具有unique约束的验证器。使用this package,您还可以使用unique_with测试其中两个也是唯一的。然后,如果验证器失败,那么它会根据需要生成新的令牌。

根据您的示例,您将str_random(16)用于token_idstr_random(30)用于token_key

答案 1 :(得分:16)

我避免为这样的案件包含额外的包裹。类似的东西:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    double n1=0, n2=0, n3=0;
    double sum1, sum2, sum3;
    double avg1,avg2,avg3;
    int count=0;
    FILE *inFile;

    inFile = fopen("data.txt", "r");
    if (inFile == NULL){
        printf("\nFailed to open file.\n");
        exit(1);
    }
    else
    {
        while(count<1001){
        fscanf(inFile,"%lf %lf %lf",&n1,&n2,&n3);
        sum1 += n1;
        sum2 += n2;
        sum3 += n3;
        count ++;
        avg1 = sum1/1000.00;
        }

    printf("\nSum is %lf\n", n1);
    printf("\nAverage is: %lf\n",avg1);
    }

fclose(inFile);
return 0;
}

......应该这样做。如果与“用户”不同,请替换您的型号名称,并使用您或建议的功能创建随机字符串。

答案 2 :(得分:1)

遵循@ivanhoe的建议...这就是我想出的:-

    $token = new Token;

    //in case there are duplicate
    for ($x = 0; $x < 10; $x ++) {
        $token->access_token = str_random(16);;
        try {
            if ($token->save()) {
                break;
            }
        }catch (QueryException $e) {

        }
    }

答案 3 :(得分:0)

您可以使用依赖项来执行此操作。 Dirape laravel-token

运行命令

composer require dirape/token

在您的控制器中使用

use Dirape\Token\Token;

你可以像这样使用它:

User::create([
        'name'             => $data['name'],
        'email'            => $data['email'],
        'password'         => bcrypt($data['password']),
        'token_key' => (new Token())->Unique('users', 'api_token', 60),
        'active'           => 1
    ])