В настоящее время у меня есть установка 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
файл в мой репозиторий.
Это кажется мне очень грязным и ненадежным. Есть ли лучший / более чистый способ добиться этого?
Чтобы использовать ваш собственный ответ, вы можете добавить собственный сервер авторизации, например:
<?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,
Других решений пока нет …