Убедитесь, что токен JWT действителен - PullRequest
0 голосов
/ 08 июня 2018

Я использую Slim Framework для разработки бэкэнда.Но я не могу найти способ сравнить токен, сгенерированный моей функцией входа в систему:

public function login($request, $response){
    $key = $this->container['key'];
    $email = $request->getParsedBody()['email'];
    $senha = $this->salt . $request->getParsedBody()['senha'];

    $usuario = $this->em->getRepository(UsuarioEntity::class)->findOneBy(['email' => $email]);

    if(empty($usuario) || !password_verify($senha, $usuario->getSenha())) {
      return $response->withJson('Usuario sem permissão de acesso', 401);
    }

    $token = array(
      "session" => password_hash($usuario->getId() . 'f*u87', PASSWORD_BCRYPT),
      "id" => $usuario->getId(),
      "iat" => time(),
      "exp" => time() + (60 * 10)
    );

    $jwt = \Firebase\JWT\JWT::encode($token, $key);
    return $response->withJson($jwt, 200);
}

В интерфейсе (React) я вызываю класс JS, который обрабатывает все запросы.Я получаю и сохраняю значение токена, но не знаю, как его использовать, чтобы проверить, вошел ли пользователь в систему или нет

Requisition.js

axiosPost(funcao,dados){
    //A AUTENTICAÇÃO VAI AQUI
    return axios.post(config.urlBase + funcao, dados);
}

setToken(token){
    this.token = token;
}

getToken(){
    return this.token;
}

LoginEmpresa.js (React Component)

login(){
    var reqAxios = new Requisicoes();
    reqAxios.axiosPost('login',{ email: this.state.email, senha: this.state.senha }).then(res => {
      if(res.data){
        reqAxios.setToken(res.data);
      }else{
        [...]
      }
    })
}

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Вы можете проверить, является ли JWT действительным, выполнив запрос к бэкэнд-API.

public function getUser($request, $response){
    $user = // GET CURRENT LOGGED IN USER BASED ON THE JWT

    if(!$user) {
      return $response->withJson('user is not logged in', 401);
    }

    return $response->withJson($user, 200);
}

В части React вы можете сделать запрос к API, чтобы получить текущего пользователя, вошедшего в систему.

  • Если вы получили 200 ответ от пользователя -> вошли в систему
  • Если вы получили 401 ответ -> не вошли в систему

Вы можете использовать ответ перехватчик от Axios для проверки кода состояния:

axios.interceptors.response.use(function (response) {
    // Do something with response data
    return response;
  }, function (error) {
    // Do something with response error
    if (error.status === 401) {
      // DELETE YOUR TOKEN 
      this.removeToken();
    }
    return Promise.reject(error);
});

Также я рекомендую вам сохранить токен в localStorage, чтобы сеанс пользователя выигрална странице обновления нет.

setToken(token){
    localStorage.setItem('jwt_token', token);
}

getToken(){
    return localStorage.getItem('jwt_token');
}

removeToken(){
    localStorage.removeItem('jwt_token');
}
0 голосов
/ 08 июня 2018

Поскольку ваш интерфейс является приложением React, при ответе на вход в систему вы должны хранить токен в состоянии вашего приложения.Он может быть в основном компоненте вашего приложения или в магазине редуксов, или где-либо еще.

Также полезно подумать о сохранении JWT в localStorage, чтобы гарантировать, что пользователь будет входить в систему между несколькимивкладки в вашем приложении.

И если вы используете протокол JWT, вы должны сконфигурировать свой экземпляр axios для отправки HTTP-заголовка авторизации с токеном внутри.Я не вижу его в предоставленном вами куске кода

...