Laravel 护照从数据库中获取令牌

Posted

技术标签:

【中文标题】Laravel 护照从数据库中获取令牌【英文标题】:Laravel passport get token from database 【发布时间】:2019-05-15 16:56:08 【问题描述】:

我正在使用 Laravel 5.5 版并使用 Passport 进行身份验证。 我使用以下方法创建了令牌:

$token = $user->createToken('string')->accessToken;

它生成 1075 个字符的令牌'oauth_access_tokens' 表中的条目具有 80 个字符的 ID

如何使用 using 80 字符令牌从数据库中获取 1075 字符令牌?

【问题讨论】:

我认为您可以使用 $user->tokens()->get() 访问用户令牌,但我不确定是否是您正在寻找的 @sochas $user->tokens$user->tokens()->get() 相同,您将从 oauth_access_tokens 表中获取记录,其中 id 为 80 个字符,但 @user10790140 想要获取真正的访问令牌 【参考方案1】:

我还没有找到从护照中获取 access_token 的方法,但我找到了自己生成令牌的解决方案。这是 github 上的问题的一部分。您可以在链接中查看解决方案,希望它对我有用。

Passport link to issue

您也可以在护照库link中查看access_token的生成

【讨论】:

【参考方案2】:

(这是在 Laravel 8 上测试的)。

用于生成 JWT 令牌的代码可以在 League\OAuth2\Server\Entities\Traits\AccessTokenTrait 中找到。

看起来像这样:

/**
     * Generate a JWT from the access token
     *
     * @return Token
     */
    private function convertToJWT()
    
        $this->initJwtConfiguration();

        return $this->jwtConfiguration->builder()
            ->permittedFor($this->getClient()->getIdentifier())
            ->identifiedBy($this->getIdentifier())
            ->issuedAt(new DateTimeImmutable())
            ->canOnlyBeUsedAfter(new DateTimeImmutable())
            ->expiresAt($this->getExpiryDateTime())
            ->relatedTo((string) $this->getUserIdentifier())
            ->withClaim('scopes', $this->getScopes())
            ->getToken($this->jwtConfiguration->signer(), $this->jwtConfiguration->signingKey());
    

因此,要使用oauth_access_tokens 表中的数据重新创建您的 JWT 令牌,请使用以下代码:

$oauthClientId = 1; // CHANGE! The ID of oauth client found in "oauth_clients" table
$tokenId = "..." // CHANGE! The 80 character ID found in "oauth_access_tokens"

$clientRepository = app(\Laravel\Passport\Bridge\ClientRepository::class);
$clientEntity = $clientRepository->getClientEntity($personalAccessClientId); 
$token = Token::query()->where('id', $tokenId)->firstOrFail();
$issuedAt = Carbon::createFromFormat('Y-m-d H:i:s', $token->created_at)
            ->toDateTimeImmutable();
$expiresAt = Carbon::createFromFormat('Y-m-d H:i:s', $token->expires_at)
            ->toDateTimeImmutable();
$scopes = collect($token->scopes)->map(function ($id) 
            return new \Laravel\Passport\Scope($id);
        )->all();

$jwtConfiguration = \Lcobucci\JWT\Configuration::forAsymmetricSigner(
            new Sha256(),
            LocalFileReference::file(Passport::keyPath('oauth-private.key'), ''),
            InMemory::plainText('')
        );

$jwtToken = $jwtConfiguration->builder()
            ->permittedFor($clientEntity->getIdentifier())
            ->identifiedBy($tokenId)
            ->issuedAt($issuedAt)
            ->canOnlyBeUsedAfter($issuedAt)
            ->expiresAt($expiresAt)
            ->relatedTo((string)$token->user_id)
            ->withClaim('scopes', $scopes)
            ->getToken($jwtConfiguration->signer(), $jwtConfiguration->signingKey());

$token = (string)$jwtToken;

【讨论】:

以上是关于Laravel 护照从数据库中获取令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Laravel Passport 中的刷新令牌中获取 id?

laravel passport是否在承载令牌中序列化整个用户对象?

php Laravel护照从用户创建令牌

使用护照Laravel创建令牌时出现异常

Laravel 通过生成的令牌进行身份验证,无需护照和 jwt

护照密码授予令牌刷新