【问题标题】:Call to a member function createToken() on null在 null 上调用成员函数 createToken()
【发布时间】:2020-06-30 03:56:07
【问题描述】:

我是 laravel api 和 laravel 护照的新手,我知道这是一个老问题,但没有答案帮助我。我正在使用 laravel 护照作为 api 注册,登录工作正常,但注销和错误

这是我的注册码

 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);
    }

我的登录代码

    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);
        }
    }

我的退出代码

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);
    }

邮递员回复

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

【问题讨论】:

  • 您的注销 API 似乎不是在调用注销函数,而是在调用登录/注册函数。检查是否调用了注销函数,如果是,则该函数执行到什么时候没有任何错误。这样您就可以找到引发错误的确切行
  • 感谢您的帮助。我不确定您所说的注销功能是什么意思,如果我没有弄错您对 laravel Auth::logout 的看法,我认为这是用于网络会话的。无论如何,谢谢。

标签: laravel laravel-passport laravel-7


【解决方案1】:

问题在于授权,似乎所有带有授权标头的帖子的 api 都应该通过身份验证检查,我将注销路由移到中间件中

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

但我不确定为什么它不适用于 if(Auth:check){ ...进一步撤销代码 ... }

【讨论】:

    【解决方案2】:

    你可以使用这个路由组,它会起作用的

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

    【讨论】:

      猜你喜欢
      • 2018-09-28
      • 2019-12-04
      • 2017-08-09
      • 2020-03-10
      • 2017-09-24
      • 2018-02-06
      • 2018-09-29
      • 2018-08-04
      • 2020-03-28
      相关资源
      最近更新 更多