一、JWT的优点

1、服务端不需要保存传统会话信息,没有跨域传输问题,减小服务器开销。

2、jwt构成简单,占用很少的字节,便于传输。

3、json格式通用,不同语言之间都可以使用。

二、使用JWT进行用户登录鉴权的流程

① 用户使用用户名密码来请求服务器

② 服务器进行验证用户的信息

③ 服务器通过验证发送给用户一个token

④ 客户端存储token,并在每次请求时附送上这个token值

⑤ 服务端验证token值,并返回数据

三、php-jwt库下载地址

1、通过composer下载:

composer require firebase/php-jwt

2、github下载地址:https://github.com/firebase/php-jwt

3、百度云下载地址:https://pan.baidu.com/s/1lpyz8oKf_CM-kOi7MGVoPg

提取码:wyq0

三、简单示例

1、登录页面代码:login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="showpage">
<div class="form-group">
<label for="username">用户名</label>
<input type="text" class="form-control" id="username" placeholder="请输入用户名">
</div>
<div class="form-group">
<label for="password">密码</label>
<input type="password" class="form-control" id="password" placeholder="请输入密码">
</div>
<button type="submit" id="sub-btn" class="btn btn-default">登录</button> <br/>
<p class="bg-warning" style="padding: 10px;">演示用户名和密码都是<code>demo</code>。</p>
</div>
</body>
</html> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
$('#sub-btn').on('click',function (e) {
$.ajax({
type: 'post',
url: './user.php?action=login',
data: {
username:$('#username').val(),
password:$('#password').val(),
},
dataType:'json',
success: function (data, status, xhr) {
alert(data.msg);
if(data.code==200){
//将jwt存储到本地
var jwt = xhr.getResponseHeader('Authorization');
localStorage.setItem("jwt", jwt);
//跳转登录成功的页面
window.location.href="./user.html";
}
}
});
});
</script>

2、登录成功后页面代码:user.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>你已成功登陆</h3>
</body>
</html>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
$.ajax({
type: 'post',
url: './user.php',
headers: {
'Authorization': localStorage.getItem("jwt")
},
data: {},
async: true,
dataType: 'json',
success: function (data, status, xhr) {
if(data.code!=200){
//jwt验证失败
}
//如果响应头接收到了Authorization,则将本地jwt更新
if (xhr.getResponseHeader('Authorization')) {
localStorage.setItem("jwt", jwt);
}
},
error: function () {
alert('error');
}
});
</script>

3、后端PHP代码:user.php

<?php
/*
使用composer安装php-jwt,接收到登录用户名和密码后,PHP验证用户名和密码是否正确
(实际开发中应该结合数据库,从数据库里拿用户名和密码比对,本实例为了演示只做简单验证),
如果用户名和密码准确无误,那么就签发token,在token中,我们可以定义token的签发者
、过期时间等等,并返回给前端。注意在签发token时,我们需要定义一个密钥,这个密钥是一个私钥,
实际应用中是保密的不可告诉别人。
* */
require_once './php-jwt-master/src/JWT.php'; use \Firebase\JWT\JWT; define('KEY', '1gHuiop975cdashyex9Ud23ldsvm2Xq'); //密钥 $action = isset($_GET['action']) ? $_GET['action'] : '';
if ($action == 'login') {
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = htmlentities($_POST['username']);
$password = htmlentities($_POST['password']);
$data = ['userid' => 1, 'username' => $username]; if ($username == 'demo' && $password == 'demo') { //用户名和密码正确,则签发tokon
$nowtime = time();
$token = [
'iss' => 'http://www.helloweba.net', //签发者
'aud' => $_SERVER['REMOTE_ADDR'], //jwt所面向的用户
'iat' => $nowtime, //签发时间
'exp' => $nowtime + 600, //过期时间-10min
'data' => $data
];
$jwt = JWT::encode($token, KEY);
header("Authorization:$jwt");
$res = array('code' => 200, 'msg' => '登录成功', 'data' => $data);
} else {
$res = array('code' => 300, 'msg' => '登录失败');
}
}
die(json_encode($res)); } else {
$jwt = isset($_SERVER['HTTP_AUTHORIZATION']) ? $_SERVER['HTTP_AUTHORIZATION'] : '';
if (empty($jwt)) {
$res = array('code' => 301, 'msg' => 'You do not have permission to access.');
die(json_encode($res));
}
try {
JWT::$leeway = 60;//当前时间减去60,把时间留点余地
$token = JWT::decode($jwt, KEY, ['HS256']); //HS256方式,这里要和签发的时候对应
} catch (Exception $exception) {
$res = array('code' => 302, 'msg' => $exception->getMessage());
die(json_encode($res));
} // 疑似窃取用户Token攻击行为:请求的客户端ip已经改变, 拒绝请求
if ($token->aud !== $_SERVER['REMOTE_ADDR']) {
$res['msg'] = "请求的客户端ip已经改变, 拒绝请求";
} // token过了有效期, 但是在回旋时间内, 静默更新用户token
if ($token->exp < time()) {
$token = (array)$token;
$nowtime = time();
$token['iat'] = $nowtime; //签发时间
$token['exp'] = $nowtime + 600; //过期时间-10min; $jwt = JWT::encode($token, KEY);
header("Authorization:$jwt");
} $res = array('code' => 200, 'msg' => 'success');
die(json_encode($res)); }

