я использую паспорт в 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) {
}
как я могу справиться с этим?
@BernardWiesner Я хочу сгенерировать токен в своем API и отправить его обратно клиенту с его токеном обновления, а для создания соответствующего токена обновления мне нужно отправить запрос на публикацию curl, который существует в моем фрагменте кода. вопрос в том, каково значение параметров client_id и client_secret и как я могу их достичь?






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