Как правильно реализовать индивидуальный грант паспорта Laravel?

Я возился с паспортом laravel, и я не могу реализовать настраиваемый тип гранта. Я использую laravel 5.6 с паспортом 6.0. После исследования я создал CustomRequestGrantProvider и CustomRequestGrant аналогично в этом Библиотека CustomGrant, но мне не повезло, и каждый раз я делал POST-запрос к локальный: 8000 / oauth / токен с grant_type, client_id и client_secret

{"error": "unsupported_grant_type",
"message": "The authorization grant type is not supported by the authorization server.",
"hint": "Check that all required parameters have been provided"}

И, похоже, моя просьба даже не проходит. Обязательно добавил провайдера в app.php

Это мой CustomRequestGrantProvider

class CustomRequestGrantProvider extends PassportServiceProvider{


public function boot()
{
    $this->loadViewsFrom(__DIR__.'/../resources/views', 'passport');
    $this->deleteCookieOnLogout();


}

public function register()
{
    $this->registerAuthorizationServer();
}

protected function registerAuthorizationServer()
{
    $this->app->singleton(AuthorizationServer::class, function () {
        return tap($this->makeAuthorizationServer(), function ($server) {
            $server->enableGrantType(
                $this->makeCustomRequestGrant(), Passport::tokensExpireIn()
            );
        });
    });
}

protected function makeCustomRequestGrant()
{
    $grant = new CustomRequestGrant(
        $this->app->make(UserRepository::class),
        $this->app->make(RefreshTokenRepository::class)
    );
    $grant->setRefreshTokenTTL(Passport::refreshTokensExpireIn());
    return $grant;
}}

а это мой CustomRequestGrant

class CustomRequestGrant extends AbstractGrant{

public function __construct(
    UserRepositoryInterface $userRepository,
    RefreshTokenRepositoryInterface $refreshTokenRepository
)
{
    $this->setUserRepository($userRepository);
    $this->setRefreshTokenRepository($refreshTokenRepository);
    $this->refreshTokenTTL = new \DateInterval('P1M');
}

public function respondToAccessTokenRequest(
    ServerRequestInterface $request,
    ResponseTypeInterface $responseType,
    \DateInterval $accessTokenTTL
)
{
    // Validate request
    $client = $this->validateClient($request);
    $scopes = $this->validateScopes($this->getRequestParameter('scope', $request));
    $user = $this->validateUser($request);
    // Finalize the requested scopes
    $scopes = $this->scopeRepository->finalizeScopes($scopes, $this->getIdentifier(), $client, $user->getIdentifier());
    // Issue and persist new tokens
    $accessToken = $this->issueAccessToken($accessTokenTTL, $client, $user->getIdentifier(), $scopes);
    $refreshToken = $this->issueRefreshToken($accessToken);
    // Inject tokens into response
    $responseType->setAccessToken($accessToken);
    $responseType->setRefreshToken($refreshToken);
    return $responseType;
}

public function getIdentifier()
{
    return 'custom_request';
}

protected function validateUser(ServerRequestInterface $request)
{
    $laravelRequest = new Request($request->getParsedBody());
    $user = $this->getUserEntityByRequest($laravelRequest);
    if ($user instanceof UserEntityInterface === false) {
        $this->getEmitter()->emit(new RequestEvent(RequestEvent::USER_AUTHENTICATION_FAILED, $request));
        throw OAuthServerException::invalidCredentials();
    }
    return $user;
}

protected function getUserEntityByRequest(Request $request)
{
    if (is_null($model = config('auth.providers.users.model'))) {
        throw OAuthServerException::serverError('Unable to determine user model from configuration.');
    }
    if (method_exists($model, 'byPassportCustomRequest')) {
        $user = (new $model)->byPassportCustomRequest($request);
    } else {
        throw OAuthServerException::serverError('Unable to find byPassportCustomRequest method on user model.');
    }
    return ($user) ? new User($user->id) : null;
}} 

Примечание: весь импорт и пространство имен верны, я просто удалил их для этого поста.

Я даже думал о редактировании библиотеки паспортов, но не уверен, насколько она будет устойчивой в будущем.

Любая помощь очень ценится.

Несколько ссылок:

Пользовательские гранты?

Устаревший пример настраиваемого гранта

Обсуждение на Github

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
1 157
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В итоге я создал собственные классы, реализующие исходные классы (Взгляните на картинку ниже).

Классы, необходимые для свойства laravel / паспорт, - это классы на картинке ниже без Обычай в начале.

Для CustomUserRepositoryInterface вам нужно только изменить UserRepositoryInterface, если, например, вам нужно отправить дополнительный параметр в почтовый запрос laravel.

Это дало мне возможность сильно настроить паспорт laravel, например, передать несколько типов учетных записей, которые имеют разные способы доступа к приложению (например, войти в систему с помощью номера телефона, электронной почты, facebook_token и id).

Мне жаль, что я не вдавался в ответ, но я думал о создании библиотеки и публикации моей работы на github и, конечно, обновил ответ и поделился ссылкой, но тем не менее, это единственные классы, которые вам нужны переделать, чтобы добиться такого результата.

Хорошего дня :)

Другие вопросы по теме