В настоящее время у меня есть установка Laravel с использованием Laravel Passport (который использует league/oauth2-server
для реализации сервера). Я хотел бы вернуть идентификатор пользователя, когда выделен маркер oauth2, поэтому я могу использовать его для идентификации пользователя, прошедшего проверку подлинности, в моем приложении EmberJS.
Предлагаемый способ:
Создайте свой собственный класс:
use League\OAuth2\Server\ResponseTypes\BearerTokenResponse; use League\OAuth2\Server\Entities\AccessTokenEntityInterface; class UserIdBearerTokenResponse extends BearerTokenResponse { protected function getExtraParams(AccessTokenEntityInterface $accessToken) { return [ 'user_id' => $this->accessToken->getUserIdentifier() ]; } }
Изменение AuthorizationServer.getResponseType()
в vendor/league/oauth2-server/src
protected function getResponseType() { if ($this->responseType instanceof ResponseTypeInterface === false) { // Return my own class instead of provided one $this->responseType = new UserIdBearerTokenResponse(); } $this->responseType->setPrivateKey($this->privateKey); return $this->responseType; }
Но для этого подхода мне необходимо добавить файл vendor/league/oauth2-server/src/AuthorizationServer.php
в мой vendor/league/oauth2-server/src/AuthorizationServer.php
git.
Это кажется мне очень грязным и ненадежным. Есть ли лучший / более чистый способ достичь этого?
Чтобы использовать свой собственный ответ, вы можете добавить настраиваемый сервер авторизации следующим образом:
<?php namespace App; use League\OAuth2\Server\AuthorizationServer; use League\OAuth2\Server\ResponseTypes\ResponseTypeInterface; class TokenServer extends AuthorizationServer { /** * Get the token type that grants will return in the HTTP response. * * @return ResponseTypeInterface */ protected function getResponseType() { if ($this->responseType instanceof ResponseTypeInterface === false) { $this->responseType = new UserIdBearerTokenResponse(); } $this->responseType->setPrivateKey($this->privateKey); return $this->responseType; } }
И пользовательский PassportServiceProvider выглядит так:
<?php namespace App\Providers; use App\TokenServer; class PassportServiceProvider extends \Laravel\Passport\PassportServiceProvider { /** * Make the authorization service instance. * * @return AuthorizationServer */ public function makeAuthorizationServer() { return new TokenServer( $this->app->make(\Laravel\Passport\Bridge\ClientRepository::class), $this->app->make(\Laravel\Passport\Bridge\AccessTokenRepository::class), $this->app->make(\Laravel\Passport\Bridge\ScopeRepository::class), 'file://'.storage_path('oauth-private.key'), 'file://'.storage_path('oauth-public.key') ); } }
А затем внесите следующие изменения в файл config / app.php:
/* * Package Service Providers... * We extend the packaged PassportServiceProvider with our own customization */ // Laravel\Passport\PassportServiceProvider::class, App\Providers\PassportServiceProvider::class,