Получить пароль клиента из паспорта токена доступа laravel

я использую паспорт в laravel, и после проверки пользователя я хочу сгенерировать для них токен с токеном обновления. чтобы получить токен обновления, я должен отправить запрос на завивку с помощью password grant_type. после создания токена доступа я хочу получить Password Grant Client из базы данных и передать его своему телу curl. я нашел этот фрагмент кода:

 $tokenId = (new Parser(new JoseEncoder()))->parse($token)->claims()->get('jti');
 $client = \Laravel\Passport\Token::find($tokenId)->client;

и результат проблемы клиентской переменной Personal Access Client не Password Grant Client и получить эту ошибку из-за ее personal type:

{
    "error": "invalid_client",
    "error_description": "Client authentication failed",
    "message": "Client authentication failed"
}
    

это мой код:

$token = $user->createToken(Config::get('auth.guards.api.token_name'))->accessToken;
        $tokenId = (new Parser(new JoseEncoder()))->parse($token)->claims()->get('jti');
        $client = \Laravel\Passport\Token::find($tokenId)->client;

        $http = new \GuzzleHttp\Client();
        try {
            $response = $http->request('POST', url("/oauth/token"), [
                'form_params' => [
                    'grant_type' => 'password',
                    'client_id' => $oClient->id,
                    'client_secret' => $oClient->secret,
                    'username' => $username,
                    'password' => $password,
                    'scope' => '*',
                ],
            ]);
        } catch (\Exception $exception) {
        }

как я могу справиться с этим?

Я не уверен, что понимаю, что вы пытаетесь сделать. С OAuth есть сервер авторизации и клиент. Сервер авторизации (OAuth) предоставляет токены, а клиент получает эти токены и отправляет их. Из приведенного выше кода видно, что вы одновременно создаете токены и запрашиваете токены у клиента? Или первые 3 строки являются частью сервера авторизации?

Bernard Wiesner 11.05.2022 02:36

@BernardWiesner Я хочу сгенерировать токен в своем API и отправить его обратно клиенту с его токеном обновления, а для создания соответствующего токена обновления мне нужно отправить запрос на публикацию curl, который существует в моем фрагменте кода. вопрос в том, каково значение параметров client_id и client_secret и как я могу их достичь?

connecta admin 11.05.2022 13:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Для получения client_id и client_secret для Password Grant Client вам необходимо выполнить следующую команду на вашем сервере авторизации (сервере OAuth), как указано здесь https://laravel.com/docs/9.x/passport#creating-a-password-grant-client

php artisan passport:client --password

Приведенную выше команду не нужно запускать, если вы уже выполнили passport:install. Самый простой способ — проверить таблицу oauth_clients на наличие столбца password_client, там должна быть строка, в которой это значение установлено на 1 (включено).

Судя по вашему вопросу, вы пытаетесь программно получить client_id и client_secret от своего клиента. Это не правильный способ сделать это. По сути, после того, как вы запустите приведенную выше команду для создания ваших client_id и client_secret, вам нужно жестко закодировать их в своем .env и использовать их в своем CURL, например:


$response = Http::asForm()->post('http://passport-app.test/oauth/token', [
    'grant_type' => 'password',
    'client_id' => env('OAUTH_CLIENT_ID'),
    'client_secret' => env('OAUTH_CLIENT_SECRET'),
    'username' => $username,
    'password' => $password,
    'scope' => '*',
]);
 
return $response->json();

Вы можете получить свои client_id и client_secret из таблицы oauth_clients. Просто не забудьте скопировать значения, где столбец password_client установлен на 1.

Не должно быть никаких проблем с безопасностью, если ваш клиент хранит эти учетные данные в бэкэнде и выполняет CURL из бэкэнда.

В случае, если вы пытаетесь сделать это из мобильного приложения и у вас может не быть способа безопасно сохранить client_id и client_secret. В этом случае вы должны использовать не поток Password Grant Client, а вместо него Authorization Code Grant with PKCE: https://laravel.com/docs/9.x/passport#code-grant-pkce

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