我的数据库中有一个名为keys
的表,它具有以下结构:
id | user_id | token_id | token_key
每次用户登录我的网站时,我都需要为该用户生成新的token_id
和token_key
集。如何为token_id
和token_key
生成随机令牌,同时保持这两个值唯一?
例如,如果:
token_id
是dfbs98641aretwsg
,token_key
是sdf389dxbf1sdz51fga65dfg74asdf
含义:
id | user_id | token_id | token_key
1 | 1 | dfbs98641aretwsg | sdf389dxbf1sdz51fga65dfg74asdf
表中没有其他行与令牌组合。我怎么能这样做?
答案 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_id
而str_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
])