首页 > 解决方案 > Laravel 5.8 - 如何使用可选身份验证处理 API 路由?

问题描述

任何人都可以帮助我通过可选的身份验证检查来处理 API 路由吗?我有一个API ROUTE 'apply-coupon' 可供 'Guest' 和 'Logged In' 用户使用。如果用户已登录,我需要在控制器中获取用户 ID。

前端- 使用 React JS 开发,点击“应用优惠券”按钮,API 调用为 -

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

注意:标头中没有传递令牌,因为访客用户也可以使用“应用优惠券”功能。

预期输出:-当用户点击“应用优惠券”时,如果用户 ID 登录,它应该返回用户 ID。

以下是我在api.php文件中的路线 -

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

更新:-默认守卫是-

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

我努力了

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

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

但没有任何效果。谢谢!!

标签: phplaravellaravel-5.8laravel-middleware

解决方案


添加一个中间件ValidateUser.php

namespace App\Http\Middleware;

use Closure;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Exceptions\TokenInvalidException;
use Tymon\JWTAuth\Facades\JWTAuth;


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' => \App\Http\Middleware\ValidateUser::class

现在在您的 api.php 中,您可以使用中间件来检查它,例如:

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

推荐阅读