Невозможно пройти проверку подлинности с ошибкой токена в dingo / api с помощью jwt-auth

я использую Динго / апи (который имеет встроенную поддержку JWT-авт) сделать API.

Предположим, это мои маршруты:

$api->group(['prefix' => 'auth', 'namespace' => 'Auth'], function ($api) {
$api->post('checkPhone', 'LoginController@checkPhone');

//Protected Endpoints
$api->group(['middleware' => 'api.auth'], function ($api) {
$api->post('sendCode', 'LoginController@sendCode');
$api->post('verifyCode', 'LoginController@verifyCode');

});
});

checkPhone метод, имеющий задачу авторизации и создания токена, выглядит так:

public function checkPhone (Request $request)
{
$phone_number = $request->get('phone_number');
if (User::where('phone_number', $phone_number)->exists()) {

$user = User::where('phone_number', $phone_number)->first();

$user->injectToken();

return $this->response->item($user, new UserTransformer);

} else {
return $this->response->error('Not Found Phone Number', 404);
}
}

А также injectToken() метод на User Модель это:

public function injectToken ()
{
$this->token = JWTAuth::fromUser($this);
return $this;
}

Создание токена работает нормально.

Но когда я отправляю его на защищенную конечную точку, всегда Unable to authenticate with invalid token встречается,.

Защищенный метод действия конечной точки:

public function verifyCode (Request $request)
{
$phone_number = $request->get('phone_number');
$user_code    = $request->get('user_code');

$user = User::wherePhoneNumber($phone_number)->first();

if ($user) {
$lastCode = $user->codes()->latest()->first();

if (Carbon::now() > $lastCode->expire_time) {
return $this->response->error('Code Is Expired', 500);
} else {
$code = $lastCode->code;

if ($user_code == $code) {

$user->update(['status' => true]);

return ['success' => true];
} else {
return $this->response->error('Wrong Code', 500);
}
}
} else {
return $this->response->error('User Not Found', 404);
}
}

я использовал PostMan как клиент API и отправлять сгенерированные токены в виде заголовка следующим образом:

Authorization:Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI5ODkxMzk2MTYyNDYiLCJpc3MiOiJodHRwOlwvXC9hcGkucGFycy1hcHAuZGV2XC92MVwvYXV0aFwvY2hlY2tQaG9uZSIsImlhdCI6MTQ3NzEyMTI0MCwiZXhwIjoxNDc3MTI0ODQwLCJuYmYiOjE0NzcxMjEyNDAsImp0aSI6IjNiMjJlMjUxMTk4NzZmMzdjYWE5OThhM2JiZWI2YWM2In0.EEj32BoH0URg2Drwc22_CU8ll--puQT3Q1NNHC0LWW4

Я не могу найти решение после многих поисков в сети и связанных репозиториях.

В чем проблема по вашему мнению?

Обновить :

Я обнаружил, что не найдена ошибка для конструктора loginController, который предлагает laravel:

public function __construct ()
{
$this->middleware('guest', ['except' => 'logout']);
}

потому что, когда я прокомментировал $this->middleware('guest', ['except' => 'logout']); все сработало.
Но если я уберу эту строку правильно?
Как должна быть эта строка для API?

1

Решение

Как я уже упоминал ранее, проблема с обновлением заметки заключалась в том, что я использовал checkPhone а также verifyCode в LoginController, который имеет проверку гостя в своем конструкторе.

И потому что guest промежуточное программное обеспечение относится к \App\Http\Middleware\RedirectIfAuthenticated::class и это перенаправляет вошедшего в систему пользователя на /home каталог, и я не создал это, так 404 error произошло.

Теперь я перенес эти методы в UserController без какого-либо промежуточного программного обеспечения в его конструкторе.

0

Другие решения

Обновление моего config / api.php для этого сделало свое дело

// config/api.php
...
'auth' => [
'jwt' => 'Dingo\Api\Auth\Provider\JWT'
],
...
0

Всегда стоит прочитать источник, чтобы увидеть, что происходит. Ответ. Ожидается идентификатор провайдера аутентификации для извлечения пользователя.

/**
* Authenticate request with a JWT.
*
* @param \Illuminate\Http\Request $request
* @param \Dingo\Api\Routing\Route $route
*
* @return mixed
*/
public function authenticate(Request $request, Route $route)
{
$token = $this->getToken($request);

try {
if (! $user = $this->auth->setToken($token)->authenticate()) {
throw new UnauthorizedHttpException('JWTAuth', 'Unable to authenticate with invalid token.');
}
} catch (JWTException $exception) {
throw new UnauthorizedHttpException('JWTAuth', $exception->getMessage(), $exception);
}

return $user;
}
0
По вопросам рекламы [email protected]