微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel 5.8-如何使用可选的auth处理API路由?

如何解决Laravel 5.8-如何使用可选的auth处理API路由?

有人可以通过可选的 Auth 检查来帮助我处理API路由吗?我有一个 API ROUTE “ apply-coupon”,“来宾”和“已登录用户都可以使用。如果用户登录,我需要在控制器中获取用户ID。

前端-使用React JS开发,单击“ Apply Coupon”按钮后,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()

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

解决方法

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

我认为您不能“任意”保护路线。我认为您可以做的是在控制器中签入用户是否通过身份验证,如果通过身份验证,则获取其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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。