在Laravel中基于令牌的身份验证到期后获得新令牌的问题

时间:2018-12-10 13:14:00

标签: laravel api authentication access-token

正在开发Laravel应用程序,通过该应用程序我对需要在登录期间传递令牌的API进行身份验证,并且后续请求必须使用令牌传递。登录逻辑运行正常。

我在实现功能时遇到问题,在到期后,应将用户重定向到登录页面以再次登录,以便发出新令牌。

〜请协助?

登录逻辑

public function login(Request $request){ 
    try {

        $username = $request['user'];
        $access_type = GeneralHelper::checkInput($username);

        //Data to the passed to the API
        $data = array(
            $access_type => $username,
            'password' => $request['password'],
            'login_type' => $access_type,
            'access_type' => 'web',
        );

        //Hit teh API and get a response
        $loginstatus = GeneralHelper::login_Curl($data, 'api/v1/auth/login');

        //Get the response which is success in this case
        $res_status = $loginstatus->status;

        //If suucess is true put some data in a session
        if ($res_status == 'success') {
            Session::put('user', $loginstatus->data->user);
            Session::put('access_token', $loginstatus->data->access_token);
            Session::put('refresh_token', $loginstatus->data->refresh_token);
            Session::put('expiry', $loginstatus->data->expires_in);

        } elseif ($res_status == 'failure') {
            return redirect('/login')->with('error', $loginstatus->message);
        }
    } catch (\Exception $e) {
        return $e->getMessage() . "\n at LINE " . $e->getLine();
    }

}

用于检查令牌是否可用的功能

 public function checkAccessToken(){
        //Return true if token is available
        if(!is_null(session('access_token'))){
            return true;
        }
        else {
             return false;
        }
    }

示例响应在点击后就从API获取

{
    "request_time": "2018-12-10 13:36:19",
    "response_time": "2018-12-10 13:36:19",
    "status": "success",
    "message": "login",
    "data": {
        "token_type": "Bearer",
        "expires_in": 3600,
        "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUz******************",
        "refresh_token": "def5020018e6345ab78d32*********************",
        "isAgent": true,
        "user": {
            "firstname": "*************",
            "middlename": "*************",
            "surname": "************",
            "phone": "25***********",
            "email": "*************",
            "tax_id": "************",
            "passport_no": null,
            "national_id": "***********",
            "dob": null
        }
    }
}

checkAccessToken函数

public function getLifePolicies(){
        if(!$this->checkAccessToken()){
            return redirect('/')->with('error','Your session has expired. Please Login again');
        }

        else{
            //Perform other action

        }
    }

1 个答案:

答案 0 :(得分:0)

  

我在实现功能时遇到问题,在到期后,应将用户重定向到登录页面以再次登录,以便发出新令牌。

当您执行if elseif阻止时,您需要执行if else阻止,以便您始终可以重定向到登录页面。

//If suucess is true put some data in a session
if ($res_status === 'success') {
    Session::put('user', $loginstatus->data->user);
    Session::put('access_token', $loginstatus->data->access_token);
    Session::put('refresh_token', $loginstatus->data->refresh_token);
    Session::put('expiry', $loginstatus->data->expires_in);

} else {
    return redirect('/login')->with('error', $loginstatus->message);
}

最佳实践笔记

在PHP ===中始终使用严格比较,而不是弱比较==

安全说明

从安全角度考虑,不建议这样做:

return $e->getMessage() . "\n at LINE " . $e->getLine();

$e->getMessage()可能会泄露有关您的应用程序的敏感信息。 相反,您应该记录该信息并返回不会将任何潜在信息泄漏给潜在攻击者的通用短语。