Пользовательский паспорт Laravel BearerTokenResponse

В настоящее время у меня есть установка 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 файл в мой репозиторий.

Это кажется мне очень грязным и ненадежным. Есть ли лучший / более чистый способ добиться этого?

2

Решение

Чтобы использовать ваш собственный ответ, вы можете добавить собственный сервер авторизации, например:

<?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,
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]