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 ...
随机推荐
- Python实用笔记 (5)使用dictionary和set
dictionary 通过键值存储,具有极快的查找速度,但占用空间比list大很多 举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list: names = ['Micha ...
- CSS选择器使用
今天要对CSS选择器的使用方法做一个全面的总结(几乎全部是从这篇文章摘抄的 https://blog.csdn.net/qq_39241986/article/details/82185697) CS ...
- DOM-BOM-EVENT(3)
3.Node常用属性 childNodes 获取所有子节点 <div id="wrap"> <div>1111</div> <div> ...
- 小白写了一堆if-else,大神实在看不下去了,竟然用策略模式直接摆平了
这里涉及到一个关键词:策略模式,那么到底什么是策略模式呢?本文就来好好给大家讲讲策略模式,大家可以带着如下几个问题来阅读本文: 1. 如何通过策略模式优化业务逻辑代码(可以根据自己从事的工作思考) ...
- Python3笔记010 - 3.1 程序结构
第3章 流程控制语句 3.1 程序结构 程序设计的基本结构: 顺序结构---顺序执行所有语句 选择结构---选择执行部分语句 循环结构---循环执行部分语句 1.顺序结构 按照顺序执行语句. 2.选择 ...
- 探讨NET Core数据进行3DES加密或解密弱密钥问题
前言 之前写过一篇<探讨.NET Core数据进行3DES加密和解密问题>,最近看到有人提出弱密钥问题,换个强密钥不就完了吗,猜测可能是与第三方对接导致很无奈不能更换密钥,所以产生本文解决 ...
- HDU 2236 无题II 题解
题目 这是一个简单的游戏,在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小. 输入格式 输入一个整数\(T\)表示\(T\)组数据. 对于每组数 ...
- CentOS 7 的防火墙开启2
在虚拟机 CentOS 7 上装了 Nginx,结果发现另一台电脑无法访问其默认页面,通过 telnet 192.168.1.88 80 监听发现是 http 80 端口被 CentOS 7 的防火墙 ...
- WPF弹性、惯性效果应用
WPF弹性.惯性效果.已发布在了一些网站,都是这里写的 代码改编自微软示例代码库 // Copyright © Microsoft Corporation. All Rights Reserved. ...
- kafka的认识、安装与配置
认识Kafka 花费越少的精力在数据移动上,就能越专注于核心业务 --- <Kafka:The Definitive Guide> 认识 Kafka 之前,先了解一下发布与订阅消息系统:消 ...