【问题标题】:Laravel 5.8 - How to handle API route with optional auth?Laravel 5.8 - 如何使用可选身份验证处理 API 路由?
【发布时间】:2020-12-17 09:16:14
【问题描述】:

谁能帮助我通过可选的 Auth 检查来处理 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()

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

【问题讨论】:

  • 您是否尝试在您的路由上调用中间件? laravel.com/docs/7.x/authentication#protecting-routes
  • 我需要为访客和登录用户选择保护路由。
  • 您可以尝试创建可以在路由上调用的中间件。
  • “当用户点击时”,听起来不像是 API
  • 没有任何类型的令牌是不可能检查当前用户的身份的。您必须在标头中选择性地传递令牌。在控制器 auth()->guard('api')->check() 中? auth()->guard('api')->user()->id : NULL

标签: php laravel laravel-5.8 laravel-middleware


【解决方案1】:

添加一个中间件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'])

【讨论】:

【解决方案2】:

我认为您不能“选择性地”保护路线。我认为您可以做的是检查您的控制器是否已通过身份验证,如果是,则获取其 ID。当然路由应该是不受保护的

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

docs

【讨论】:

    猜你喜欢
    • 2017-12-05
    • 2018-08-27
    • 1970-01-01
    • 2019-07-17
    • 2020-11-26
    • 2016-02-05
    • 1970-01-01
    • 2021-04-29
    • 2020-01-14
    相关资源
    最近更新 更多