婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP JWT初識及其簡單示例

PHP JWT初識及其簡單示例

熱門標簽:電信外呼系統多少錢一個月 企業400電話辦理多少費用 宿州正規外呼系統軟件 代理打電話機器人 神龍斗士電話機器人 桂陽公司如何做地圖標注 萍鄉商鋪地圖標注 合肥企業外呼系統線路 太原400電話申請流程

一直沒有好好看過jwt,直到前兩天要做web驗證,朋友給我推薦了jwt。才發現jwt已經被大家廣泛的應用了。看來我有點out了。哈哈,趁著這個世界來好好看看這個。

JWT(JSON Web Token), 顧名思義就是可以在Web上傳輸的token,這種token是用JSON格式進行format的。它是一個開源標準(RFC 7519),定義了一個緊湊的自包含的方式在不同實體之間安全的用JSON格式傳輸信息。

由于現在很多項目都是前后端分離,restful api模式。所以傳統的session模式就沒有辦法滿足認證需求,這個時候jwt的作用就來了。可以說 restful api認證是jwt的一個很好的應用場景。

參數解釋

名稱 解釋
iss (issuer) issuer 請求實體,可以是發起請求的用戶的信息,也可是jwt的簽發者
sub (Subject) 設置主題,類似于發郵件時的主題
aud (audience) 接收jwt的一方
exp (expire) token過期時間
nbf (not before) 當前時間在nbf設定時間之前,該token無法使用
iat (issued at) token創建時間
jti (JWT ID) 對當前token設置唯一標示

下面是一個很小的demo

?php
require_once 'src/JWT.php';
header('Content-type:application/json');
//定義Key
const KEY = 'dasjdkashdwqe1213dsfsn;p';

$user = [
  'uid'=>'dadsa-12312-vsd1s1-fsds',
  'account'=>'daisc',
  'password'=>'123456'
];
$redis = redis();
$action = $_GET['action'];
switch ($action)
{
  case 'login':
    login();
    break;
  case 'info':
    info();
    break;

}
//登陸,寫入驗證token
function login()
{
  global $user;
  $account = $_GET['account'];
  $pwd = $_GET['password'];
  $res = [];
  if($account==$user['account']$pwd==$user['password'])
  {
    unset($user['password']);
    $time = time();
    $token = [
      'iss'=>'http://test.cc',//簽發者
      'iat'=>$time,
      'exp'=>$time+60,
      'data'=>$user
    ];
    $jwt = \Firebase\JWT\JWT::encode($token,KEY);
    $res['code'] = 200;
    $res['message'] = '登錄成功';
    $res['jwt'] = $jwt;

  }
  else
  {
    $res['message']= '用戶名或密碼錯誤';
    $res['code'] = 401;
  }
  exit(json_encode($res));
}

function info()
{
  $jwt = $_SERVER['HTTP_AUTHORIZATION'] ?? false;
  $res['code'] = 200;
  if($jwt)
  {
    $jwt = str_replace('Bearer ','',$jwt);
    if(empty($jwt))
    {
      $res['code'] = 401;
      $res['msg'] = 'You do not have permission to access.';
      exit(json_encode($res));
    }
    try{
      $token = (array) \Firebase\JWT\JWT::decode($jwt,KEY, ['HS256']);
      if($token['exp']time())
      {
        $res['code'] = 401;
        $res['msg'] = '登錄超時,請重新登錄';
      }
      $res['data']= $token['data'];
    }catch (\Exception $E)
    {
      $res['code'] = 401;
      $res['msg'] = '登錄超時,請重新登錄.';
    }
  }
  else
  {
    $res['code'] = 401;
    $res['msg'] = 'You do not have permission to access.';
  }
  exit(json_encode($res));
}

//連接redis
function redis()
{
  $redis = new Redis();
  $redis->connect('127.0.0.1');
  return $redis;
}

這個dmeo里面用jwt做了一個簡單的認證。 其中用到了一個php-jwt的加密包https://github.com/firebase/php-jwt

其中KEY為定義的私鑰也就是jwt里面的 sign部分,這個一定要保存好。
而header部分php-jwt包里面已經幫我們完成了,加密代碼如下

  public static function encode($payload, $key, $alg = 'HS256', $keyId = null, $head = null)
  {
    $header = array('typ' => 'JWT', 'alg' => $alg);
    if ($keyId !== null) {
      $header['kid'] = $keyId;
    }
    if ( isset($head)  is_array($head) ) {
      $header = array_merge($head, $header);
    }
    $segments = array();
    $segments[] = static::urlsafeB64Encode(static::jsonEncode($header));
    $segments[] = static::urlsafeB64Encode(static::jsonEncode($payload));
    $signing_input = implode('.', $segments);

    $signature = static::sign($signing_input, $key, $alg);
    $segments[] = static::urlsafeB64Encode($signature);

    return implode('.', $segments);
  }

可以看出默認的加密的方式是HS256。這也是說jwt安全的原因。現階段HS256加密還是很安全的。
這個包里面也支持證書加密。

加密解密的過程這個包已經幫我們完成了。所以我們只需要定義jwt中的 poyload部分就可以了。也就是demo里面的token部分。加密成功會得到一個加密的Jwt字符串,下次前端在請求api的時候需要攜帶這個jwt字符串作為認證。
在header頭里面增加Authorization。在服務端驗證的時候回通過取得這個值來驗證回話的有效。

下面是poyload的一些常用配置

 $token  = [
      #非必須。issuer 請求實體,可以是發起請求的用戶的信息,也可是jwt的簽發者。
      "iss"    => "http://example.org",
      #非必須。issued at。 token創建時間,unix時間戳格式
      "iat"    => $_SERVER['REQUEST_TIME'],
      #非必須。expire 指定token的生命周期。unix時間戳格式
      "exp"    => $_SERVER['REQUEST_TIME'] + 7200,
      #非必須。接收該JWT的一方。
      "aud"    => "http://example.com",
      #非必須。該JWT所面向的用戶
      "sub"    => "jrocket@example.com",
      # 非必須。not before。如果當前時間在nbf里的時間之前,則Token不被接受;一般都會留一些余地,比如幾分鐘。
      "nbf"    => 1357000000,
      # 非必須。JWT ID。針對當前token的唯一標識
      "jti"    => '222we',
      # 自定義字段
      "GivenName" => "Jonny",
      # 自定義字段
      "name"  => "Rocket",
      # 自定義字段
      "Email"   => "jrocket@example.com",
     
    ];

里面包含的配置可以自由配置,也可以自己添加一些其他的。這些都是網上大家常用的,可以說是一種約定吧。

注意事項

關于jwt的使用大概就是這些。上面的代碼在你使用的時候可能會出現兩個問題:

1、命名空間錯誤
解決:不使用命名空間的話,使用require引入文件。如果使用命名空間出現錯誤,請檢查命名空間的路徑。

2、生成的token是一個對象
解決:(string)$token 將token強轉成string

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • php 后端實現JWT認證方法示例
  • php實現JWT(json web token)鑒權實例詳解
  • php JWT在web端中的使用方法教程
  • PHP如何使用JWT做Api接口身份認證的實現
  • php實現JWT驗證的實例教程

標簽:辛集 太原 白銀 崇左 衡陽 鄂州 廊坊 綏化

巨人網絡通訊聲明:本文標題《PHP JWT初識及其簡單示例》,本文關鍵詞  PHP,JWT,初識,及其,簡單,示例,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP JWT初識及其簡單示例》相關的同類信息!
  • 本頁收集關于PHP JWT初識及其簡單示例的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 武安市| 陇川县| 灯塔市| 嵊泗县| 静宁县| 招远市| 乳源| 扎赉特旗| 石城县| 华亭县| 会理县| 抚松县| 兖州市| 连城县| 浦县| 雅江县| 三都| 双鸭山市| 乌什县| 莱阳市| 海安县| 博湖县| 留坝县| 华亭县| 海门市| 图们市| 托里县| 改则县| 屏东市| 吉木萨尔县| 施秉县| 泰州市| 宁武县| 凭祥市| 始兴县| 新龙县| 惠水县| 桐柏县| 永康市| 宁明县| 信宜市|