Как использовать Laravel Passport с токенами предоставления пароля?

Я только что прочитал документацию https://laravel.com/docs/5.6/passport, и у меня есть некоторые сомнения, что, надеюсь, кто-то может мне помочь:

Во-первых, в некотором контексте, я хочу использовать Passport как способ обеспечить аутентификацию Oauth для моего мобильного приложения (стороннего приложения).

  1. Когда я использую php artisan passport:client --password, я получаю идентификатор клиента и секрет клиента. Нужно ли фиксировать это значение в моем приложении? например, хранить их в жестком коде или в виде файла "настроек"? Если значения не должны храниться, как это должно работать?

  2. Чтобы зарегистрировать пользователя в моем приложении, я использую: $user->createToken('The-App')->accessToken;. Я понимаю, что accessToken будет использоваться для отправки всех моих запросов в качестве заголовка (Authorization => Bearer $ accessToken), но что именно означает значение «The-App»?

  3. Для входа пользователя я использую URL-адрес: http://example.com/oauth/token и отправляю в качестве параметров:

    { "имя пользователя": "[email protected]", "пароль": "пароль пользователя", "grant_type": "пароль", "client_id": 1, // Идентификатор клиента, который я получил от команды (вопрос 1) "client_secret": "Shhh" // Секрет клиента, который я получил от команды (вопрос 1) }

  4. Когда я вхожу в систему с помощью предыдущей конечной точки, я возвращаю refresh_token, я читал, что могу обновить токен через http://example.com/oauth/token/refresh, но я пытаюсь запросить обновление. Я получил ошибку 419, я удалил url oauth / token / refresh из проверки csrf а теперь возвращаю "message": "Unauthenticated.", делаю такой запрос:

    Тип содержимого: x-www-form-urlencoded grant_type: refresh_token refresh_token: the-refresh-token // Токен обновления, который я получил от команды (вопрос 3) client_id: 1 // Идентификатор клиента, который я получил от команды (вопрос 1) client_secret: Shhh // Секрет клиента, который я получил от команды (вопрос 1) сфера: ''

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

  1. Наконец, есть много конечных точек, которые я получаю из паспорта, которые я не думаю, что буду использовать, например: oauth/clients*, oauth/personal-access-tokens*, есть ли способ удалить их с конечных точек, опубликованных в паспорте?

Большое спасибо за твою помощь!

Для предоставления пароля вы не можете использовать $user->createToken('The-App')->accessToken; для генерации токена доступа

Wellwisher 15.06.2018 11:05

Привет, @Wellwisher, можешь мне сказать, почему я не могу использовать эту опцию?

JohnnyAce 20.06.2018 06:20

Этот вариант предназначен для создания токена личного доступа, и в вашем коде вы использовали пароль grand. Для генерации токена используйте этот метод laravel.com/docs/5.6/passport#requesting-password-grant-toke‌ ns

Wellwisher 20.06.2018 06:47
Стоит ли изучать 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 и хотите разрабатывать...
21
3
15 696
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Если вы используете свой собственный api, вам не нужно вызывать http://example.com/oauth/token для входа пользователя, потому что тогда вам нужно сохранить client_id и client_secret на стороне приложения. Лучше создать api для входа в систему, и там вы можете проверить учетные данные и сгенерировать личный токен.

public function login(Request $request)
{
        $credentials = $request->only('email', 'password');

        if (Auth::attempt($credentials)) {
            // Authentication passed...
             $user = Auth::user();
             $token = $user->createToken('Token Name')->accessToken;

            return response()->json($token);
        }
}

Finally, there are a lot of endpoints that I get from passport that I don't think I will use for example: oauth/clients*, oauth/personal-access-tokens* is there a way to remove them from the endpoints published by passport?

Вам нужно удалить Passport::routes(); из AuthServiceProvider и вручную поставить только необходимые паспортные маршруты. Думаю, нужен только маршрут oauth/token.

what exactly is "The-App" value for?

если вы проверите таблицу oauth_access_tokens, у нее есть поле имени. $user->createToken('Token Name')->accessToken; здесь «Имя токена» хранится в поле имени.

How to use Laravel Passport with Password Grant Tokens?

Чтобы сгенерировать токен предоставления пароля, вы должны сохранить client_id и client_secret на стороне приложения (не рекомендуется, проверьте это) и предположим, что если вам нужно сбросить client_secret, тогда приложение старой версии перестанет работать, это проблемы. Чтобы сгенерировать токен предоставления пароля, вы должны вызвать этот API, как вы упомянули на шаге 3.

$http = new GuzzleHttp\Client;

$response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'username' => '[email protected]',
        'password' => 'my-password',
        'scope' => '',
    ],
]);

return json_decode((string) $response->getBody(), true);

Generate token from refresh_token

$http = new GuzzleHttp\Client;

$response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'refresh_token',
        'refresh_token' => 'the-refresh-token',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'scope' => '',
    ],
]);

return json_decode((string) $response->getBody(), true);

Вы тоже можете посмотреть этот https://laravel.com/docs/5.6/passport#implicit-grant-tokens.

jagadeshanh.wordpress.com/2016/12/27/… написал это немного давно. Тем не менее, его можно использовать как справочник.
Jagadesha NH 26.06.2018 07:45

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

amansoni211 06.12.2018 11:15

@ amansoni211 да, вы правы, но в этом случае мы обычно вызываем эти api со стороны сервера. Здесь вопрос в том, чтобы использовать client_id и client_secrect на стороне приложения, и для этого вы не можете хранить их на стороне клиента. Надеюсь, это поможет вам

rkj 06.12.2018 11:46

@rkj Хорошо объяснил, спасибо. Какой метод аутентификации вы бы предложили [в паспорте], если нужно предоставить мой API бизнес-партнерам, которые в конечном итоге получат доступ к моим API со своих веб-серверов?

amansoni211 06.12.2018 12:34

Ответ на вопрос 5

Finally, there are a lot of endpoints that I get from passport that I don't think I will use for example: oauth/clients*, oauth/personal-access-tokens* is there a way to remove them from the endpoints published by passport?


Passport::routes($callback = null, array $options = []) принимает необязательную функцию $callback и необязательный аргумент $options.

Функция обратного вызова принимает аргумент $router, из которого вы затем можете выбрать, какие маршруты установить, как показано ниже, в вашем AuthServiceProvider.php, что обеспечивает более детальную конфигурацию:

Passport::routes(function ($router) {
    $router->forAccessTokens();
    $router->forPersonalAccessTokens();
    $router->forTransientTokens();
});

Passport::tokensExpireIn(Carbon::now()->addMinutes(10));

Passport::refreshTokensExpireIn(Carbon::now()->addDays(10));

Таким образом, мы создаем только те паспортные маршруты, которые нам нужны.

forAccessTokens(); позволяют нам создавать токены доступа.
forPersonalAccessTokens(); позволяют нам создавать личные токены, хотя мы не будем использовать это в этой статье. Наконец, forTransientTokens(); создает маршрут для обновления токенов.

Если вы запустите php artisan route:list, вы увидите новые конечные точки, установленные Laravel Passport.

| POST | oauth/token         | \Laravel\Passport\Http\Controllers\AccessTokenController@issueToken
| POST | oauth/token/refresh | \Laravel\Passport\Http\Controllers\TransientTokenController@refresh

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