Я успешно создал server.app и client.app с использованием документации Laravel Passport . Все работает так, как ожидалось.
client.app Маршрут:
Route::get('callback', function (Request $request) { $http = new GuzzleHttp\Client; $response = $http->post('http://server.app/oauth/token', [ 'form_params' => [ 'grant_type' => 'authorization_code', 'client_id' => 3, 'client_secret' => 'secret', 'redirect_uri' => 'http://client.app/callback', 'code' => $request->code ] ]); return json_decode((string) $response->getBody(), true)['access_token']; });
По умолчанию этот маршрут возвращает access_token , с которым я могу делать все, что захочу.
Запрос:
http://server.app/oauth/authorize?client_id=3&redirect_uri=http%3A%2F%2Fclient.app%2Fcallback&response_type=code&scope=
Возвращает:
http://client.app/callback?code=access_token
Вопрос:
Как сделать правильный запрос server.app с данным access_token в client.app, чтобы получить, например, адрес (ы) пользователя .
Должен ли я использовать: http://server.app/api/user
запрос на получение данных? Если да, то как я могу это сделать? Если возможно, напишите код.
Спасибо за любые ответы.
Я был абсолютно безумным в этом вопросе! Это просто не имело большого смысла в том, почему он продолжал выплевывать глупую ошибку Unauthenticated
при попытке нанести такой маршрут, как /api/user
. После долгих поисков (MUCH search) я наконец нашел ответ. Если вы видите этот праздник от Laracasts, вы мой герой!
Вы проверяли
app\Providers\RouteServiceProvider.php
?в
mapApiRoutes()
вы можете установить промежуточное программное обеспечение . проверьте, чтобы егоauth:api
. если его нет, измените его. также удалите промежуточное ПОauth
из файлаapi.php
маршрута.
Редактировать:
После app\Providers\RouteServiceProvider.php
изменений в app\Providers\RouteServiceProvider.php
упомянутое выше, перейдите к приведенному ниже примеру.
Прежде всего, нам нужно получить свежий access_token
. Для этого я использую пароль grant_type
(подробнее: https://laravel.com/docs/5.4/passport#password-grant-tokens )
Чтобы получить новый access_token
, я создал новый маршрут на routes/web.php
и назвал его /connect
. Затем я разместил код из приведенной выше ссылки:
Route::get('connect', function (Request $request) { $http = new GuzzleHttp\Client; $response = $http->post('http://example.com/oauth/token', [ 'form_params' => [ 'grant_type' => 'password', 'client_id' => $request->client_id, 'client_secret' => $request->client_secret, 'username' => $request->username, 'password' => $request->password, 'scope' => '' ], ]); return json_decode((string) $response->getBody(), true); });
Используя Chrome Postman , вам необходимо:
GET
Accept
и значение application/json
Пример результата:
{ "token_type": "Bearer", "expires_in": 31535999, "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImE0MmFiYjZkNTQ5M2ZjMGQxYzVmM2E3MDFlOTNjMTRlOTQxMTBmNWQ5NmI1ODI0NTBmMmEyM2MwMzQ5OTMwODdiZGUwYTI5ZDU5N2VjYTExIn0.eyJhdWQiOiIxIiwianRpIjoiYTQyYWJiNmQ1NDkzZmMwZDFjNWYzYTcwMWU5M2MxNGU5NDExMGY1ZDk2YjU4MjQ1MGYyYTIzYzAzNDk5MzA4N2JkZTBhMjlkNTk3ZWNhMTEiLCJpYXQiOjE0OTE0Njg4ODIsIm5iZiI6MTQ5MTQ2ODg4MiwiZXhwIjoxNTIzMDA0ODgxLCJzdWIiOiI3NWNlZDUwMC0xNTQ0LTExZTctOWE4ZS1hZDVmMWFlZTM4OWUiLCJzY29wZXMiOltdfQ.dV3DKDM7IN-oGnZ_Rw10VnYkh9ySlz5i859yO0roZLAYwgmsmEEZK_vpttudUoKmYenqibZQXg6HG4KHRd-cgas_2DpO-7UCkXQYNTriUUAQ4XM6To86EOaf2BW1a07kdVGXTdo_ETQc7heUG0NWQ8-Hrr2NHkSyDULupDs8gDg_fg6xSVsFUEDZB32UIGwquAHT1Y21ZpTdQar0Rag9qOLeZYTR05ro0v9_rQbSoDgJiZE3KT9GbqwU_BegWRmAwY6LmxG4raZpSMgqYEMo3D9D0lJiomOLK4pSjqmi0EVti04zZ6Vg4GHE6S1TgC6IlakV2bMItXTWuZT6T0jEba-3ctaC4K2T8F4P8J6t-99mKY-_zSwgfGm1FErK09qixJlZ4zFsCCT7MgNQVoyu7GkJdTJVlpL1QXLc1QhfrtW11a4gg4Nlja_VyRdB9fZHomgMLpvm_HvSlqEvpeWb8wGkCts9w7ivSNLim-LuFgswGNhTZZqLEbuwB6sJV-l1V0MJCq7_h0yTmLlBdoUkxCaDJJvkUSLk0MUaalAAzY1OCxm-tJcKn31m4yOwf25ZDWf8tWuOTKarEbFyxjB0elkxXQXGe7J7TJAg0tuIEQ8YTL3ExJQ6I7zwtCL83bPOWYRGlJrsX6Lsf0qB-xMVD2DzA3JKDKvZTp5x92kP821", "refresh_token": "ArOWW0glHjflLpL4fKOsrNUXT5v91u+CjwcE8LBvH7GJsaM0gWaFe8GH9zXjh8SHew+cg7v1IMiIPLYSVdf7h8oOeV7wgwjChI9YM0Kt6iE4wOXJuy0VwPSCj+danHDuWC3nJWYLrPydTE3h/jgFNjWEPfgXGLfiRWjWQMozddz5EWd4pvUI7J64Lw6cMCg/BslZLHtfN7IWoC1RQGp5K0cGO0QmZfsGMSzsoSUNFjv16BXiKSqlNvs5aGhxErFY4wEOKqBifXUkb3SwnK/iHKg3irmqj4fOf/aKNyCdd/PJCHrRPocrW83oM1sjq7eDufEIlgxmy7uRset8GLAWjx/n6rzkxz2QM0/9Lyc/XN9OL00XBYjA47a1wL55qUUUYWevaFwxWX8LG2UjBf9Vv2lfvLcBBkbgqpalePMDh6wb8IDyJek4BbvZtJ1VZ/l+A9XXY9rQt/hIDdoOAtib8CGr9/CERFIrByZa3TEJBCLAa2FvJSIhHVnKvnuvZX3e9qhTkgHqowJrWg2C3VyPDQYAdIhdpTEvs0pcGSAZWhwXfu9xKQOeyRTEScbLKQmuW+sGbwU+qfdLgh/BR5kW4TMer4TIzWKSuHsqmibgiUwaQkwTrtjH2Xz9Z9XmAbVzJ8pqbEZPe7t5whXDoRSnAwWymdxk2E7SiSsVUA3kX39=" }
Выделите строку access_token
и скопируйте ее в текстовый редактор.
Затем вам нужно будет создать новый маршрут в routes/api.php
. В приведенном ниже маршруте будет просто выводиться информация о текущих пользователях API:
Route::group(['prefix' => 'user'], function() { Route::get('/', function() { return response()->json(request()->user()); }); });
После того, как вы сделали это, внесите эти изменения в Postman:
GET
Authorization
и значение Bearer access_token_here
(замените access_token_here
с помощью маркера доступа, который вы скопировали ранее) Пример вывода:
{ "id": "75ced500-1544-11e7-9a8e-ad5f1aee389e", "name": "test test", "email": "test@test.com", "created_at": "2017-03-30 23:29:03", "updated_at": "2017-03-30 23:29:03" }
Вы пытались запустить его на POSTMAN Chrome? Если нет, загрузите его. https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en
Заполните информацию.
После того, как вы успешно сгенерировали данные, нажмите кнопку CODE в правом верхнем углу (я выделил ее зеленым цветом).
Наконец, выберите свой язык и скопируйте код. Для PHP я выбрал php cURL.
Надеюсь, что это работает.
Согласно документации Laravel, вы должны добавить маршрут к серверному приложению ( routes/api.php
): $ response-> getBody ();
Route::get('/user', function () { // authenticated user. Use User::find() to get the user from db by id return app()->request()->user(); })->middleware('auth:api');
Сделать запрос через quzzle:
$response = $client->request('GET', '/api/user', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '.$accessToken, ], ]); echo $response->getBody();