Laravel 5.8 — Как обрабатывать маршрут API с дополнительной аутентификацией?

#php #laravel #laravel-5.8 #laravel-middleware

#php #laravel #laravel-5.8 #laravel-промежуточное программное обеспечение

Вопрос:

Кто-нибудь может мне помочь обработать маршрут API с дополнительной проверкой аутентификации? У меня есть МАРШРУТ API ‘apply-coupon’, который может использоваться как «Гостевым», так и «Вошедшим в систему» пользователем. Мне нужно получить идентификатор пользователя в контроллере, если пользователь вошел в систему.

Интерфейс — разработан с помощью React JS, при нажатии кнопки «Применить купон» API вызывается как —

 API end point - https://example.com/api/apply-coupon
Request payload - {coupon : 'my-coupon-code', shop_id : '1', subtotal : '150'}
  

Примечание : В заголовке не передается токен, поскольку функция «применить купон» доступна и для гостевого пользователя.

Ожидаемый результат:- Когда пользователь нажимает «Применить купон», он должен возвращать идентификатор пользователя, если идентификатор пользователя вошел в систему.

Ниже приведен мой маршрут вapi.php файл —

 Route::post('/apply-coupon', [
    'uses' => 'CouponController@applyCoupon',
]);
  

Обновление:- И защита по умолчанию —

 'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
  

Я пытался

 if(Auth::user()) {
     dd(Auth::user());
}
  

и

 auth()->guard('api')->user()
  

Но ничего не сработало. Спасибо!!

Комментарии:

1. вы пытались вызвать промежуточное программное обеспечение на своем маршруте? laravel.com/docs/7.x/authentication#protecting-routes

2. Мне нужно дополнительно защитить маршрут как для гостя, так и для вошедшего в систему пользователя.

3. вы могли бы попробовать создать свое промежуточное программное обеспечение, которое вы могли бы вызывать на своем маршруте.

4. «когда пользователь нажимает», не похоже на API

5. Невозможно без какого-либо токена проверить личность текущего пользователя. вам нужно будет необязательно передавать токен в заголовке. В контроллере auth()-> guard(‘api’)-> check() ? auth()-> guard(‘api’)-> user()-> id: NULL

Ответ №1:

Я не думаю, что вы можете «факультативно» защищать маршруты. Что, я думаю, вы могли бы сделать, это проверить в своем контроллере, аутентифицирован ли пользователь, и если да, то получить его идентификатор. Конечно, маршрут должен быть незащищенным

 use IlluminateSupportFacadesAuth;
...
function applyCoupon() {
    if (Auth::check()) {
        // The user is logged in...
        // return Cupon   Auth::id()
    } else {
        // Not logged in code
        // return Cupon
    }
}
  

Документы

Ответ №2:

Добавьте одно промежуточное программное обеспечение ValidateUser.php

 namespace AppHttpMiddleware;

use Closure;
use TymonJWTAuthExceptionsJWTException;
use TymonJWTAuthExceptionsTokenExpiredException;
use TymonJWTAuthExceptionsTokenInvalidException;
use TymonJWTAuthFacadesJWTAuth;


class ValidateUser
{

    public function handle($request, Closure $next)
    {
        if (! $request->bearerToken()) {
            return $next($request);
        }

        return $this->validateToken($request, $next);
    }

    private function validateToken($request, Closure $next)
    {
        try {
            if (! JWTAuth::parseToken()->authenticate()) {
                throw new Exception('Unable to find the account');
            }
        } catch (TokenExpiredException $e) {
            throw new Exception('Token has been expired');
        } catch (TokenInvalidException $e) {
            throw new Exception('Token is not valid');
        } catch (JWTException $e) {
            throw new Exception('Unable to parse the token');
        }

        return $next($request);
    }
}
  

В вашем http/kernel.php в

$routeMiddleware

Добавить

 'api.auth.validate' => AppHttpMiddlewareValidateUser::class
  

Теперь в вашем api.php вы можете использовать промежуточное программное обеспечение, чтобы проверить это что-то вроде:

 middleware(['api.auth.validate'])
  

Комментарии:

1. вы можете попробовать назначить несколько промежуточных программ: laravel.com/docs/7.x/middleware