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 ...
随机推荐
- Mac下搭建react开发环境
安装node 官网下载 https://nodejs.org/en/ 双击安装,接下来都是默认选择即可,直至安装成功 测试是否安装成功,分别输入以下命令: node -v npm -v 如下图所示,说 ...
- java.math.BigDecimal cannot be cast to [Ljava.lang.Object;
从数据库中使用sum函数取出统计值后,放进list中,遍历list的时候强转化成Object是报错. BigDecimal .Integer不是基本类型,是int的包装类,无法把包装当做基本类型来用. ...
- 浅谈dfs
搜索(dfs) 搜索分为bfs与dfs 他们的算法思路都是相同的--穷举 可以说,搜索是万能的,但是复杂度往往是指数级的,往往是穷途末路才用的最后方案 dfs dfs核心操作:回溯+前进 想想你第一次 ...
- QT Creator配置环境和安装
原文链接:https://blog.csdn.net/qq_33154343/java/article/details/78587699 补充下其中缺少的步骤:安装后缺少QT GUI Applicat ...
- css input checkbox复选框控件 样式美化的多种方案
checkbox复选框可能是网站中常用的html元素,但大多数人并不满意它的默认样式,这篇文章就讲讲如何实现input checkbox复选框控件 样式美化效果. 资源网站大全 https://55w ...
- html5中contenteditable 光标_如何设置光标位置
在js中,光标是一个对象,当你选中某个元素的时候才会出现光标对象.比如:我们点击一个输入框,实际会产生一个选中对象-selection,这个对象我们可以通过indow.getSelection()来获 ...
- vue页面原样导出excel表格
github地址:https://github.com/wuzhiaite/vue-samples 1.excel导出 做过业务系统的知道,进行涉及到excel的导出,列表数据动则几十万,但是也有一部 ...
- P2585 三色二叉树 题解
题目 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": \[S=\left\{ \begin{aligned} 0 &\ \ 表 ...
- java 和 c++ 的三目运算符的区别
转载请注明出处:http://www.cnblogs.com/liangyongrui/p/6348001.html 以前很少用java,就知道java和c++差不多. 今天就踩了一个坑. 不吐糟,直 ...
- MYSQL 之 JDBC(十五):数据库连接池
在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 在主程序(如servlet.bean)中建立数据库连接 进行sql操作 断开数据库连接 这种模式开发存在各种各样的问题,最重要的是:数 ...