Я только что прочитал документацию https://laravel.com/docs/5.6/passport, и у меня есть некоторые сомнения, что, надеюсь, кто-то может мне помочь:
Во-первых, в некотором контексте, я хочу использовать Passport как способ обеспечить аутентификацию Oauth для моего мобильного приложения (стороннего приложения).
Когда я использую php artisan passport:client --password, я получаю идентификатор клиента и секрет клиента. Нужно ли фиксировать это значение в моем приложении? например, хранить их в жестком коде или в виде файла "настроек"? Если значения не должны храниться, как это должно работать?
Чтобы зарегистрировать пользователя в моем приложении, я использую: $user->createToken('The-App')->accessToken;. Я понимаю, что accessToken будет использоваться для отправки всех моих запросов в качестве заголовка (Authorization => Bearer $ accessToken), но что именно означает значение «The-App»?
Для входа пользователя я использую URL-адрес: http://example.com/oauth/token и отправляю в качестве параметров:
{ "имя пользователя": "[email protected]", "пароль": "пароль пользователя", "grant_type": "пароль", "client_id": 1, // Идентификатор клиента, который я получил от команды (вопрос 1) "client_secret": "Shhh" // Секрет клиента, который я получил от команды (вопрос 1) }
Когда я вхожу в систему с помощью предыдущей конечной точки, я возвращаю 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) сфера: ''
Следует ли мне использовать эту конечную точку? или не является необходимым для приложения, которое я пытаюсь разработать.
oauth/clients*, oauth/personal-access-tokens*, есть ли способ удалить их с конечных точек, опубликованных в паспорте?Большое спасибо за твою помощь!
Привет, @Wellwisher, можешь мне сказать, почему я не могу использовать эту опцию?
Этот вариант предназначен для создания токена личного доступа, и в вашем коде вы использовали пароль grand. Для генерации токена используйте этот метод laravel.com/docs/5.6/passport#requesting-password-grant-toke ns






Если вы используете свой собственный 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.
просто любопытно, я уже много лет использую API, поставщики API всегда предоставляют client_id и client_secret для аутентификации. зачем нам электронная почта и пароль здесь в паспорте laravel?
@ amansoni211 да, вы правы, но в этом случае мы обычно вызываем эти api со стороны сервера. Здесь вопрос в том, чтобы использовать client_id и client_secrect на стороне приложения, и для этого вы не можете хранить их на стороне клиента. Надеюсь, это поможет вам
@rkj Хорошо объяснил, спасибо. Какой метод аутентификации вы бы предложили [в паспорте], если нужно предоставить мой API бизнес-партнерам, которые в конечном итоге получат доступ к моим API со своих веб-серверов?
Ответ на вопрос 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
Для предоставления пароля вы не можете использовать
$user->createToken('The-App')->accessToken;для генерации токена доступа