laravel 8 -> 使用 jwt 和邮递员授权

Posted

技术标签:

【中文标题】laravel 8 -> 使用 jwt 和邮递员授权【英文标题】:laravel 8 -> authorization with jwt and postman 【发布时间】:2021-06-24 02:28:53 【问题描述】:

我正在使用 Laravel8 构建一个 API 并使用 postman,另外我使用 JWT 进行身份验证并希望授权创建新帖子,我希望只有当用户是管理员或作者时才能创建新帖子,所以我创建了一个中间件AdminLevelAuthorization,并在内核中将其添加为'auth.level'

所以我把这个中间件作为我的路由放在 api.php 中:Route::apiResource('posts' , PostController::class)->middleware('auth.level:admin,author');

在邮递员中我登录并保存了我的令牌,我只是不知道如何使用这个令牌进行授权

当我在邮递员和授权部分转到这条路线http://localhost:8000/api/posts 时,持有者令牌类型我在令牌字段中输入我的令牌,所以它说: "You are unauthorized to access this resource"

我不知道我输入令牌是错还是我的中间件有问题

这是我的中间件:

class AdminLevelAuthorization

    public function handle($request, Closure $next, ...$levels)
    
        try 
            //Access token from the request    
            $token = JWTAuth::parseToken();//Try authenticating user
            $user = $token->authenticate();

         catch (TokenExpiredException $e) 
            //Thrown if token has expired
            return $this->unauthorized('Your token has expired. Please, login again.');

         catch (TokenInvalidException $e) 
            //Thrown if token invalid
            return $this->unauthorized('Your token is invalid. Please, login again.');

         catch (JWTException $e) 
            //Thrown if token was not found in the request.
            return $this->unauthorized('Please, attach a Bearer Token to your request');
        

        //If user was authenticated successfully and user is in one of the acceptable levels, send to next request.
        if ($user && in_array($user->levels, $levels)) 
            return $next($request);
        

        return $this->unauthorized();
    

    private function unauthorized($message = null)
        return response()->json([
            'message' => $message ? $message : 'You are unauthorized to access this resource',
            'success' => false
        ], 401);
    

感谢您的帮助:)

【问题讨论】:

由于您的 unauthorized 方法在没有消息的情况下被调用,因此您的用户似乎不拥有 $levels。假设$levels$user->levels 都是数组,您需要执行不同的级别验证,因为in_array($array,$array2) 不起作用。如果$user->levels 是一个字符串,你可能应该仔细检查你的代码逻辑是否真的正常工作 omfg T_T 看看我的愚蠢错误 :") $user->levels 是问题。它必须是 $user->level.. 非常感谢 :")))) 【参考方案1】:

问题出在s,对于user->levels,它必须是$user->level

【讨论】:

以上是关于laravel 8 -> 使用 jwt 和邮递员授权的主要内容,如果未能解决你的问题,请参考以下文章

供应商/lcobucci/jwt/src/Configuration.php 上的 Laravel 8 错误

我有由 laravel 8 创建的项目,并且我将 JWT 用于我的 API,现在由于 JWT 版本我无法安装推送器

GraphQL 配合 JWT 使用 —— Laravel RSS

Laravel:升级 JWT 后,会话过期变得过于频繁

Laravel中使用JWT

使用 JWT 获取令牌而不尝试用户凭据 Laravel?