1. MyJwtAuth.php内容如下
<?php
/**
* @Author: Marte
* @Date: 2019-04-23 14:35:34
* @Last Modified by: Marte
* @Last Modified time: 2019-04-23 16:09:57
*/
namespace app\common\auth;
// 引入jwt
use think\JWT;
class MyJwtAuth{
private $token;
private $uid;
private $key = 'yang'; //自定义的key值
/**
* 单例模式0 JwtAuth句柄
* @var [type]
*/
private static $instance;
private function __construct()
{
}
public static function getInstance()
{
if (is_null(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
//阻止用户复制对象实例
private function __clone()
{
trigger_error('禁止克隆' ,E_USER_ERROR);
}
/**
* 获取token
* @return [type] [description]
*/
public function getToken(){
return (string)$this->token;
}
/**
* 设置token
* @param [type] $token [description]
*/
public function setToken($token){
$this->token = $token;
return $this;
}
/**
* 获取uid
* @return [type] [description]
*/
public function getUid(){
return (string)$this->uid;
}
/**
* 设置uid
* @param [type] $token [description]
*/
public function setUid($uid){
$this->uid = $uid;
return $this;
}
/**
* 编写生成token方法
* @return [type] [description]
*/
public function getJwtToken(){
$jwtData = [
"iss" => '', //签发者 可以为空
"aud" => '', //面象的用户,可以为空
"lat" => time(), //签发时间
"nbf" => time()+10, //在什么时候jwt开始生效 (这里表示生成10秒后才生效)
"exp" => time()+3600, //token 过期时间 (表示1小时后过期)
"uid" => $this->uid, //记录的uid的信息,如果有其它信息,可以再添加数组的键值对
// 'mobile' => $mobile,
];
$this->token = JWT::encode($jwtData, $this->key);
return $this;
}
/**
* 验证token 获取信息方法
* @param [type] $token [description]
* @return [type] [description]
*/
public function checkJwtToken($token)
{
$info = JWT::decode($token, $this->key,['HS256']);
return json_encode($info);
}
}
2. User.php 控制器中调用方法如下:
<?php
/**
* @Author: Marte
* @Date: 2019-04-22 18:39:45
* @Last Modified by: Marte
* @Last Modified time: 2019-04-23 16:18:43
*/
namespace app\index\controller;
use app\index\model\User as Users;
use app\common\auth\MyJwtAuth;
use app\index\controller\ResponseJson;
use think\Controller;
// 引入jwt
use think\JWT;
class User extends controller
{
use ResponseJson;
public function login(){
//从客户端获取的登录参数
$email = '123456789@qq.com';
$password = '123456';
// echo password_hash('123456',PASSWORD_DEFAULT);密码和散列值匹配
// die;
$re = Users::where('email',$email)->find();
if(!$re){
echo '用户不存在';die;
}
// password_verify — 验证密码是否和散列值匹配
$userPasswordHash = $re['password'];
if (!password_verify($password,$userPasswordHash)) {
echo '密码错误';die;
}
/**
* 调用MyJwtAuth类下的getJwtToken(用户id)方法 获取token
* @var [type]
*/
$jwtAuth = MyJwtAuth::getInstance(); // 调用单例句柄
$token = $jwtAuth->setUid($re['id'])->getJwtToken()->getToken(); // 链式操作
return $this->jsonSuccessData([
'token' => $token,
]);
}
// 客户端获取用户信息接口
public function getUser($token=[]){
if(!$token){
echo '请传入token';die;
}
$jwtAuth = MyJwtAuth::getInstance(); // 调用单例句柄
$info = $jwtAuth->checkJwtToken($token);
$in = json_decode($info,true);
$user = Users::where('id',$in['uid'])->find();
return $this->jsonSuccessData([
'email' => $user['email'],
'name' => $user['name'],
]);
}
}
3. ResponseJson.php 如下:
<?php
namespace app\index\controller;
trait ResponseJson
{
// 当接口出现异常时的返回
public function jsonData($code,$message,$data = [])
{
return $this->jsonResponse($code,$message,$data);
}
// app接口请求成功的返回
public function jsonSuccessData($data = [])
{
return $this->jsonResponse(0,'success',$data);
}
// 返回一个json
private function jsonResponse($code,$message,$data = [])
{
$content = [
'code'=>$code,
'message'=>$message,
'data'=>$data,
];
return json_encode($content);
}
}