Laravel护照从数据库获取令牌

时间:2018-12-14 12:02:42

标签: laravel laravel-passport

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

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

它生成带有1075个字符的令牌,其中'oauth_access_tokens'表中的条目具有 80个字符的标识

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

2 个答案:

答案 0 :(得分:0)

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

Passport link to issue

您还可以检查通行证存储库 link

中 access_token 的生成

答案 1 :(得分:0)

(这是在 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;