ホームページ バックエンド開発 PHPチュートリアル JWTとは何ですか? JWT についての簡単な理解

JWTとは何ですか? JWT についての簡単な理解

Oct 10, 2018 pm 05:09 PM
jwt php

この記事では、JWT とは何ですか? JWT を簡単に理解することは一定の参考になるので、困っている友人が参考になれば幸いです。

私は 2 日前に Web 認証を行うまで、jwt について詳しく調べたことがありませんでしたが、友人から jwt を勧められました。そのとき初めて、jwt が広くみんなに使われていることを知りました。少し外れたようです。はは、世界を利用してこれをよく見てください。

JWT (JSON Web Token) は、その名のとおり、Web 上で送信できるトークンであり、JSON 形式でフォーマットされています。これは、異なるエンティティ間で情報を JSON 形式で安全に送信するためのコンパクトで自己完結型の方法を定義するオープン ソース標準 (RFC 7519) です。

現在、多くのプロジェクトではフロントエンドとバックエンドが分離されているため、Restful API モードになっています。したがって、従来のセッションモードでは認証要件を満たすことができず、このとき jwt の役割が登場します。 RESTful API 認証は、JWT の優れた適用シナリオであると言えます。

以下は小さなデモです

<?php
require_once &#39;src/JWT.php&#39;;
header(&#39;Content-type:application/json&#39;);
//定义Key
const KEY = &#39;dasjdkashdwqe1213dsfsn;p&#39;;

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

}
//登陆,写入验证token
function login()
{
    global  $user;
    $account = $_GET[&#39;account&#39;];
    $pwd = $_GET[&#39;password&#39;];
    $res = [];
    if($account==$user[&#39;account&#39;]&&$pwd==$user[&#39;password&#39;])
    {
        unset($user[&#39;password&#39;]);
        $time = time();
        $token = [
            &#39;iss&#39;=>&#39;http://test.cc&#39;,//签发者
            &#39;iat&#39;=>$time,
            &#39;exp&#39;=>$time+60,
            &#39;data&#39;=>$user
        ];
        $jwt = \Firebase\JWT\JWT::encode($token,KEY);
        $res[&#39;code&#39;] = 200;
        $res[&#39;message&#39;] = &#39;登录成功&#39;;
        $res[&#39;jwt&#39;] = $jwt;

    }
    else
    {
        $res[&#39;message&#39;]= &#39;用户名或密码错误&#39;;
        $res[&#39;code&#39;] = 401;
    }
    exit(json_encode($res));
}





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



//连接redis
function redis()
{
    $redis = new  Redis();
    $redis->connect(&#39;127.0.0.1&#39;);
    return $redis;
}
ログイン後にコピー

この dmeo は jwt を使用して簡単な認証を実行します。 php-jwt 暗号化パッケージが使用されます。https://github.com/firebase/php-jwt

ここで、KEY は定義された秘密キーであり、jwt の署名部分です。これは保存する必要があります。
php-jwt パッケージのヘッダー部分が完成しました。暗号化コードは次のとおりです。

    */
    public static function encode($payload, $key, $alg = &#39;HS256&#39;, $keyId = null, $head = null)
    {
        $header = array(&#39;typ&#39; => &#39;JWT&#39;, &#39;alg&#39; => $alg);
        if ($keyId !== null) {
            $header[&#39;kid&#39;] = $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(&#39;.&#39;, $segments);

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

        return implode(&#39;.&#39;, $segments);
    }
ログイン後にコピー

デフォルトの暗号化方式が HS256 であることがわかります。これが jwt が安全である理由でもあります。現段階では、HS256 暗号化は依然として非常に安全です。
このパッケージは証明書の暗号化もサポートしています。

このパッケージにより、暗号化と復号化のプロセスが完了しました。したがって、jwt で poyload 部分を定義するだけで済みます。それがデモのトークン部分です。暗号化が成功すると、暗号化された JWT 文字列が取得されるので、フロントエンドは次回 API をリクエストするときに、この JWT 文字列を認証として運ぶ必要があります。
ヘッダーに「認証」を追加します。サーバー側の検証中に、応答の有効性を検証するためにこの値が取得されます。

以下は、poyload の一般的な構成の一部です。

 $token   = [
            #非必须。issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者。
            "iss"       => "http://example.org",
            #非必须。issued at。 token创建时间,unix时间戳格式
            "iat"       => $_SERVER[&#39;REQUEST_TIME&#39;],
            #非必须。expire 指定token的生命周期。unix时间戳格式
            "exp"       => $_SERVER[&#39;REQUEST_TIME&#39;] + 7200,
            #非必须。接收该JWT的一方。
            "aud"       => "http://example.com",
            #非必须。该JWT所面向的用户
            "sub"       => "jrocket@example.com",
            # 非必须。not before。如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟。
            "nbf"       => 1357000000,
            # 非必须。JWT ID。针对当前token的唯一标识
            "jti"       => &#39;222we&#39;,
            # 自定义字段
            "GivenName" => "Jonny",
            # 自定义字段
            "name"   => "Rocket",
            # 自定义字段
            "Email"     => "jrocket@example.com",
         
        ];
ログイン後にコピー

それに含まれる構成は自由に構成することも、自分で他の構成を追加することもできます。これらはインターネット上では誰もが共通して利用するものであり、一種の規約とも言えます。

以上がJWTとは何ですか? JWT についての簡単な理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles