JWT生成Token做登录校验
一、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做登录校验的更多相关文章
- 国服最强JWT生成Token做登录校验讲解,看完保证你学会!
转载于:https://blog.csdn.net/u011277123/article/details/78918390 Free码农 2017-12-28 00:08:02 JWT简介 JWT(j ...
- tp5使用jwt生成token,做api的用户认证
首先 composer 安装 firebase/php-jwt github:https://github.com/firebase/php-jwt composer require firebas ...
- 利用jwt生成token,用于http请求身份验证
前段时间在做移动端接口过程中,考虑到安全性,所有移动端发送请求(除了登录请求)过程中进行token有效验证. 1.利用jwt生成token a.导入jwt相关包 <!-- jwt --> ...
- JWT生成token及过期处理方案
业务场景 在前后分离场景下,越来越多的项目使用token作为接口的安全机制,APP端或者WEB端(使用VUE.REACTJS等构建)使用token与后端接口交互,以达到安全的目的.本文结合stacko ...
- 使用 JWT 生成 Token 代码示例
JSON Web Token,简称 JWT, 是一个开放的标准(RFC 7519),它定义了以一种紧凑的.自包含的 JSON 对象在各方之间安全传输信息的方式.该信息含有数字签名,可以被验证和信任. ...
- JWT生成token
1.JWT简介 JSON Web Token 简称JWT.一个JWT实际上就是一个字符串,它由三部分组成,头部.载荷与签名.JWT生成的token是这样的 2.Json Web Token(JWT)生 ...
- .NET6 JWT(生成Token令牌)
一.Net 6环境下的.net core项目里如何使用JWT. 第一步,在Nuget引入JWT.Microsoft.AspNetCore.Authentication.JwtBearer这两个NuGe ...
- Token_使用JWT生成token
1.token三部分 header { "typ": "JWT", "alg": "HS256" } paylo ...
- JSON Web Token (JWT)生成Token及解密实战。
昨天讲解了JWT的介绍.应用场景.优点及注意事项等,今天来个JWT具体的使用实践吧. 从JWT官网支持的类库来看,jjwt是Java支持的算法中最全的,推荐使用,网址如下. https://githu ...
随机推荐
- ORACLE误删除表数据或误更新/插入数据如何恢复
工作中一不小心将本不该删除/更新/插入的数据进行删除/更新/插入了,这时候一定要尽快进行恢复. 工具/原料 PL/SQL 方法/步骤 首先新建一张测试表TEST,里面输入记录.由于删除/更 ...
- JavaScript基础CallBack函数(015)
前面提到,函数对象是可以作为参数传递给另一函数的,这时,作为参数的函数如果在内部被执行,那么它就是个回调函数(Callback): function writeCode(callback) { // ...
- 洛谷 P1347 【排序】
这篇题解没有用拓补排序 (嗐 菜就直说) 个人感觉这道题拓补排序没有变种\(Floyd\)好写吧,思维难度也低一点(亲眼目睹机房dalao这道题拓补排序调了很久). 吐槽结束,开始正题~ 对于这道题为 ...
- 小白写了一堆if-else,大神实在看不下去了,竟然用策略模式直接摆平了
这里涉及到一个关键词:策略模式,那么到底什么是策略模式呢?本文就来好好给大家讲讲策略模式,大家可以带着如下几个问题来阅读本文: 1. 如何通过策略模式优化业务逻辑代码(可以根据自己从事的工作思考) ...
- C++ MFC 文件操作(新建,删除,剪切,复制,读数据,写数据,重命名)
源文件:http://pan.baidu.com/s/1ve0hV 这是运行mfc缺失的dll动态链接库:http://pan.baidu.com/s/17pGlT 哈哈,我也是初接触C++,基础的什 ...
- java语言基础(九)_final_权限_内部类
final关键字 final关键字代表最终.不可改变的. 常见四种用法: 可以用来修饰一个类 可以用来修饰一个方法 还可以用来修饰一个局部变量 还可以用来修饰一个成员变量 1)修饰一个类 public ...
- Xenon's Attack on the Gangs(树规)
题干 Input Output Example Test 1: Test 2: 3 5 1 2 1 2 2 3 1 3 1 4 3 5 3 10 Tips 译成人话 给n个结点,n-1条无向边.即一棵 ...
- mongodb--创建用户权限
最近在部署MongoDB Replica Set,马上就到生产环境了,一想还没有给数据库设置用户权限,配置的这一路踩了好多坑,希望对大家有帮助 1. 配置好mongodb replica set 安装 ...
- flask 源码专题(十):flash源码研究
flash源码 def flash(message, category="message"): flashes = session.get("_flashes" ...
- 数据可视化基础专题(五):Pandas基础(四) 生成对象
引言 先介绍下 Pandas 的数据结构,毕竟数据结构是万物的基础. Pandas 有两种主要的数据结构: Series 和 DataFrame 模块导入 首先我们在代码中引入 Pandas 和 Nu ...