校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

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

PHP JWT初識及其簡單示例

熱門標(biāo)簽:電信外呼系統(tǒng)多少錢一個(gè)月 企業(yè)400電話辦理多少費(fèi)用 宿州正規(guī)外呼系統(tǒng)軟件 代理打電話機(jī)器人 神龍斗士電話機(jī)器人 桂陽公司如何做地圖標(biāo)注 萍鄉(xiāng)商鋪地圖標(biāo)注 合肥企業(yè)外呼系統(tǒng)線路 太原400電話申請流程

一直沒有好好看過jwt,直到前兩天要做web驗(yàn)證,朋友給我推薦了jwt。才發(fā)現(xiàn)jwt已經(jīng)被大家廣泛的應(yīng)用了。看來我有點(diǎn)out了。哈哈,趁著這個(gè)世界來好好看看這個(gè)。

JWT(JSON Web Token), 顧名思義就是可以在Web上傳輸?shù)膖oken,這種token是用JSON格式進(jìn)行format的。它是一個(gè)開源標(biāo)準(zhǔn)(RFC 7519),定義了一個(gè)緊湊的自包含的方式在不同實(shí)體之間安全的用JSON格式傳輸信息。

由于現(xiàn)在很多項(xiàng)目都是前后端分離,restful api模式。所以傳統(tǒng)的session模式就沒有辦法滿足認(rèn)證需求,這個(gè)時(shí)候jwt的作用就來了。可以說 restful api認(rèn)證是jwt的一個(gè)很好的應(yīng)用場景。

參數(shù)解釋

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

下面是一個(gè)很小的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;

}
//登陸,寫入驗(yàn)證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',//簽發(fā)者
      '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']= '用戶名或密碼錯(cuò)誤';
    $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'] = '登錄超時(shí),請重新登錄';
      }
      $res['data']= $token['data'];
    }catch (\Exception $E)
    {
      $res['code'] = 401;
      $res['msg'] = '登錄超時(shí),請重新登錄.';
    }
  }
  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;
}

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

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

  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);
  }

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

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

下面是poyload的一些常用配置

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

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

注意事項(xiàng)

關(guān)于jwt的使用大概就是這些。上面的代碼在你使用的時(shí)候可能會(huì)出現(xiàn)兩個(gè)問題:

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

2、生成的token是一個(gè)對象
解決:(string)$token 將token強(qiáng)轉(zhuǎn)成string

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

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

標(biāo)簽:辛集 太原 白銀 崇左 衡陽 鄂州 廊坊 綏化

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP JWT初識及其簡單示例》,本文關(guān)鍵詞  PHP,JWT,初識,及其,簡單,示例,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP JWT初識及其簡單示例》相關(guān)的同類信息!
  • 本頁收集關(guān)于PHP JWT初識及其簡單示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 宿州市| 金寨县| 开远市| 元朗区| 永州市| 板桥市| 凉山| 剑川县| 舟山市| 多伦县| 大城县| 崇阳县| 绍兴市| 沅陵县| 库尔勒市| 青河县| 宜阳县| 郸城县| 温宿县| 巴彦县| 色达县| 昆明市| 遵化市| 中山市| 全椒县| 漳州市| 乌拉特中旗| 防城港市| 西盟| 确山县| 五原县| 宜宾县| 安乡县| 囊谦县| 鄢陵县| 岫岩| 和硕县| 屏山县| 金昌市| 信宜市| 赤水市|