JWT认证user_not_found Tymon

时间:2017-09-02 15:29:14

标签: laravel laravel-5 jwt json-web-token

我已经为JWT身份验证设置了Tymon包。如果新用户注册或登录,我会成功获得令牌。但是当我将令牌传递给Laravel JWT时,我发现错误,因为找不到用户。

控制器代码

public function authenticate()
    {
        $credentials = request()->only('user_name','password');
        try{
            $token = JWTAuth::attempt($credentials);
            if(!$token){
                return response()->json(['error'=>'invalid_credentials'],401);
            }
        }
        catch(JWTException $e){
            return response()->json(['error'=>'something went wrong'],500);
        }
        return response()->json(['token'=>$token],200);
    }

    public function register()
    {
        $user_name = request()->user_name;
        $c_name = request()->company_name;
        $accessibility_level = request()->accessability_level;
        $password = request()->password;
        $contact_number = request()->contact_number;
        $address = request()->address;

        $user = User::create([
            'user_name'=>$user_name,
            'c_name'=>$c_name,
            'accessibility_level'=>$accessibility_level,
            'password'=>bcrypt($password),
            'contact_number'=>$contact_number,
            'address'=>$address
        ]);

        $token = JWTAuth::fromUser($user);

        return response()->json(['token'=>$token],200);
    }

上述代码没问题。

但是当我尝试使用JWT验证访问某些数据时,我得到一个错误,如USER_NOT_FOUND。我通过Postman传递了Token作为标题。

路线代码

Route::get('/some_route','some_controller@index')->middleware('jwt.auth');

jwt.php也设置了我在模型中使用的正确标识符(主键)

'identifier' => 'user_name',

1 个答案:

答案 0 :(得分:2)

JWT标识符不能简单地修改配置,因为出于某种原因它在代码中是hardcoded

在调用任何其他JWTAuth方法来设置标识符之前,您当然可以使用setIdentifier方法。

以下是:

public function authenticate()
    {
        $credentials = request()->only('user_name','password');
        try{
            $token = JWTAuth::setIdentifier('user_name')->attempt($credentials);
            if(!$token){
                return response()->json(['error'=>'invalid_credentials'],401);
            }
        }
        catch(JWTException $e){
            return response()->json(['error'=>'something went wrong'],500);
        }
        return response()->json(['token'=>$token],200);
    }

然后为jwt身份验证创建自定义中间件:

public function handle($request, \Closure $next)
    {
        if (! $token = $this->auth->setIdentifier('user_name')->setRequest($request)->getToken()) {
            return $this->respond('tymon.jwt.absent', 'token_not_provided', 400);
        }

        try {
            $user = $this->auth->authenticate($token);
        } catch (TokenExpiredException $e) {
            return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]);
        } catch (JWTException $e) {
            return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]);
        }

        if (! $user) {
            return $this->respond('tymon.jwt.user_not_found', 'user_not_found', 404);
        }

        $this->events->fire('tymon.jwt.valid', $user);

        return $next($request);
    }