最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP JWT初識及其簡單示例

 更新時間:2018年10月10日 14:55:00   作者:舊夢發(fā)癲  
這篇文章主要介紹了PHP JWT初識及其簡單示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

參數(shù)解釋

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

下面是一個很小的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']= '用戶名或密碼錯誤';
    $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做了一個簡單的認(rèn)證。 其中用到了一個php-jwt的加密包https://github.com/firebase/php-jwt

其中KEY為定義的私鑰也就是jwt里面的 sign部分,這個一定要保存好。
而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安全的原因?,F(xiàn)階段HS256加密還是很安全的。
這個包里面也支持證書加密。

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

下面是poyload的一些常用配置

 $token  = [
      #非必須。issuer 請求實(shí)體,可以是發(fā)起請求的用戶的信息,也可是jwt的簽發(fā)者。
      "iss"    => "http://example.org",
      #非必須。issued at。 token創(chuàng)建時間,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。如果當(dāng)前時間在nbf里的時間之前,則Token不被接受;一般都會留一些余地,比如幾分鐘。
      "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的使用大概就是這些。上面的代碼在你使用的時候可能會出現(xiàn)兩個問題:

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

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

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

相關(guān)文章

  • Laravel5中contracts詳解

    Laravel5中contracts詳解

    在Laravel5中出現(xiàn)了一個新的東西,叫做contracts,那么它到底是什么?有什么用?怎么用?我們就來探討下吧。
    2015-03-03
  • WHOOPS PHP調(diào)試庫的使用

    WHOOPS PHP調(diào)試庫的使用

    下面小編就為大家?guī)硪黄猈HOOPS PHP調(diào)試庫的使用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • PHP實(shí)現(xiàn)的多彩標(biāo)簽效果代碼分享

    PHP實(shí)現(xiàn)的多彩標(biāo)簽效果代碼分享

    這篇文章主要介紹了PHP實(shí)現(xiàn)的多彩標(biāo)簽效果代碼分享,經(jīng)常可以看到一些博客中的標(biāo)簽(TAGS)頁面是彩色的效果展現(xiàn),本文就給出了實(shí)現(xiàn)這個功能的PHP代碼,需要的朋友可以參考下
    2014-08-08
  • PHP執(zhí)行SQL文件并將SQL文件導(dǎo)入到數(shù)據(jù)庫

    PHP執(zhí)行SQL文件并將SQL文件導(dǎo)入到數(shù)據(jù)庫

    今天給大家介紹一下,如何利用php自動執(zhí)行.sql文件。其實(shí)很簡單,就是獲取sql文件中的內(nèi)容,然后將每一句sql語句一次執(zhí)行就行啦。需要的朋友可以參考下
    2015-09-09
  • php實(shí)現(xiàn)的短網(wǎng)址算法分享

    php實(shí)現(xiàn)的短網(wǎng)址算法分享

    這篇文章主要介紹了php實(shí)現(xiàn)的短網(wǎng)址算法,理論上支持1,073,741,824個短網(wǎng)址,個人使用足夠了,需要的朋友可以參考下
    2014-06-06
  • Yii實(shí)現(xiàn)多數(shù)據(jù)庫主從讀寫分離的方法

    Yii實(shí)現(xiàn)多數(shù)據(jù)庫主從讀寫分離的方法

    這篇文章主要介紹了Yii實(shí)現(xiàn)多數(shù)據(jù)庫主從讀寫分離的方法,通過針對Yii數(shù)據(jù)庫類的擴(kuò)展實(shí)現(xiàn)多數(shù)據(jù)庫主從讀寫的分離功能,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12
  • ThinkPHP慣例配置文件詳解

    ThinkPHP慣例配置文件詳解

    這篇文章主要介紹了ThinkPHP慣例配置文件,對于進(jìn)一步了解ThinkPHP各個屬性配置有很大幫助,需要的朋友可以參考下
    2014-07-07
  • php 判斷過去離現(xiàn)在幾年的函數(shù)(實(shí)例代碼)

    php 判斷過去離現(xiàn)在幾年的函數(shù)(實(shí)例代碼)

    下面小編就為大家?guī)硪黄猵hp 判斷過去離現(xiàn)在幾年的函數(shù)(實(shí)例代碼)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • php截取字符串函數(shù)substr,iconv_substr,mb_substr示例以及優(yōu)劣分析

    php截取字符串函數(shù)substr,iconv_substr,mb_substr示例以及優(yōu)劣分析

    php進(jìn)行中文字符串的截取時,會經(jīng)常用到二個函數(shù)iconv_substr和mb_substr,對這二個函數(shù)應(yīng)該如何選擇呢?參考下本文介紹的例子就明白了。
    2014-06-06
  • 詳解PHP導(dǎo)入導(dǎo)出CSV文件

    詳解PHP導(dǎo)入導(dǎo)出CSV文件

    項(xiàng)目開發(fā)中,很多時候要將外部CSV文件導(dǎo)入到數(shù)據(jù)庫中或者將數(shù)據(jù)導(dǎo)出為CSV文件,那么具體該如何實(shí)現(xiàn)呢?本文將使用PHP并結(jié)合mysql,實(shí)現(xiàn)了CSV格式數(shù)據(jù)的導(dǎo)入和導(dǎo)出功能。
    2014-11-11

最新評論

沽源县| 宝山区| 西和县| 社会| 新河县| 永城市| 包头市| 怀宁县| 柯坪县| 嫩江县| 华亭县| 奈曼旗| 交口县| 东港市| 濉溪县| 昌黎县| 衢州市| 三台县| 普格县| 卢氏县| 鞍山市| 普安县| 安福县| 肥乡县| 南昌市| 华阴市| 沾化县| 阜康市| 彭水| 含山县| 和田县| 广河县| 汾西县| 铁岭县| 合肥市| 曲水县| 新疆| 慈利县| 永宁县| 天祝| 饶平县|