引用Sanctum的下列代码:
public function createToken(string $name, array $abilities = ['*'])
{
$token = $this->tokens()->create([
'name' => $name,
'token' => hash('sha256', $plainTextToken = Str::random(40)),
'abilities' => $abilities,
]);
return new NewAccessToken($token, $token->getKey().'|'.$plainTextToken);
}
为什么桑德姆把$token->getKey()
附加到$plainTextToken
上?换句话说,$token->getKey()
部件的用途是什么?在身份验证期间,它是否用作密钥来检索加密的令牌字符串并使用Hash::check
或其他方法进行比较?
我还有一个问题:创建personal_access_tokens表的迁移表明令牌列是唯一的。但是,在上面的代码中,我可以看到存储在令牌列中的值只是随机字符串hash('sha256', $plainTextToken = Str::random(40))
的散列值。哈希函数是否总是返回唯一的值,这样它就不会违反唯一约束?
我的第一个想法是,应该将$token->getKey()
附加到加密的字符串中,以使其具有唯一性。但我认为情况并非如此。
发布于 2022-09-29 08:14:52
圣殿createToken 创建了一个40个字符的字符串,
Str::random(40)
然后对其进行散列处理,但在散列之前,将其存储到变量$plainTextToken.中。
hash('sha256', $plainTextToken = Str::random(40))
散列令牌转到数据库,未散列令牌返回给用户。
$token = $this->tokens()->create([
'name' => $name,
'token' => hash('sha256', $plainTextToken = Str::random(40)),
'abilities' => $abilities,
]);
用数据库记录的主键将未散列部分返回给用户.主键有助于快速找到令牌。如果您删除主键,它也将工作。
return new NewAccessToken($token, $token->getKey().'|'.$plainTextToken)
https://stackoverflow.com/questions/72092685
复制相似问题