Call to a member function createToken() on null

Viewed 4047

I am newbie to laravel api and laravel passport,and I know this is an old issue, but no answer helped me.I am using laravel passport for api Registration,login working fine, but logout giving and error

Here Is My Registraion Code

 public function register (Request $request) {
    $validator = Validator::make($request->all(), [
            'UserName' => 'required|string|max:255',
            'UserFullName' => 'string|max:255',
            'UserEmail' => 'required|string|email|max:255|unique:users',
            'UserPhone' => 'required|string|max:255|unique:users',
            'Password' => 'required|string|min:6|confirmed',
        ]);
        if ($validator->fails())
        {
            return response(['errors'=>$validator->errors()->all()], 422);
        }
        if ($request['UserPhone']==Null) { // will check for empty string, null values, see php.net about it
            $request['UserPhone'] = NULL;
        }
        $request['Password']=Hash::make($request['Password']);
        $request['remember_token'] = Str::random(10);
        $request['UserType'] = $request['UserType'] ? $request['UserType']  : 1;
        //return response($request, 200);
        $user = User::create($request->toArray());
        $token = $user->createToken('Laravel Password Grant Client')->accessToken;
        //return response($token, 200);
        $response['data']= $user;
        $response['data']['token'] = $token;
        return response($response, 200);
    }

My Login Code

    public function login (Request $request) {
        $validator = Validator::make($request->all(), [
            'UserEmail' => 'required|string|email|max:255',
            'Password' => 'required|string|min:6',
        ]);
        if ($validator->fails())
        {
            return response(['errors'=>$validator->errors()->all()], 422);
        }
        $user = User::where('UserEmail', $request->UserEmail)->first();
        if ($user) {
            if (Hash::check($request->Password, $user->Password)) {
                $token = $user->createToken('Laravel Password Grant Client')->accessToken;
                $response['data']= $user;
                $response['data']['token'] = $token;
                return response($response, 200);
            } else {
                $response = ["message" => "Password mismatch"];
                return response($response, 422);
            }
        } else {
            $response = ["message" =>'User does not exist'];
            return response($response, 422);
        }
    }

My Logout Code

public function logout (Request $request) {
        //return $request->Authorization;
        $token = $request->user()->token();
        //return $token;
        $token->revoke();
        $response = ['message' => 'You have been successfully logged out!'];
        return response($response, 200);
    }

Postman Response

"message": "Call to a member function createToken() on null",
    "exception": "Error",
2 Answers

Problem was of Authorization it seems all api of post with authorization header should go through with auth check,I move my logout route inside middleware

Route::group(['middleware'=>['auth:api']],function(){
Route::get('/companies', 'CompanyController@index')->name('companies');
});

but I am not sure why it does not work with if(Auth:check){ ...further revoke code ... }

You can use this route group and it will work

Route::group(['middleware'=>['auth:api']],function(){
    Route::post('/logout', 'Api\AuthController@logout');    
});

Related