先了解一下什么是JWT?JWT是一个简单的PHP的第三方库,用于在PHP中编码和解码JSON WEB令牌jwt 。一般用composer来管理依赖关系 使用composer require firebase/php-jwt来安装这个库(详见 php-jwt库:https://github.com/firebase/php-jwt)
再来介绍一下用户登录鉴权流程
1、用户使用用户名和密码来请求服务器
2、服务器验证用户信息
3、服务器通过验证生成一个token返回给客户端
4、客户端存储这个token,并在后面的每一次请求中在请求头上带上这个token
5、服务端验证这个token token正确就返回数据 token错误就返回错误信息
start 首先我们需要一个html表单用于后台的登录
<div id="showpage" style="display: none">
<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>
<div id="user" style="display: none">
<p>欢迎<strong id="uname">
</strong>,您已登录,<a href="javascript:;" id="logout">退出>></a>
</p>
</div>
// 使用axios库
<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
<script>
let jwt=localStorage.getItem('jwt');
// token 保存在localstorage里面 判断有没有token
if (jwt) {
axios.defaults.headers.common['X-token']=jwt;
axios.get('user.php')
.then(function (response) {
if (response.data.result==='success') {
document.querySelector('#showpage').style.display='none';
document.querySelector('#user').style.display='block';
document.querySelector('#uname').innerHTML=response.data.info.data.username;
} else {
document.querySelector('#showpage').style.display='block';
console.log(response.data.msg);
}
})
.catch(function (error) {
console.log(error);
});
} else {
document.querySelector('#showpage').style.display='block';
}
document.querySelector("#sub-btn").onclick=function(){
let username=document.querySelector("#username").value;
let password=document.querySelector("#password").value;
var params=new URLSearchParams();
params.append('user',username);
params.append('pass',password);
axios.post(
'user.php?action=login',
params,
);
.then(response)=> {
if(response.data.result==='success'){
// 本地存储token
localStorage.setItem('jwt',response.data.jwt);
// 把token存储到header里面
axios.defaults.headers.common['X-token']=response.data.jwt;
axios.get('user.php').then(function(response){
if(response.data.result==='success'){
document.querySelector("#showpage").style.display='none';
document.querySelector("#user").style.display='block';
document.querySelector("#uname").innerHTML=response.data.info.data.username;
}else{
}
})
}else{
console.log(response.data.msg);
}
}
.catch(function(error){
console.log(error);
});
}
</script>
服务器端
首先使用php-jwt库
使用composer安装php-jwt,接收到登录用户名和密码后,PHP验证用户名和密码是否正确,如果用户名和密码准确无误,那么就签发token,在token中,我们可以定义token的签发者、过期时间等等,并返回给前端。注意在签发token时,我们需要定义一个密钥,这个密钥是一个私钥,实际应用中是保密的不可告诉别人。
后台代码user.php
<?php
date_default_timezone_set("PRC"); //系统使用北京时间
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;
// 私有的密钥
define('KEY', '1gHuiop975cdashyex9Ud23ldsvm2Xq');
// header('Access-Control-Allow-Origin:*');
$res['result']='failed';
$action=isset($_GET['action']) ? $_GET['action'] : '';
if ($action=='login') {
if ($_SERVER['REQUEST_METHOD']=='POST') {
$username=htmlentities($_POST['user']);
$password=htmlentities($_POST['pass']);
if ($username=='demo' && $password=='demo') { //用户名和密码正确,则签发tokon
$nowtime=time();
$token=[
'iss'=> 'http://www.helloweba.net', //签发者
'aud'=> 'http://www.helloweba.net', //jwt所面向的用户
'iat'=> $nowtime, //签发时间
'nbf'=> $nowtime + 10, //在什么时间之后该jwt才可用
'exp'=> $nowtime + 600, //过期时间-10min
'data'=> [
'userid'=> 1,
'username'=> $username
]
];
// 生成token
$jwt=JWT::encode($token, KEY);
$res['result']='success';
$res['jwt']=$jwt;
} else {
$res['msg']='用户名或密码错误!';
}
}
echo json_encode($res);
} else {
$jwt=isset($_SERVER['HTTP_X_TOKEN']) ? $_SERVER['HTTP_X_TOKEN'] : '';
if (empty($jwt)) {
$res['msg']='You do not have permission to access.';
echo json_encode($res);
exit;
}
try {
JWT::$leeway=60;
$decoded=JWT::decode($jwt, KEY, ['HS256']);
$arr=(array)$decoded;
if ($arr['exp'] < time()) {
$res['msg']='请重新登录';
} else {
$res['result']='success';
$res['info']=$arr;
}
} catch(Exception $e) {
$res['msg']='Token验证失败,请重新登录';
}
echo json_encode($res);
}
用户每次请求都要带上后端签发的token,后端获取请求中的token,PHP中使用$_SERVER['HTTP_X_TOKEN']就可以获取token值。这个X_TOKEN就是在我们前端的请求header头信息中。
然后PHP拿到这个token后,解密分析token值,返回给前端即可。
我们可以看到,在用户鉴权的过程中并没有使用Session或者Cookie,服务端无需存储用户会话信息。只用了一个Token串,建立前后端的验证的数据传递,实现了有效的登录鉴权过程。
于前阵子我写的HTTP DoS发生程序,改写了一下,实现登录自己搭建的web渗透测试网站。这个网站叫MYZOO,我读研一时候,老师提供的一个实验网站,用来学习Web安全,一个微型的交易网站,可以实现更新简介,查询,转账操作。
实际上,在我们所谓的黑客看来,就是Get请求,Post请求嘛,基于这个:
login 函数:用来登录,获取cookie和connect句柄
profile 函数:一个POST请求,用来更新数据库中的个人简介
query 函数:一个GET请求,用来向数据库查询个人ZOOBAR信息
以上三个算是核心函数了,虽然实现了登录,访问,查询,退出。但是呢?还是感觉没啥味道!然而,这通常是小白迈向Web安全,走向传奇黑客的必经之路。谁不是这么走过来的呢?
CSRF跨站请求伪造, XSS 跨站脚本攻击,SQL注入攻击,等都是基于对网站有一定的了解,那么怎么就叫对网站有一定的了解呢? 我的回答是:
1.会自己搭建网站
2.会写爬虫访问自己的网站
某些我的读者,私信咨询怎么学习黑客?这个话题太大,我很难回答好。知乎现在的学术氛围越来越不友好了,答题就加分,不答题就减分。那么答题质量如何保证呢?越来越水呗。不管是学习黑客,还是学习其他什么专业技能,都需要坚持。很多小白都是脑子一热,找一堆技能树,黑客教学视频,学了一阵子,就学不进去了,自然而然的被黑客圈子拒绝在外。
如果非得说个学习路线:
科班路线:我还是推荐上学时期的网络安全试验课目录,我以前回答过
非科班路线:3年前的看雪论坛,其他几乎都是种韭菜
我个人感觉:关注自己喜欢的领域就好,我喜欢黑客的感觉。
坚持向往,慢慢成长,你一定会是瞩目的黑客。
如何只花1元搭建个人博客网站
作者 ailx10
去查看
OOC:Massive Open Online Courses,即为大型公开在线课程,在短短的几年间风靡全球,在这个开放的平台上,你可以随时随地接触到世界各地的名师风采。mooc似乎让学习资源的分配更为平等。无论你在哪里,只有可以联网就可以学习。今天就推荐几个过你知名MOOC网站,程序员一定要好好利用线上学习资源。
1.学堂在线
简介:学堂在线是免费公开的MOOC(大规模开放在线课程)平台,是国家教育部MOOC研究中心官方合作平台,致力于通过来自国内外一流名校开设的免费网络学习课程,为公众提供系统的高等教育,让每一个中国人都有机会享受优质教育资源。通过和清华大学在线教育研究中心、以及国内外知名大学的紧密合作,学堂在线将不断增加课程的种类和丰富程度。
推荐语:依托于清华师资力量,教学质量很高。
2. 中国大学MOOC
简介:国大学MOOC(慕课) 是爱课程网携手云课堂打造的在线学习平台,每一个有提升愿望的人,都可以在这里学习中国最好的大学课程,学完还能获得认证证书。中国大学MOOC是国内最好的中文MOOC学习平台,拥有来自于39所985高校的顶级课程,最好最全的大学课程,与名师零距离。
推荐语:课程覆盖很全,商业化相对程度较高。
3.慕课网
简介:慕课网(IMOOC)是国内最大的IT技能学习平台。慕课网提供了丰富的移动端开发、php开发、web前端、android开发以及html5等视频教程资源公开课。并且富有交互性及趣味性,你还可以和朋友一起编程。
推荐语:程序员很适合去这个网站,技术课程覆盖很全。
4.MOOC中国
简介:MOOC中国是为国内小伙伴推荐最好慕课的中文慕课网。
推荐语:原创课程较少,更多的是资源推荐,也可以发现不错的课程,不适合程序员。
写在最后:
说出你的需求,让我做你的好助手,好管家,协助你来发现更多的优质资源。
留下你的评论与意见,集思广益共享价值。
回见啦,我是呆傻萌,每晚10点不见不散。
古言古语:
昨夜西风凋碧树,独上高楼,望尽天涯路。
*请认真填写需求信息,我们会在24小时内与您取得联系。