代码之家  ›  专栏  ›  技术社区  ›  Error404 Pasa89

直接从代码调用accessTokenController.issueToken()

  •  1
  • Error404 Pasa89  · 技术社区  · 8 年前

    我使用laravel passport来保护我的rest api。目前,我使用 $user->createToken('APP_NAME')->accessToken ,但没有有效期。所以我想创建一个密码访问令牌。我注意到,这些是由 AccessTokenController.issueToken() 方法。

    但是我找不到任何我可以称之为它的东西。


    我目前的解决方案

    $input = $request->all();
    
    $user = User::where('email', $input['email'])->first();
    
    if ($user) {
        if ($input['password'] == $user->password) {
            $token = $user->createToken($this->app_name)->accessToken;
            return [
                'token' => $token,
                'user' => $user
            ];
        } else
            return new ResponseGeneratorError('Password mismatch', 400);
    } else
        return new ResponseGeneratorError('User does not exist', 400);
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Error404 Pasa89    8 年前

    我找到了解决办法 here :

    <?php
    
    namespace App\Traits;
    
    use App\User;
    use DateTime;
    use GuzzleHttp\Psr7\Response;
    use Illuminate\Events\Dispatcher;
    use Laravel\Passport\Bridge\AccessToken;
    use Laravel\Passport\Bridge\AccessTokenRepository;
    use Laravel\Passport\Bridge\Client;
    use Laravel\Passport\Bridge\RefreshTokenRepository;
    use Laravel\Passport\Passport;
    use Laravel\Passport\TokenRepository;
    use League\OAuth2\Server\CryptKey;
    use League\OAuth2\Server\Entities\AccessTokenEntityInterface;
    use League\OAuth2\Server\Exception\OAuthServerException;
    use League\OAuth2\Server\Exception\UniqueTokenIdentifierConstraintViolationException;
    use League\OAuth2\Server\ResponseTypes\BearerTokenResponse;
    
    # https://github.com/laravel/passport/issues/71
    
    /**
     * Trait PassportToken
     *
     * @package App\Traits
     */
    trait PassportToken {
        /**
         * Generate a new unique identifier.
         *
         * @param int $length
         *
         * @throws OAuthServerException
         *
         * @return string
         */
        private function generateUniqueIdentifier($length = 40) {
            try {
                return bin2hex(random_bytes($length));
                // @codeCoverageIgnoreStart
            } catch (\TypeError $e) {
                throw OAuthServerException::serverError('An unexpected error has occurred');
            } catch (\Error $e) {
                throw OAuthServerException::serverError('An unexpected error has occurred');
            } catch (\Exception $e) {
                // If you get this message, the CSPRNG failed hard.
                throw OAuthServerException::serverError('Could not generate a random string');
            }
            // @codeCoverageIgnoreEnd
        }
    
        private function issueRefreshToken(AccessTokenEntityInterface $accessToken) {
            $maxGenerationAttempts = 10;
            $refreshTokenRepository = app(RefreshTokenRepository::class);
    
            $refreshToken = $refreshTokenRepository->getNewRefreshToken();
            $refreshToken->setExpiryDateTime((new \DateTime())->add(Passport::refreshTokensExpireIn()));
            $refreshToken->setAccessToken($accessToken);
    
            while ($maxGenerationAttempts-- > 0) {
                $refreshToken->setIdentifier($this->generateUniqueIdentifier());
                try {
                    $refreshTokenRepository->persistNewRefreshToken($refreshToken);
    
                    return $refreshToken;
                } catch (UniqueTokenIdentifierConstraintViolationException $e) {
                    if ($maxGenerationAttempts === 0) {
                        throw $e;
                    }
                }
            }
        }
    
        protected function createPassportTokenByUser(User $user, $clientId) {
            $accessToken = new AccessToken($user->id);
            $accessToken->setIdentifier($this->generateUniqueIdentifier());
            $accessToken->setClient(new Client($clientId, null, null));
            $accessToken->setExpiryDateTime((new DateTime())->add(Passport::tokensExpireIn()));
    
            $accessTokenRepository = new AccessTokenRepository(new TokenRepository(), new Dispatcher());
            $accessTokenRepository->persistNewAccessToken($accessToken);
            $refreshToken = $this->issueRefreshToken($accessToken);
    
            return [
                'access_token' => $accessToken,
                'refresh_token' => $refreshToken,
            ];
        }
    
        protected function sendBearerTokenResponse($accessToken, $refreshToken) {
            $response = new BearerTokenResponse();
            $response->setAccessToken($accessToken);
            $response->setRefreshToken($refreshToken);
    
            $privateKey = new CryptKey('file://' . Passport::keyPath('oauth-private.key'), null, false);
    
            $response->setPrivateKey($privateKey);
            $response->setEncryptionKey(app('encrypter')->getKey());
    
            return $response->generateHttpResponse(new Response);
        }
    
        /**
         * @param \App\User $user
         * @param $clientId
         * @param bool $output default = true
         * @return array | \League\OAuth2\Server\ResponseTypes\BearerTokenResponse
         */
        protected function getBearerTokenByUser(User $user, $clientId, $output = true) {
            $passportToken = $this->createPassportTokenByUser($user, $clientId);
            $bearerToken = $this->sendBearerTokenResponse($passportToken['access_token'], $passportToken['refresh_token']);
    
            if (!$output) {
                $bearerToken = json_decode($bearerToken->getBody()->__toString(), true);
            }
    
            return $bearerToken;
        }
    }
    

    我变了 new CryptKey('file://' . Passport::keyPath('oauth-private.key')) new CryptKey('file://' . Passport::keyPath('oauth-private.key'), null, false) 为了避免权限不正确的错误(从 here )

    推荐文章