이 기사는 JWT 인증 사용에 관한 문제를 주로 소개하는 thinkphp에 대한 관련 지식을 제공합니다. 모두에게 도움이 되기를 바랍니다.
추천 학습: "PHP 비디오 튜토리얼"
composer require firebase/php-jwt
프로젝트의 common.php 전역 파일 app 디렉토리를 사용하고 public으로 만들었습니다. Method, 저는 어플리케이션이 여러 개 있으므로 api 아래에 common.php에 작성했습니다. 필요에 따라 적절하게 조정하시면 됩니다
먼저 JWT를 소개하고 2개를 작성합니다. 서명 확인 및 확인 토큰을 생성하는 방법.
<?phpuse \Firebase\JWT\JWT;use Firebase\JWT\Key;// 应用公共文件/** * 生成验签 * @param $uid 用户id * @return mixed */function signToken($uid){ $key='abcdefg'; //自定义的一个随机字串用户于加密中常用的 盐 salt $token=array( "iss"=>$key, //签发者 可以为空 "aud"=>'', //面象的用户,可以为空 "iat"=>time(), //签发时间 "nbf"=>time(), //在什么时候jwt开始生效 "exp"=> time()+30, //token 过期时间 "data"=>[ //记录的uid的信息 'uid'=>$uid, ] ); $jwt = JWT::encode($token, $key, "HS256"); //生成了 token return $jwt;}/** * 验证token * @param $token * @return array|int[] */function checkToken($token){ $key='abcdefg'; //自定义的一个随机字串用户于加密中常用的 盐 salt $res['status'] = false; try { JWT::$leeway = 60;//当前时间减去60,把时间留点余地 $decoded = JWT::decode($token, new Key($key, 'HS256')); //HS256方式,这里要和签发的时候对应 $arr = (array)$decoded; $res['status'] = 200; $res['data'] =(array)$arr['data']; return $res; } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确 $res['info'] = "签名不正确"; return $res; }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用 $res['info'] = "token失效"; return $res; }catch(\Firebase\JWT\ExpiredException $e) { // token过期 $res['info'] = "token过期"; return $res; }catch(Exception $e) { //其他错误 $res['info'] = "未知错误"; return $res; }}
/** * 使用jwt生成token字符串 */ public function setJwtToken() { $uid = input('uid'); // 接收生成token字符串 如:123 $token = signToken($uid); // 生成字符串: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQxNDUwMTU0LCJuYmYiOjE2NDE0NTAxNTcsImV4cCI6MTY0MTQ1NzM1NCwiZGF0YSI6eyJ1aWQiOiIxMjMifX0.I_GAkMsOhtEpIPkizCuQA-b9H6ovSovWx0AwAYI-b0s echo $token;die; } /** * 使用jwt验证token字符串 */ public function checkJwtToken() { $token = input('token'); // 接收生成token字符串 $result = checkToken($token); // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) ) print_r($result);die; }
<?phpdeclare (strict_types = 1);namespace app\api\controller;use think\facade\Db;use think\Request;class User{ public function login(Request $request) { if ($request->isPost()){ $username = $request->param('username','','trim'); $password = $request->param('password','','trim'); //查询数据库 $user = Db::name('user')->where('username',$username)->find(); if (!$user){ return json(['status' => 'fail','msg' => '用户名不存在']); } if ($user['password']!==md5($password)){ return json(['status' => 'fail','msg' => '密码错误']); } $getToken = $this->token($user); return json(['status' => 'success','msg' => '登陆成功','token' => $getToken]); } } public function token($user) { $uid = $user['username']; // 接收生成token字符串 如:123 $token = signToken($uid); dd($token); } /** * 验证token */ public function chToken() { $token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQ4MDkwMDkyLCJuYmYiOjE2NDgwOTAwOTIsImV4cCI6MTY0ODA5MDEyMiwiZGF0YSI6eyJ1aWQiOiJcdTVmMjBcdTRlMDlcdTk4Y2UifX0.oJFpNcZ6stMymOCbD-meX0IPEIYLYNcwKxhMItF2cMw'; $result = checkToken($token); // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) ) print_r($result);die; }}
<?phpdeclare (strict_types = 1);namespace app\middleware;class Api{ /** * 处理请求 * * @param \think\Request $request * @param \Closure $next * @return Response */ public function handle($request, \Closure $next) { //toke 合法性验证 $header = $request->header(); //判读请求头里有没有token if(!isset($header['token'])){ return json(['code'=>440,'msg'=>'request must with token']); } $token = $header['token']; try { // token 合法 $token = checkToken($token); }catch (\Exception $e){ return json(['code'=>440,'msg'=>'invalid token']); } return $next($request); }}
추천 학습: "
PHP 비디오 튜토리얼"
위 내용은 JWT 인증을 사용한 thinkphp6의 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!