2017-01-19 2 views
9

Я успешно создал server.app и client.app с помощью Laravel паспорта документации. Все работает так, как ожидалось.Получить данные пользователя, используя маркер доступа в клиентском приложении Laravel паспортного

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 с заданным переменным током cess_token в client.app, чтобы получить, например, пользователь (ы) email (ы).

Должен ли я использовать: http://server.app/api/user запрос на получение данных? Если да, то как я могу это сделать? Если возможно, напишите код.

Спасибо за любые ответы.

ответ

19

Я был абсолютно безумным в этом вопросе! Он просто не задавался вопросом, почему он продолжал выплевывать глупую ошибку Unauthenticated при попытке нанести такой маршрут, как /api/user. После долгих поисков (MUCH search) я наконец нашел ответ. Если вы видите этот праздник от Laracasts, вы мой герой!

Did you check app\Providers\RouteServiceProvider.php ?

in the mapApiRoutes() you can set the middleware. check to make sure its auth:api . if its not, change it. also, remove the auth middleware from the route api.php file.

https://laracasts.com/discuss/channels/laravel/laravel-53-passport-api-unauthenticated-in-postman-using-personal-access-tokens

Edit:

После того, как вы сделали изменения в 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, вам необходимо:

  1. Установите метод GET
  2. Введите URL соединять с соответствующим Params т.е. http://example.com/connect?client_id=1&client_secret=W2zogh7tiBh2jfHleYuzpViv7dqynDYQ6O07DKLj&[email protected]&password=123456
  3. Нажмите на заголовок вкладка (рядом с авторизацией), добавьте ключ Accept и значение application/json
  4. Хит кнопку Отправить

Пример результата:

{ 
    "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()); 
    }); 
}); 

После того, как вы сделали выше, внести эти изменения в Почтальон:

  1. Установите метод GET
  2. Изменение URL, чтобы указать на API маршрут, т.е. http://example.com/api/user
  3. Нажмите на заголовки вкладку снова и добавить новый ключ Authorization и значение Bearer access_token_here (замените access_token_here с доступом фишку скопированный ранее)
  4. Нажмите кнопку Отправить

Пример вывода:

{ 
    "id": "75ced500-1544-11e7-9a8e-ad5f1aee389e", 
    "name": "test test", 
    "email": "[email protected]", 
    "created_at": "2017-03-30 23:29:03", 
    "updated_at": "2017-03-30 23:29:03" 
} 
+0

В моем случае я в конечном итоге предоставил каждому пользователю персональный токен доступа ... вы протестировали свое решение и оно работает? – Tauras

+0

Протестировано и тщательно работает, . Не мог поверить простой своп на промежуточном программном обеспечении от 'api' до' auth: api' на RouteSer ViceProvider.php было всем, что было необходимо. Вы хотите, чтобы я добавил подробный шаг за шагом, используя Chrome Postman, чтобы вы могли видеть все? – adamj

+0

Ну, я понимаю ваш ответ, но другие могут его не понимать. Обновите свой ответ на примере, и я отвечу на ваш ответ и отметьте его как правильный. – Tauras

1

Согласно Laravel documentation, вы должны добавить маршрут к серверному приложению (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(); 
+0

Спасибо за ответ. Получите мне несколько моментов, чтобы проверить его. – Tauras

+0

Мне не удалось. – Tauras

+0

Что вы получили в теле ответа? –

2

Вы пробовали запустить его на POSTMAN хром приложение? Если нет, загрузите его. https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en

Заполните информацию. enter image description here

После того как вы успешно сгенерировали данные, нажмите кнопку CODE в правом верхнем углу (я выделил ее зеленым цветом).

И наконец, выберите ваш язык и скопируйте его. Для PHP я выбрал php cURL.

Надеюсь, что он работает.