首页 > 解决方案 > 使用 laravel 5.5 tymon jwt 为移动应用程序创建令牌(适用于未经过身份验证的用户)

问题描述

如标题所示,我想确保在移动应用程序或网络浏览器中使用 API 的用户是使用我的网站或移动应用程序的用户,没有第三方可以使用我的 API

这可以通过为可以使用正确凭据登录的用户创建令牌来轻松完成,但我的项目由经过身份验证的用户或未经过身份验证的用户可以执行 CRUD 的部分组成

所以基本上我只希望使用我的移动应用程序或我的网站的用户能够使用我的 API 没有第三方可以使用我的 API,除了那些被授权使用我的 API 的人

标签: laravel-5jwt

解决方案


好吧,您可以声明ApiController从哪里可以检查user_token并检查它们的标题。为此,您必须创建一个名为user_tokens. 该表应如下所示:

+-----+---------+-----------+------------+
| id  | user_id | usertoken | timestamps |
+-----+---------+-----------+------------+

此表one-to-one与表有关系users。从您要使用的设备中,api您必须通过 thisuser_idusertokenas headers。然后,您必须ApiController通过以下代码检查您的标头以进行身份​​验证:

public function checktoken(Request $request){

    if ($request->headers->has('usertoken')) {
        $token = $request->header('usertoken');
        $usertoken = UserToken::where('usertoken',$token)->first();

        if ($usertoken) {
            return $usertoken;
        }

        return false;        
    }

    return false;
}

以下是从 api 登录的示例:

public function postlogin(Request $request){

    $validator = Validator::make($request->all(), User::$auth_rules);

    if ($validator->fails()){
        $result['status']='fail';
        $result['message']='Validation unseccessful';
        return $result;
    }

    $remember=$request->has('remember')?true:false;
    $user=User::where('email',$request->get('email'))->first();

    if (Auth::attempt(array('phone' => $request->input('email'), 'password' => $request->input('password')), $remember)){
        $usertoken=new UserToken;
        $usertoken->user_id=$user->id;
        $usertoken->usertoken=$user->remember_token;
        $save=$usertoken->save();

        if ($save){
            $usertoken=UserToken::where('user_id', $user->id)->first();
            $token=$usertoken->usertoken;
            if (!$token) {
                $token=str_random(60);
                $usertoken->usertoken=$token;
                $update=$usertoken->update();
            }               
            $result['status']='success';
            $result['message']='Login successful';
            $result['data']=$token;
            return $result;
        }                   
    }

    $result['status']='fail';
    $result['message']='Invalid credentials';
    return $result;

}

现在您可以通过这个检查令牌作为服务器端的身份验证(假设您的用户想要更改密码):

public function postchangepassword(Request $request){

    $usertoken = $this->checktoken($request); // this here gets the token for authentication

    if ($usertoken) {
        $validator = Validator::make($request->all(), User::$password_rules);
        if ($validator->fails()){
            $result['status']='fail';
            $result['message']='Validation unseccessful';
            return $result;
        }

        $user=$usertoken->user()->first(); // you are geting authenticated user by this

        if(Hash::check($request->get('password'), $user->password)){    

            $user->password=bcrypt($request->get('newpassword'));
            $update=$user->update();

            if($update){
                $result['status']='successful';
                $result['message']='Password updated';
                return $result; 
            }

            $result['status']='fail';
            $result['message']='Password could not be updated';
            return $result;
        }

        $result['status']='fail';
        $result['message']='Current password is wrong';
        return $result;
    }

    $result['status']='fail';
    $result['message']='Invalid token';
    return $result;
}

希望这可以帮助。


推荐阅读