php Laravel:生成随机唯一令牌

stszievb  于 2023-02-11  发布在  PHP
关注(0)|答案(6)|浏览(269)

我的数据库中有一个名为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

表中不可能有其他行具有该令牌组合。我该怎么做?

q1qsirdb

q1qsirdb1#

在生成令牌方面,您可以使用Laravel的Helper函数之一;str_random().
这将生成指定长度的随机字符串,例如str_random(16)将生成16个字符(大写、小写和数字)的随机字符串。
根据您使用令牌的方式,它们真的需要完全唯一吗?假设它们将与用户匹配,或者我假设您可能正在使用token_id,然后针对token_key验证这一点,如果其中一个出现双重情况真的有关系吗?-尽管这种可能性非常小!
然而,如果你确实需要它们是真正唯一的,你总是可以使用带有unique约束的验证器,使用this package你也可以使用unique_with测试它们两个是否是唯一的,然后如果验证器失败,它会根据需要生成一个新的令牌。
根据您的示例,您可以将str_random(16)用于token_id,将str_random(30)用于token_key

3bygqnnd

3bygqnnd2#

我会避免为这种情况额外提供一个包裹。比如:

do {
    $token_id = makeRandomToken();
    $token_key = makeRandomTokenKey();
} while (User::where("token_id", "=", $token_id)->where("token_key", "=", $token_key)->first() instanceof User);

...应该可以。如果与“User”不同,请将型号名称替换为您的名称,并使用您的或建议的函数创建随机字符串。

dwthyt8l

dwthyt8l3#

您可以使用依赖项来完成此操作。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
    ])
e0bqpujr

e0bqpujr4#

根据艾芬豪的建议......这是我想到的:

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

        }
    }
rqmkfv5c

rqmkfv5c5#

对于看到这篇文章的其他用户。我发现最好的解决方案是使用另一个字符串或intiger来制作一个令牌。例如,当创建一个新用户时,laravel在做什么。

base64_encode($data['email']); // here using the email as base
0sgqnhkj

0sgqnhkj6#

我觉得这样更好:

do {
    $this->slug = strtolower(str()->random(5));
} while (User::where("slug", $this->slug)->exists());

相关问题