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 ...
随机推荐
- cv2 exposureFusion (曝光融合)
import cv2 import numpy as np import sys filenames = ['./images/memorial0061.jpg', './images/memoria ...
- EOS基础全家桶(十四)智能合约进阶
简介 通过上一期的学习,大家应该能写一些简单的功能了,但是在实际生产中的功能需求往往要复杂很多,今天我就继续和大家分享下智能合约中的一些高级用法和功能. 使用docker编译 如果你需要使用不同版本的 ...
- window的常用操作
一.window.location location对象属性 1.location.href 属性返回当前页面的 URL. 2.location.pathname 返回路径和方法名称 3.locati ...
- 【.NET Core】在Win10中用VS Code debug
虽然windows平台中有功能丰富且强大的Visual Studio,但有时也稍显臃肿,不如VS Code(vsc)小巧便捷,废话不多说,直接进入正题 前提 .NET Core RC2 X64系统 W ...
- C#远程连接代码
/// <summary> /// 服务连接配置类(验证服务账号是否正确) /// </summary> /// <param name="remoteHost ...
- Scala 基础(十四):Scala 模式匹配(二)
1 匹配数组 1)Array(0) 匹配只有一个元素且为0的数组. 2)Array(x,y) 匹配数组有两个元素,并将两个元素赋值为x和y.当然可以依次类推Array(x,y,z) 匹配数组有3个元素 ...
- 数据可视化基础专题(五):Pandas基础(四) 生成对象
引言 先介绍下 Pandas 的数据结构,毕竟数据结构是万物的基础. Pandas 有两种主要的数据结构: Series 和 DataFrame 模块导入 首先我们在代码中引入 Pandas 和 Nu ...
- 机器学习实战基础(四十一):随机森林 (八)附录 Bagging vs Boosting
- 机器学习实战基础(八):sklearn中的数据预处理和特征工程(一)简介
1 简介 数据挖掘的五大流程: 1. 获取数据 2. 数据预处理 数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程 可能面对的问题有:数据类型不同,比如有的是文字,有的是数字 ...
- redis(一):Redis 数据类型
Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...