MethodNotAllowedException API предоставления пароля Laravel

Недавно я разработал 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.

У меня есть два вопроса, которые я хочу задать вам -

  1. Как мне избавиться от ошибки MethodNotAllowedHttpException?
  2. Правильно ли я передаю токен доступа в запрос? Если нет, то как я могу это сделать? 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:

  1. Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException->() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\RouteCollection.php:255

  2. Illuminate\Routing\RouteCollection->methodNotAllowed() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\RouteCollection.php:242

  3. Illuminate\Routing\RouteCollection->getRouteForMethods() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\RouteCollection.php:176

  4. Illuminate\Routing\RouteCollection->match() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Router.php:612

  5. Illuminate\Routing\Router->findRoute() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Router.php:601

  6. Illuminate\Routing\Router->dispatchToRoute() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Router.php:590

  7. Illuminate\Routing\Router->dispatch() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php:176

  8. Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:30

  9. Illuminate\Routing\Pipeline->Illuminate\Routing{closure}() C:\xampp\htdocs\xampp\tcc\vendor\fideloper\proxy\src\TrustProxies.php:56

  10. Fideloper\Proxy\TrustProxies->handle() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:149

  11. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53

  12. Illuminate\Routing\Pipeline->Illuminate\Routing{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php:30

  13. Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:149

  14. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53

  15. Illuminate\Routing\Pipeline->Illuminate\Routing{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php:30

  16. Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:149

  17. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53

  18. Illuminate\Routing\Pipeline->Illuminate\Routing{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ValidatePostSize.php:27

  19. Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:149

  20. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53

  21. Illuminate\Routing\Pipeline->Illuminate\Routing{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode.php:46

  22. Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:149

  23. Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php:53

  24. Illuminate\Routing\Pipeline->Illuminate\Routing{closure}() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:102

  25. Illuminate\Pipeline\Pipeline->then() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php:151

  26. Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter() C:\xampp\htdocs\xampp\tcc\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php:116

  27. Illuminate\Foundation\Http\Kernel->handle() C:\xampp\htdocs\xampp\tcc/public\index.php:55

Похоже, способ передачи токена доступа (хороший или нет) должен работать. Что кажется неточным, так это попытка вернуть сообщения прямо внутри вашего метода userSignIn. Это возложит на метод две разные обязанности. Как насчет выполнения нового вызова к сообщениям после того, как вы успешно вошли в систему?

alariva 05.08.2018 03:59

Я должен перенаправить пользователя после входа в систему. В любом случае он должен будет выполнять две обязанности. Это дает ошибку только для запросов api.

Ujjwal Verma 05.08.2018 04:05

Нет необходимости выполнять перенаправление в API при входе пользователя в систему, как упоминали другие. После вызова userLogIn потребители получат cookie для использования в других вызовах, которые будут аутентифицировать пользователя. Для этого вам нужно будет добавить дополнительное промежуточное ПО согласно rosswintle.uk/2018/01/laravel-simple-cookie-auth-simple-apis

Daniel Protopopov 05.08.2018 10:07
Стоит ли изучать 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 и хотите разрабатывать...
0
3
726
1

Ответы 1

How can I get rid of MethodNotAllowedHttpException error?

Если вы возвращаете ответ перенаправления от контроллера Laravel, следующий запрос всегда будет запросом GET. Чтобы избежать ошибки MethodNotAllowedHttpException:

  • Убедитесь, что у вас есть метод GET, зарегистрированный для пути, который вы использовали в ответе на перенаправление.
  • (Или) вернуть объект JSON, чтобы сообщить клиенту, что нужно отправить другой запрос на целевой URI.

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, зарегистрированный для перенаправления.

Ujjwal Verma 05.08.2018 04:31

Могу ли я перенаправить пользователя с конечной точки api? Все еще изучаю

Ujjwal Verma 05.08.2018 04:31

Конечная точка API не должна возвращать перенаправление (30x). Он должен возвращать ответы 20x, 40x или 50x.

Hieu Le 05.08.2018 04:35

даже если я удаляю return redirect()->route('posts'); из UserController и пытаюсь вручную получить доступ к маршруту сообщений (GET Method registered), ошибка сохраняется.

Ujjwal Verma 05.08.2018 04:38

Не могли бы вы опубликовать всю трассировку стека ошибок на свой вопрос? Это очень поможет.

Hieu Le 05.08.2018 04:40

Я присоединяю это к вопросу.

Ujjwal Verma 05.08.2018 05:02

Спасибо за трассировку стека. Кажется, твои маршруты в порядке. Вы знаете, какой запрос возвращает ответ перенаправления, а какой - ошибку?

Hieu Le 05.08.2018 05:50

Я занимался отладкой, чтобы выяснить причину получаемой ошибки. Я обнаружил, что когда я оборачиваю маршруты в промежуточное ПО auth:api, я получаю эту ошибку. Правильно ли я передаю заголовки?

Ujjwal Verma 05.08.2018 07:37

Привет @UjjwalVerma, вы зарегистрировали метод GET для пути /login? Промежуточное ПО auth:api вернет перенаправление на страницу /login, если пользователь, вызывающий API, не аутентифицирован для ваше приложение.

Hieu Le 05.08.2018 15:24

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