簡體   English   中英

為什么 Laravel Sanctum append token key 到 plainTextToken?

[英]Why does Laravel Sanctum append token key to the plainTextToken?

參考 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);
    }

來源: https://github.com/laravel/sanctum/blob/31fbe6f85aee080c4dc2f9b03dc6dd5d0ee72473/src/HasApiTokens.php#L44-L53

為什么 Sanctum append $token->getKey()$plainTextToken 換句話說, $token->getKey()部分的目的是什么? 它是否在身份驗證期間用作檢索加密令牌字符串並使用Hash::check或其他方式進行比較的密鑰?

我還有一個問題:創建 personal_access_tokens 表的遷移表明 token 列是唯一的。 但是,在上面的代碼中,我可以看到存儲在令牌列中的值只是隨機字符串hash('sha256', $plainTextToken = Str::random(40))的哈希值。 hash function 是否始終返回唯一值以便不違反唯一約束?

我的第一個想法是$token->getKey()應該附加到加密字符串以使其唯一。 但我認為情況並非如此。

Sanctum createToken function創建一個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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM