亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
博主信息
博文 64
粉絲 6
評論 2
訪問量 100597
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
ThinkPhp6.0引入JWT進行token驗證
王嬌
原創(chuàng)
5129人瀏覽過
什么是JWT

Json web token (JWT), 是為了在網絡應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準((RFC 7519).該token被設計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源,也可以增加一些額外的其它業(yè)務邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。

傳統(tǒng)的session認證

我們知道,http協(xié)議本身是一種無狀態(tài)的協(xié)議,而這就意味著如果用戶向我們的應用提供了用戶名和密碼來進行用戶認證,那么下一次請求時,用戶還要再一次進行用戶認證才行,因為根據http協(xié)議,我們并不能知道是哪個用戶發(fā)出的請求,所以為了讓我們的應用能識別是哪個用戶發(fā)出的請求,我們只能在服務器存儲一份用戶登錄的信息,這份登錄信息會在響應時傳遞給瀏覽器,告訴其保存為cookie,以便下次請求時發(fā)送給我們的應用,這樣我們的應用就能識別請求來自哪個用戶了,這就是傳統(tǒng)的基于session認證。

但是這種基于session的認證使應用本身很難得到擴展,隨著不同客戶端用戶的增加,獨立的服務器已無法承載更多的用戶,而這時候基于session認證應用的問題就會暴露出來.

基于session認證所顯露的問題

Session: 每個用戶經過我們的應用認證之后,我們的應用都要在服務端做一次記錄,以方便用戶下次請求的鑒別,通常而言session都是保存在內存中,而隨著認證用戶的增多,服務端的開銷會明顯增大。

擴展性: 用戶認證之后,服務端做認證記錄,如果認證的記錄被保存在內存中的話,這意味著用戶下次請求還必須要請求在這臺服務器上,這樣才能拿到授權的資源,這樣在分布式的應用上,相應的限制了負載均衡器的能力。這也意味著限制了應用的擴展能力。

CSRF: 因為是基于cookie來進行用戶識別的, cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。

基于token的鑒權機制

基于token的鑒權機制類似于http協(xié)議也是無狀態(tài)的,它不需要在服務端去保留用戶的認證信息或者會話信息。這就意味著基于token認證機制的應用不需要去考慮用戶在哪一臺服務器登錄了,這就為應用的擴展提供了便利。

流程上是這樣的:

  • 用戶使用用戶名密碼來請求服務器
  • 服務器進行驗證用戶的信息
  • 服務器通過驗證發(fā)送給用戶一個token
  • 客戶端存儲token,并在每次請求時附送上這個token值
  • 服務端驗證token值,并返回數據
    這個token必須要在每次請求時傳遞給服務端,它應該保存在請求頭里, 另外,服務端要支持CORS(跨來源資源共享)策略,一般我們在服務端這么做就可以了Access-Control-Allow-Origin: *
tp6安裝JWT

composer require firebase/php-jwt

tp6重新封裝JWT
  • app文件夾下新建一個services文件夾
  • services文件夾下新建JwtService.php內容如下
  1. <?php
  2. namespace app\services;
  3. use Firebase\JWT\JWT;
  4. use Firebase\JWT\Key;
  5. use Symfony\Component\VarDumper\VarDumper;
  6. class JwtService{
  7. public function getToken($uid){
  8. $key="xuanransoftware";//自定義key值
  9. $payload=array(
  10. "iss"=>'http://api.xuanransoftware.com',//簽發(fā)者
  11. "aud"=>"http://api.xuanransoftware.com",//接收者
  12. "iat"=>time(),//初始時間
  13. "nbf"=>time()+60*60*24*7,//過期時間為7天
  14. "uid"=>$uid,//前端頁面?zhèn)鱱id
  15. );
  16. $jwt=JWT::encode($payload,$key,'HS256');
  17. return $jwt;
  18. }
  19. public function checkToken($token){
  20. $key="xuanransoftware";//自定義key值
  21. $decoded=JWT::decode($token,new Key($key,'HS256'));
  22. return $decoded;
  23. }
  24. }
  • 新建Login控制器 php think make:controller admins/Login Login控制器內容如下
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\controller\admins;
  4. use think\Request;
  5. use app\BaseController;
  6. // 引入admin模型
  7. use app\model\Admin;
  8. //引入JWT進行token驗證
  9. use app\services\JwtService;
  10. class Login extends BaseController
  11. {
  12. /**
  13. * 顯示資源列表
  14. *
  15. * @return \think\Response
  16. */
  17. public function login(Request $request)
  18. {
  19. //判斷是否為post請求
  20. if($request->isPost()){
  21. //獲取post參數
  22. $params = $request->param() ;
  23. $userName =trim($params['username']);
  24. $password =trim(sha1($params['password']));
  25. //使用Admin模型查找用戶名和密碼
  26. $db = new Admin();
  27. $index = $db->find('username',$userName);
  28. //判斷用戶是否存在
  29. if (isset($index)){
  30. //判斷密碼是否正確
  31. if($password==$index['password']){
  32. //更新登錄時間
  33. $index->lastlogin = time();
  34. $index->save();
  35. //根據用戶id生成token
  36. $jwt = new JwtService();
  37. $token = $jwt->getToken($index['id']);
  38. return $this->msg(1,'登錄成功',$token);
  39. }
  40. else{
  41. return $this->msg(0,'密碼錯誤');
  42. }
  43. }else{
  44. return $this->msg(0,'用戶名不存在,請注冊后重新登錄');
  45. }
  46. }else{
  47. return $this->msg(0,'請求類型碼錯誤');
  48. }
  49. }
  50. //返回狀態(tài)碼
  51. private function msg($code,$msg,$token='')
  52. {
  53. return json(['code'=>$code,'msg'=>$msg,'token'=>$token]);
  54. }
  55. }
  • 新建CheckToken中間件php think make:middleware CheckToken 中間件內容如下
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\middleware;
  4. use app\services\JwtService;
  5. class CheckToken
  6. {
  7. /**
  8. * 處理請求
  9. *
  10. * @param \think\Request $request
  11. * @param \Closure $next
  12. * @return Response
  13. */
  14. public function handle($request, \Closure $next)
  15. {
  16. $token=$request->param('token');
  17. //沒有token
  18. if (!$token){
  19. return response("token是空的");
  20. }
  21. //沒有找到jwt類
  22. $jwt=new JwtService();
  23. try {
  24. $decode=$jwt->checkToken($token);
  25. }catch (\Exception $e){
  26. echo $e;
  27. return response("位置錯誤");
  28. }
  29. //解析token
  30. $decode=json_decode(json_encode($decode),true);
  31. var_dump($decode);
  32. if (!$decode){
  33. return response("token 不合法");
  34. }
  35. if (time() > $decode['nbf']){
  36. return response("token 已過期");
  37. }
  38. return $next($request);
  39. }
  40. }
  • 添加路由中間件組
  • 因為時區(qū)不同,所以需要注釋JWT中的這段

需要注釋JWT中的這段

本博文版權歸博主所有,轉載請注明地址!如有侵權、違法,請聯(lián)系admin@php.cn舉報處理!
全部評論 文明上網理性發(fā)言,請遵守新聞評論服務協(xié)議
1條評論
99 2022-11-26 10:35:19
你寫的這個jwt 雖然是簡單的但是你自己用過了嗎
1樓
作者最新博文
關于我們 免責申明 意見反饋 講師合作 廣告合作 最新更新
php中文網:公益在線php培訓,幫助PHP學習者快速成長!
關注服務號 技術交流群
PHP中文網訂閱號
每天精選資源文章推送
PHP中文網APP
隨時隨地碎片化學習
PHP中文網抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號

  • 登錄PHP中文網,和優(yōu)秀的人一起學習!
    全站2000+教程免費學