JWT中如何使用axios+PHP实现登录认证
创始人
2024-12-16 15:22:53
0次
      HTML

      我们的HTML结构是这样的:一个登录表单,供用户输入用户名和密码,以及提交按钮;一个是登录成功后的显示信息。

      按照流程,1.提交登录表单,发送用户名和密码到PHP后端,2.后端验证成功后,会发送一个token给前端,3.前端再拿这个token去请求需要用户权限访问,4.后端验证toen,鉴权,返回相应结果。下面的js代码实现了1,3两步。

      很显然,当登录成功后,立马使用本地存储token,然后把这个token放在请求头header里,再次去请求后端另一个用户信息接口,如果成功了就显示用户信息。

      如果要退出登录,我们不需要再次去请求后端接口,直接前端清空本地存储就OK了。

      document.querySelector('#logout').onclick = function() {    localStorage.removeItem('jwt');    document.querySelector('#showpage').style.display = 'block';    document.querySelector('#user').style.display = 'none';}

      登录成功后,当我们刷新页面(再次请求需要登录后才能访问的页面),需要进行判断,判断本地存储中是否有token,如果有token,那就拿去给后端接口验证下token是否合法,如果没问题就显示用户相关信息,如果验证失败,那可能是token过去或者伪造的token等原因。

      let jwt =  localStorage.getItem('jwt');if (jwt) {    axios.defaults.headers.common['X-token'] = jwt;    axios.get('user.php')    .then(function (response) {        if (response.data.result === 'success') {            document.querySelector('#showpage').style.display = 'none';            document.querySelector('#user').style.display = 'block';            document.querySelector('#uname').innerHTML = response.data.info.data.username;        } else {            document.querySelector('#showpage').style.display = 'block';            console.log(response.data.msg);        }    })    .catch(function (error) {        console.log(error);    });} else {    document.querySelector('#showpage').style.display = 'block';}

      PHP

      后端我们使用了一个专门的JWT库:php-jwt

      使用composer安装php-jwt,接收到登录用户名和密码后,PHP验证用户名和密码是否正确(实际开发中应该结合数据库,从数据库里拿用户名和密码比对,本实例为了演示只做简单验证),如果用户名和密码准确无误,那么就签发token,在token中,我们可以定义token的签发者、过期时间等等,并返回给前端。注意在签发token时,我们需要定义一个密钥,这个密钥是一个私钥,实际应用中是保密的不可告诉别人。

      require 'vendor/autoload.php';use FirebaseJWTJWT;define('KEY', '1gHuiop975cdashyex9Ud23ldsvm2Xq'); //密钥$res['result'] = 'failed';$action = isset($_GET['action']) ? $_GET['action'] : '';if ($action == 'login') {    if ($_SERVER['REQUEST_METHOD'] == 'POST') {        $username = htmlentities($_POST['user']);        $password = htmlentities($_POST['pass']);        if ($username == 'demo' && $password == 'demo') { //用户名和密码正确,则签发tokon            $nowtime = time();            $token = [                'iss' => 'http://www.xuebuyuan.com', //签发者                'aud' => 'http://www.xuebuyuan.com', //jwt所面向的用户                'iat' => $nowtime, //签发时间                'nbf' => $nowtime + 10, //在什么时间之后该jwt才可用                'exp' => $nowtime + 600, //过期时间-10min                'data' => [                    'userid' => 1,                    'username' => $username                ]            ];            $jwt = JWT::encode($token, KEY);            $res['result'] = 'success';            $res['jwt'] = $jwt;        } else {            $res['msg'] = '用户名或密码错误!';        }    }    echo json_encode($res);} else {    $jwt = isset($_SERVER['HTTP_X_TOKEN']) ? $_SERVER['HTTP_X_TOKEN'] : '';    if (empty($jwt)) {        $res['msg'] = 'You do not have permission to access.';        echo json_encode($res);        exit;    }    try {        JWT::$leeway = 60;        $decoded = JWT::decode($jwt, KEY, ['HS256']);        $arr = (array)$decoded;        if ($arr['exp']

      用户每次请求都要带上后端签发的token,后端获取请求中的token,PHP中使用$_SERVER['HTTP_X_TOKEN']就可以获取token值。这个X_TOKEN就是在我们前端的请求header头信息中。

      然后PHP拿到这个token后,解密分析token值,返回给前端即可。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...