资讯专栏INFORMATION COLUMN

使用JWT(Json Web Token)实现登录认证

Yu_Huang / 2011人阅读

摘要:今天我们来结合实例给大家讲述的实战应用,就是如何使用前端与后端实现用户登录鉴权认证的过程。只用了一个串,建立前后端的验证的数据传递,实现了有效的登录鉴权过程。

今天我们来结合实例给大家讲述JWT(Json Web Token)的实战应用,就是如何使用前端Axios与后端PHP实现用户登录鉴权认证的过程。

文中涉及的重要知识点:

axios异步请求:axios-基于Promise的HTTP请求客户端
php-jwt库:https://github.com/firebase/p...
HTML5相关知识
因此在阅读这边文章之前,请先了解以上知识点以及JWT的基本概念,这样你会很快理解我们这篇文章中的实例代码。

准备

用户登录鉴权流程:

用户使用用户名密码来请求服务器
服务器进行验证用户的信息
服务器通过验证发送给用户一个token
客户端存储token,并在每次请求时附送上这个token值
服务端验证token值,并返回数据
那么现在我们就按这个流程开始。

HTML

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



详细的代码,可以下载demo源码中查看,这里样式我们使用的是Bootstrap3的经典样式。

Javascript

前端Javascript异步请求,我们使用Axios库,当然你也可以使用jQuery的Ajax方法。

首先引入axios库:


按照流程,
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.helloweba.net", //签发者
                "aud" => "http://www.helloweba.net", //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"] < time()) {
            $res["msg"] = "请重新登录";
        } else {
            $res["result"] = "success";
            $res["info"] = $arr;
        }
    } catch(Exception $e) {
        $res["msg"] = "Token验证失败,请重新登录";
    }

    echo json_encode($res);
}

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

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

结束语

以上就是整个JWT的实战应用,我们可以看到,在用户鉴权的过程中并没有使用Session或者Cookie,服务端无需存储用户会话信息。只用了一个Token串,建立前后端的验证的数据传递,实现了有效的登录鉴权过程。

在线演示demo:https://www.helloweba.net/dem...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28419.html

相关文章

  • 理解JWTJSON Web Token认证及python实践

    摘要:认证服务器,即服务提供商专门用来处理认证的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。客户端使用上一步获得的授权,向认证服务器申请令牌。认证服务器对客户端进行认证以后,确认无误,同意发放令牌。 最近想做个小程序,需要用到授权认证流程。以前项目都是用的 OAuth2 认证,但是Sanic 使用OAuth2 不太方便,就想试一下 JWT 的认证方式。这一篇主要内容是 ...

    BigTomato 评论0 收藏0
  • JWT(Json Web Token) 科普

    摘要:部分是对前两部分的签名,防止数据篡改。也就是说,一旦签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。为了减少盗用,的有效期应该设置得比较短。为了减少盗用,不应该使用协议明码传输,要使用协议传输。 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法。 showImg(https://www.wangbase.com/blogimg...

    SKYZACK 评论0 收藏0
  • 说一说几种登录认证方式,你用的哪一种

    摘要:登录认证几乎是任何一个系统的标配,系统客户端等,好多都需要注册登录授权认证。假设我们开发了一个电商平台,并集成了微信登录,以这个场景为例,说一下的工作原理。微信网页授权是授权码模式的授权模式。 登录认证几乎是任何一个系统的标配,web 系统、APP、PC 客户端等,好多都需要注册、登录、授权认证。 场景说明 以一个电商系统,假设淘宝为例,如果我们想要下单,首先需要注册一个账号。拥有了账...

    idealcn 评论0 收藏0
  • api权限管理系统与前后端分离实践

    摘要:自己在前后端分离上的实践要想实现完整的前后端分离,安全这块是绕不开的,这个系统主要功能就是动态管理,这次实践包含两个模块基于搭建的权限管理系统后台编写的前端管理。 自己在前后端分离上的实践 要想实现完整的前后端分离,安全这块是绕不开的,这个系统主要功能就是动态restful api管理,这次实践包含两个模块,基于springBoot + shiro搭建的权限管理系统后台bootshir...

    bawn 评论0 收藏0
  • api权限管理系统与前后端分离实践

    摘要:自己在前后端分离上的实践要想实现完整的前后端分离,安全这块是绕不开的,这个系统主要功能就是动态管理,这次实践包含两个模块基于搭建的权限管理系统后台编写的前端管理。 自己在前后端分离上的实践 要想实现完整的前后端分离,安全这块是绕不开的,这个系统主要功能就是动态restful api管理,这次实践包含两个模块,基于springBoot + shiro搭建的权限管理系统后台bootshir...

    tianlai 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<