composer 安裝JWT
composer require lcobucci/jwt 3.3
前端代碼參考:
<body>
<p style="color: #5a6268;font-size: 30px;font-weight: bold;text-align: center;">登錄頁面</p>
<form style="width: 30%;margin: 0 auto">
<label>用戶名</label>
<input type="text" id="name" class="form-control" >
<label >密碼</label>
<input type="password" id="pwd" class="form-control">
<button type="button" class="btn btn-primary">確認登錄</button>
</form>
</body>
</html>
<script>
$('.btn').click(function () {
var name=$(this).siblings('#name').val();
var pwd=$(this).siblings('#pwd').val();
$.ajax({
"url":'/admin/login/login',
"type":"POST",
"data":{
'name':name,
'pwd':pwd,
'__token__':"{$Request.token}",
},
"dataType":"json",
"success":function (res) {
console.log(res);
if(res.code==200){
alert('登錄成功');
localStorage.setItem('token',res.data);//將token上傳到游覽器本地化
window.location.href="{:url('home/login/login')}";
}
},
"error":function (error) {
console.log(error);
}
})
})
</script>
在框架extend/tools/jwt創建Token.php這個類
namespace tools\jwt;
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\ValidationData;
class Token
{
public static function createToken($uid = null)
{
$signer = new Sha256();//加密規則
$time = time();//當前時間
$token = (new Builder())
->issuedBy('teacher')//簽發人
->canOnlyBeUsedBy('student')//接收人
->identifiedBy('MarsLei', true) //標題id
->issuedAt($time)//發出令牌的時間
->canOnlyBeUsedAfter($time) //生效時間(即時生效)
->expiresAt($time + 3600) //過期時間
->with('uid', $uid) //用戶id
->sign($signer, 'my') //簽名
->getToken(); //得到token
return (string)$token;
}
public static function verifyToken($token=null){
//檢測是否接收到了token
if(empty($token)){
return 0;
}
//轉化為可以驗證的token
$token = (new Parser())->parse((string) $token);
//驗證基本設置
$data = new ValidationData();
$data->setIssuer('teacher');
$data->setAudience('student');
$data->setId('MarsLei');
if(!$token->validate($data)){
return 0;
}
//驗證簽名
$signer = new Sha256();
if(!$token->verify($signer, 'my')){
return 0;
}
//驗證通過,返回用戶id
return $token->getClaim('uid');
}
}
控制器代碼參考:
<?php
namespace app\admin\controller;
use think\Controller;
use tools\jwt\Token;
class Login extends Controller
{
public function login(){
$param=request()->post();
$data = [
'name' =>$param['name'],
'pwd' =>$param['pwd'],
];
$res=\app\admin\model\logins::loginDo($data);
if(!$res){
return json(['code'=>0,'data'=>'','msg'=>'登錄失敗']);
}else{
$token = Token::createToken($res['id']);
session('token',$token);
return json(['code'=>200,'data'=>$token,'msg'=>'登錄成功']);
}
}
}
攜帶token
寫一個基類方法判斷token是否有值
登錄成功攜帶token