顯示廣告
隱藏 ✕
看板 Mesak
作者 mesak (Mesak)
標題 [PHP] Laravel passport 取得 accessToken 之後重新產生 jwt
時間 2021-11-02 Tue. 11:34:33


因為第一方特殊需求,response_type 採用code 不採用token 方式直接硬塞 accessToken 授權

https://github.com/laravel/passport/issues/779


namespace App\Eloquent\Passport;

use DateTimeImmutable;
use Laravel\Passport\Passport;
use Lcobucci\JWT\Configuration;
use League\OAuth2\Server\CryptKey;
use Lcobucci\JWT\Signer\Rsa\Sha256;
use Lcobucci\JWT\Signer\Key\InMemory;
use Laravel\Passport\PersonalAccessTokenResult;

class Token extends \Laravel\Passport\Token
{
    public function getPersonalAccessTokenResult()
    {
        $privateKey = new CryptKey(
            'file://' . Passport::keyPath('oauth-private.key'),
            null,
            false
        );

        $configuration = Configuration::forSymmetricSigner(
            new Sha256(),
            InMemory::file($privateKey->getKeyPath()),
        );

        $now = new DateTimeImmutable();
        $expiresAt = new DateTimeImmutable($this->expires_at->toDateTimeString());

        $token = $configuration->builder()
            ->permittedFor($this->client_id)
            ->issuedBy('self')
            ->identifiedBy($this->id)
            ->issuedAt($now)
            ->canOnlyBeUsedAfter($now)
            ->expiresAt($expiresAt)
            ->relatedTo($this->user->id)
            ->withClaim('scopes', [])
            ->getToken($configuration->signer(), $configuration->signingKey());

        return new PersonalAccessTokenResult($token->toString(), $this);
    }
}


AuthServiceProvider::boot 裡面,把 passport 的 tokenModel 換掉

        Passport::useTokenModel(\App\Eloquent\Passport\Token::class);

這樣從 user 端 呼叫出來的 tokens token 就能用此方法

$tokenModel = $user->tokens()->where('client_id', $appClient->id )->first();
$tokenResult =  $tokenModel->getPersonalAccessTokenResult();
$accessToken = $tokenResult->accessToken;


--
Mesak Blog
http://mesak.tw
--
※ 作者: mesak 時間: 2021-11-02 11:34:33 (台灣)
※ 編輯: mesak 時間: 2021-11-02 11:34:55 (台灣)
※ 看板: Mesak 文章推薦值: 0 目前人氣: 0 累積人氣: 54 
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇
看板名稱: 確定(Enter) 取消(Esc) 搜尋(Space)
查詢帳號: 確定(Enter) 取消(Esc) 搜尋(Space)
搜尋: m)m文 b)進板 c)未分類 a)作者 /)標題 q)取消?[q]

搜尋 送出(Enter) 取消(Esc)

回覆文章至: f)看板 m)作者信箱 b)兩者皆是 q)取消?[f]
要引用原文嗎? y)引用原文 n)不引用 a)全部回覆 r)複製原文 q)取消?[y]
轉錄本文章於看板: 1)使用連結 2)使用複製 q)取消 ?[1]
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc) 全部(a)

確定要刪除這篇文章?(可按大U救回) 確定(Enter) 取消(Esc)

刪除理由:

確定(Enter) 取消(Esc)
加到這個分類: 確定(Enter) 下一層(→) 回上層(←) 取消(Esc)
你覺得這篇文章: 1)真讚 2)真瞎 q)取消?[1] (再選一次即可收回)
你覺得這篇文章: 1)值得推薦 2)表示反對 3)單純註解 q)取消?[3]
guest
預覽(Enter) 取消(Esc)
上傳圖片
按ctrl+Enter可輸入下一行。
guest
確定要送出? 確定(Enter) 取消(Esc) 繼續(e)
搜尋: 送出(Enter) 取消(Esc)

▏▎▍▌▋▊▉ 請按任意鍵繼續