JWT生成Token做登录校验的更多相关文章

  1. 国服最强JWT生成Token做登录校验讲解,看完保证你学会!

    转载于:https://blog.csdn.net/u011277123/article/details/78918390 Free码农 2017-12-28 00:08:02 JWT简介 JWT(j ...

  2. tp5使用jwt生成token,做api的用户认证

    首先 composer 安装  firebase/php-jwt github:https://github.com/firebase/php-jwt composer require firebas ...

  3. 利用jwt生成token,用于http请求身份验证

    前段时间在做移动端接口过程中,考虑到安全性,所有移动端发送请求(除了登录请求)过程中进行token有效验证. 1.利用jwt生成token a.导入jwt相关包 <!-- jwt --> ...

  4. JWT生成token及过期处理方案

    业务场景 在前后分离场景下,越来越多的项目使用token作为接口的安全机制,APP端或者WEB端(使用VUE.REACTJS等构建)使用token与后端接口交互,以达到安全的目的.本文结合stacko ...

  5. 使用 JWT 生成 Token 代码示例

    JSON Web Token,简称 JWT, 是一个开放的标准(RFC 7519),它定义了以一种紧凑的.自包含的 JSON 对象在各方之间安全传输信息的方式.该信息含有数字签名,可以被验证和信任. ...

  6. JWT生成token

    1.JWT简介 JSON Web Token 简称JWT.一个JWT实际上就是一个字符串,它由三部分组成,头部.载荷与签名.JWT生成的token是这样的 2.Json Web Token(JWT)生 ...

  7. .NET6 JWT(生成Token令牌)

    一.Net 6环境下的.net core项目里如何使用JWT. 第一步,在Nuget引入JWT.Microsoft.AspNetCore.Authentication.JwtBearer这两个NuGe ...

  8. Token_使用JWT生成token

    1.token三部分 header   { "typ": "JWT", "alg": "HS256"   } paylo ...

  9. JSON Web Token (JWT)生成Token及解密实战。

    昨天讲解了JWT的介绍.应用场景.优点及注意事项等,今天来个JWT具体的使用实践吧. 从JWT官网支持的类库来看,jjwt是Java支持的算法中最全的,推荐使用,网址如下. https://githu ...

随机推荐

  1. Java基础之Synchronized原理

    思维导图svg: https://note.youdao.com/ynoteshare1/index.html?id=eb05fdceddd07759b8b82c5b9094021a&type ...

  2. Oracle Solaris 10图文安装

    文章目录 1. 虚拟机软件 2. solaris 10镜像 3. 安装OS 4. 允许远程使用root用户登录SSH 5. bash配置 5.1. 修改bash 5.2. 修改提示符 6. CRT连接 ...

  3. 给大家分享一下less的使用几个技巧

    1.层级关系 让这个box范围内的全部包进来,这样的话就完美的进行调节,再也不用到处找第几行第几个,我刚才在哪个位置给覆盖了.一看便知! .box{ width: %; height: 300px; ...

  4. 【线型DP】洛谷P2066 机器分配

    [线型DP]洛谷P2066 机器分配 标签(空格分隔): 线型DP [题目] 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配 ...

  5. 洛谷 P2114 [NOI2014]起床困难综合症 位运算

    题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作斗争.通过研究相关文献,他找到了该病的发病原因 ...

  6. C# DataTable与Excel读取与导出

    /// <summary> /// Excel->DataTable /// </summary> /// <param name="filePath&q ...

  7. Rust String(官方文档翻译)

    学习Rust,官方文档全英文,查询不太方便,索性直接翻译完,方便查询使用.有需要自由转载,本人英文水平有限,文档是在谷歌翻译的基础上加个人理解完成,不敢保证正确.文档翻译错误的地方欢迎指出: 原文地址 ...

  8. CSS基础面试题,快来查漏补缺

    本文大部分问题来源:50道CSS基础面试题(附答案),外加一些面经. 我对问题进行了分类整理,并给了自己的回答.大部分知识点都有专题链接(来源于本博客相关文章),用于自己前端CSS部分的查漏补缺.虽作 ...

  9. MySQL入门(alter语法 与 外键)

    MySQL入门(三) 字段的修改.添加.与删除 修改表字段使用alter table语句,谨记! create table tf1( id int primary key auto_increment ...

  10. 龙芯开源社区上线.NET主页

    龙芯团队从2019年7 月份开始着手.NET Core的MIPS64支持研发,经过将近一年的研发,在2020年6月18日完成了里程碑性的工作,在github CoreCLR 仓库:https://gi ...