Недавно я разработал password grant API, который будет использоваться моим клиентским приложением. Он успешно генерирует токены доступа для пользователей после авторизации клиента.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, как передать токен доступа обратно из клиентского приложения в Laravel с каждым запросом? (как это сделано заголовками в паспорте) Я прошел аутентификацию API laravel по паспортной документации.
Что я пытаюсь сделать
Я уже тестировал рабочий процесс API на почтальоне. Он работал нормально. Но теперь я пытаюсь все жестко закодировать. Итак, теперь я пытаюсь получить сообщения для users who are having the access tokens.
api.php (файл маршрутов)
Route::post('login', 'API\UserController@userSignIn')->name('login');
Route::middleware('auth:api')->get('/posts', function() {
$accessToken = Cookie::get('accessToken');
$client = new \GuzzleHttp\Client;
$response = $client->request('GET', 'http://tcc.devp/api/posts', [
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
],
]);
return $accessToken;
})->name('posts');
API / UserController.php
public function userSignIn(Request $request){
if (Auth::attempt(['email' => $request['email'], 'password' => $request['password']])){
$http = new \GuzzleHttp\Client;
$response = $http->post('http://tcc.devp/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 'client_id',
'client_secret' => 'client_secret',
'username' => $request['email'],
'password' => $request['password'],
'scope' => '*'
],
]);
$response_array = json_decode((string) $response->getBody()->getContents(), true);
$accessToken = $response_array['access_token'];
$refreshToken = $response_array['refresh_token'];
Cookie::queue('accessToken', $accessToken, 60);
Cookie::queue('refreshToken', $refreshToken, 60);
return redirect()->route('posts'); //MethodNotAllowedException due to this line
}
else{
return response()->json(['error'=>'Unauthorised'], 401);
}
}
При этом я получаю ошибку MethodNotAllowedHttpException. Я узнал, что это потому, что я перенаправляю свой почтовый запрос на другую страницу в контроллере. на вкладке сети отображается статус 302.
У меня есть два вопроса, которые я хочу задать вам -
MethodNotAllowedHttpException?I have found no resources on the internet to guide me in this directionСтек ошибок
Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException: in file C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\RouteCollection.php on line 255 Stack trace:
Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException->() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\RouteCollection.php:255
Illuminate\Routing\RouteCollection->methodNotAllowed() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\RouteCollection.php:242
Illuminate\Routing\RouteCollection->getRouteForMethods() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\RouteCollection.php:176
Illuminate\Routing\RouteCollection->match() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Router.php:612
Illuminate\Routing\Router->findRoute() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Router.php:601
Illuminate\Routing\Router->dispatchToRoute() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Router.php:590
Illuminate\Routing\Router->dispatch() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php:176
Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:30
Illuminate\Routing\Pipeline->Illuminate\Routing{closure}() C:\xampp\htdocs\xampp\tcc\vendor\fideloper\proxy\src\TrustProxies.php:56
Fideloper\Proxy\TrustProxies->handle() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:149
Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
Illuminate\Routing\Pipeline->Illuminate\Routing{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php:30
Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:149
Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
Illuminate\Routing\Pipeline->Illuminate\Routing{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php:30
Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:149
Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
Illuminate\Routing\Pipeline->Illuminate\Routing{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ValidatePostSize.php:27
Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:149
Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
Illuminate\Routing\Pipeline->Illuminate\Routing{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode.php:46
Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:149
Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53
Illuminate\Routing\Pipeline->Illuminate\Routing{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:102
Illuminate\Pipeline\Pipeline->then() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php:151
Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php:116
Illuminate\Foundation\Http\Kernel->handle() C:\xampp\htdocs\xampp\tcc/public\index.php:55
Я должен перенаправить пользователя после входа в систему. В любом случае он должен будет выполнять две обязанности. Это дает ошибку только для запросов api.
Нет необходимости выполнять перенаправление в API при входе пользователя в систему, как упоминали другие. После вызова userLogIn потребители получат cookie для использования в других вызовах, которые будут аутентифицировать пользователя. Для этого вам нужно будет добавить дополнительное промежуточное ПО согласно rosswintle.uk/2018/01/laravel-simple-cookie-auth-simple-apis






How can I get rid of MethodNotAllowedHttpException error?
Если вы возвращаете ответ перенаправления от контроллера Laravel, следующий запрос всегда будет запросом GET. Чтобы избежать ошибки MethodNotAllowedHttpException:
GET, зарегистрированный для пути, который вы использовали в ответе на перенаправление.Is my way of passing the access token to the request correct? If not how can I do that? I have found no resources on the internet to guide me in this direction
Ваш способ отправки токена доступа будет работать. Будет лучше, если вы сможете справиться с случаем, когда истекает срок действия токена доступа. В этом случае сервер может автоматически обмениваться новым токеном доступа, используя токен обновления.
Лично я не рекомендую отправлять токен доступа и токен обновления клиенту. Обычно я сохраняю эти токены в базах данных или кешах серверов, скрывая токены от клиента.
У меня уже есть метод GET, зарегистрированный для перенаправления.
Могу ли я перенаправить пользователя с конечной точки api? Все еще изучаю
Конечная точка API не должна возвращать перенаправление (30x). Он должен возвращать ответы 20x, 40x или 50x.
даже если я удаляю return redirect()->route('posts'); из UserController и пытаюсь вручную получить доступ к маршруту сообщений (GET Method registered), ошибка сохраняется.
Не могли бы вы опубликовать всю трассировку стека ошибок на свой вопрос? Это очень поможет.
Я присоединяю это к вопросу.
Спасибо за трассировку стека. Кажется, твои маршруты в порядке. Вы знаете, какой запрос возвращает ответ перенаправления, а какой - ошибку?
Я занимался отладкой, чтобы выяснить причину получаемой ошибки. Я обнаружил, что когда я оборачиваю маршруты в промежуточное ПО auth:api, я получаю эту ошибку. Правильно ли я передаю заголовки?
Привет @UjjwalVerma, вы зарегистрировали метод GET для пути /login? Промежуточное ПО auth:api вернет перенаправление на страницу /login, если пользователь, вызывающий API, не аутентифицирован для ваше приложение.
Похоже, способ передачи токена доступа (хороший или нет) должен работать. Что кажется неточным, так это попытка вернуть сообщения прямо внутри вашего метода userSignIn. Это возложит на метод две разные обязанности. Как насчет выполнения нового вызова к сообщениям после того, как вы успешно вошли в систему?