javascript - 验证Token JWT是否有效

标签 javascript php reactjs jwt slim

我正在使用 Slim Framework 来开发后端。但我找不到方法来比较我的登录功能生成的 token :

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 类。我获取并存储 token 值,但我不知道如何使用它来检查用户是否登录

请购单.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组件)

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{
        [...]
      }
    })
}

谢谢

最佳答案

您可以通过向后端 API 发出请求来检查 JWT 是否有效。

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 响应 -> 未登录

您可以使用响应 interceptor from 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);
});

此外,我建议您将 token 存储在 localStorage 中,以便用户的 session 不会在页面刷新时过期。

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

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

removeToken(){
    localStorage.removeItem('jwt_token');
}

关于javascript - 验证Token JWT是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50767042/

相关文章:

javascript - 使用多个链接放大位置的传单

PHP:如何使用带有匿名函数的 usort?

javascript - 立即将 csv 文件中的数据显示到 handontable

javascript - Mongoose 不发送更新结果

reactjs - 语义-UI React : How to theme using less variables in a create-react-app project

javascript - 使用 .off() 删除事件处理程序的 jQuery 问题

javascript - 即使延迟设置为 0,Bootstrap Notify 也会自动关闭

javascript - 如何使用bluebird map 和返回对象

PHP:奇怪的引用变量

javascript - ReactJS 文件夹结构