Проблема с получением нового токена по истечении времени истечения в аутентификации на основе токенов в Laravel - PullRequest
0 голосов
/ 10 декабря 2018

Работа над приложением 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 голосов
/ 13 декабря 2018

У меня возникла проблема с реализацией функции, из-за которой по истечении времени истечения пользователь должен быть перенаправлен на страницу входа для повторной регистрации, чтобы выдать новый токен.

Когда выdo if elseif block вам нужно сделать вместо этого блок 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() может содержать конфиденциальную информацию о вашем приложении.Вместо этого вам следует регистрировать эту информацию и возвращать общую фразу, которая не дает никакой потенциальной информации потенциальному злоумышленнику.

...