ホームページ PHPフレームワーク ThinkPHP thinkphp6.0.7でのJWTの使い方を詳しく解説

thinkphp6.0.7でのJWTの使い方を詳しく解説

Dec 15, 2021 pm 02:51 PM
jwt

次の thinkphp フレームワーク チュートリアル コラムでは、thinkphp6.0.7 で JWT を使用する方法を紹介します。困っている友人の役に立てば幸いです。

thinkphp6.0.7 での JWT の使用に関する超詳細な説明 (コードを含む)

JWTとは

##JWTとはjson web tokenの略称です。ユーザー情報はトークンに暗号化され、サーバーはユーザー情報を保存しません。サーバーは、保存されたキーを使用してトークンの正当性を検証し、それが正しければ検証は合格します。トークンベースの認証は、従来の Cookie セッション認証方法を置き換えることができます。

セッションベースのログイン認証

従来のユーザー ログイン認証では、http はステートレスであるため、セッション メソッドが使用されます。ユーザーが正常にログインすると、サーバーはセッションを保証し、もちろんクライアントに sessionId を与えます。クライアントは sessionId を Cookie に保存し、各リクエストにはこの sessionId が含まれます。

Cookie セッション モードは通常メモリに保存されるため、サービスは単一サービスから複数サービスへのセッション共有の問題に直面し、ユーザー数が増加するにつれてオーバーヘッドが増加します。 JWT の場合はそうではなく、サーバーがトークンを生成し、クライアントがトークンを保存し、各リクエストがトークンを伝送し、サーバーがそれを認証して解析する必要があるだけです。

JWT は 3 つの部分で構成されます: header.payload.signature

ヘッダー部分:

  {
      "alg": "HS256",
      "typ": "JWT"
    }
ログイン後にコピー
对应base64UrlEncode编码为:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
说明:该字段为json格式。alg字段指定了生成signature的算法,默认值为 HS256,typ默认值为JWT
ログイン後にコピー
ペイロード部分:

    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
ログイン後にコピー
对应base64UrlEncode编码为:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
说明:该字段为json格式,表明用户身份的数据,可以自己自定义字段,很灵活。sub 面向的用户,name 姓名 ,iat 签发时间。例如可自定义示例如下:
ログイン後にコピー
  {
        "iss": "admin",           //该JWT的签发者
        "sub": "www.admin.com",   //面向的用户
        “aud”: "zhangsan",        //接收jwt的一方
        "iat": 1535967430,        //签发时间
        "exp": 1535974630,        //过期时间
        "nbf": 1535967430,        //该时间之前不接收处理该Token 
        "jti": "9f10e796726e332cec401c569969e13e"   //该Token唯一标识
    }
ログイン後にコピー

署名部分:

    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      123456
    )
ログイン後にコピー
对应的签名为:keH6T3x1z7mmhKL1T3r9sQdAxxdzB6siemGMr_6ZOwU

最终得到的JWT的Token为(header.payload.signature):eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.keH6T3x1z7mmhKL1T3r9sQdAxxdzB6siemGMr_6ZOwU
说明:对header和payload进行base64UrlEncode编码后进行拼接。通过key(这里是123456)进行HS256算法签名。
ログイン後にコピー

JWT利用プロ​​セス

初次登录:用户初次登录,输入用户名密码
密码验证:服务器从数据库取出用户名和密码进行验证
生成JWT:服务器端验证通过,根据从数据库返回的信息,以及预设规则,生成JWT
返还JWT:服务器的HTTP RESPONSE中将JWT返还
带JWT的请求:以后客户端发起请求,HTTP REQUEST
HEADER中的Authorizatio字段都要有值,为JWT
服务器验证JWT
ログイン後にコピー

jwtバージョン

phpにjwtあり複数のバージョン: 最新バージョンを選択しました。電化製品を買うとき、古いものではなく常に新しいものを買うのはなぜなのかは聞かないでください。この図を見ると、バージョン 4.1.0 ではさらに多くのパラメーターがサポートされていることがわかります。特定のパラメータについては以下で説明します

thinkphp6.0.7でのJWTの使い方を詳しく解説
jwt のインストール

1.composer を使用してインストールします

composer には lcobucci/jwt が必要です

2. github からダウンロード

ここをクリックして github アドレスに移動します:

https://github.com/lcobucci/jwt

依存関係

PHP 5.5+
OpenSSL扩展
ログイン後にコピー
Use

パラメータの説明

使用する前に、上記のパラメータの意味を説明してください:

名前の説明
iss (発行者) issuer リクエスト エンティティ。リクエストの開始者 ユーザーの情報は jwt の発行者になることもできます
sub (件名) メール送信時の件名と同様の件名を設定します
aud (オーディエンス) jwt
exp (期限切れ) を受信する側) トークン有効期限
nbf (not before) 現在時刻が nbf 設定時刻より前であるため、トークンは使用できません
iat (発行時刻) トークン作成時刻
jti (JWT ID) 一意の識別子を設定します現在のトークンの場合

PHP で JWT を実装する方法

PHP 7.3.4 を使用しています。ナンセンスではありません。コードを入力して、新しい jwt.php を作成するだけです。次のようにコピーして貼り付けます:

<?php /**
 * PHP实现jwt
 */
class Jwt {
 
    //头部
    private static $header=array(
        &#39;alg&#39;=>'HS256', //生成signature的算法
        'typ'=>'JWT'    //类型
    );
 
    //使用HMAC生成信息摘要时所使用的密钥
    private static $key='123456';
 
 
    /**
     * 获取jwt token
     * @param array $payload jwt载荷   格式如下非必须
     * [
     *  'iss'=>'jwt_admin',  //该JWT的签发者
     *  'iat'=>time(),  //签发时间
     *  'exp'=>time()+7200,  //过期时间
     *  'nbf'=>time()+60,  //该时间之前不接收处理该Token
     *  'sub'=>'www.admin.com',  //面向的用户
     *  'jti'=>md5(uniqid('JWT').time())  //该Token唯一标识
     * ]
     * @return bool|string
     */
    public static function getToken(array $payload)
    {
        if(is_array($payload))
        {
            $base64header=self::base64UrlEncode(json_encode(self::$header,JSON_UNESCAPED_UNICODE));
            $base64payload=self::base64UrlEncode(json_encode($payload,JSON_UNESCAPED_UNICODE));
            $token=$base64header.'.'.$base64payload.'.'.self::signature($base64header.'.'.$base64payload,self::$key,self::$header['alg']);
            return $token;
        }else{
            return false;
        }
    }
 
 
    /**
     * 验证token是否有效,默认验证exp,nbf,iat时间
     * @param string $Token 需要验证的token
     * @return bool|string
     */
    public static function verifyToken(string $Token)
    {
        $tokens = explode('.', $Token);
        if (count($tokens) != 3)
            return false;
 
        list($base64header, $base64payload, $sign) = $tokens;
 
        //获取jwt算法
        $base64decodeheader = json_decode(self::base64UrlDecode($base64header), JSON_OBJECT_AS_ARRAY);
        if (empty($base64decodeheader['alg']))
            return false;
 
        //签名验证
        if (self::signature($base64header . '.' . $base64payload, self::$key, $base64decodeheader['alg']) !== $sign)
            return false;
 
        $payload = json_decode(self::base64UrlDecode($base64payload), JSON_OBJECT_AS_ARRAY);
 
        //签发时间大于当前服务器时间验证失败
        if (isset($payload['iat']) && $payload['iat'] > time())
            return false;
 
        //过期时间小宇当前服务器时间验证失败
        if (isset($payload['exp']) && $payload['exp']  time())
            return false;
 
        return $payload;
    }
 

    /**
     * base64UrlEncode   https://jwt.io/  中base64UrlEncode编码实现
     * @param string $input 需要编码的字符串
     * @return string
     */
    private static function base64UrlEncode(string $input)
    {
        return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
    }
 
    /**
     * base64UrlEncode  https://jwt.io/  中base64UrlEncode解码实现
     * @param string $input 需要解码的字符串
     * @return bool|string
     */
    private static function base64UrlDecode(string $input)
    {
        $remainder = strlen($input) % 4;
        if ($remainder) {
            $addlen = 4 - $remainder;
            $input .= str_repeat('=', $addlen);
        }
        return base64_decode(strtr($input, '-_', '+/'));
    }
 
    /**
     * HMACSHA256签名   https://jwt.io/  中HMACSHA256签名实现
     * @param string $input 为base64UrlEncode(header).".".base64UrlEncode(payload)
     * @param string $key
     * @param string $alg   算法方式
     * @return mixed
     */
    private static function signature(string $input, string $key, string $alg = 'HS256')
    {
        $alg_config=array(
            'HS256'=>'sha256'
        );
        return self::base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key,true));
    }
}
 
    //***********测试和官网是否匹配begin****************************
    $payload=array('sub'=>'1234567890','name'=>'John Doe','iat'=>1516239022);
    $jwt=new Jwt;
    $token=$jwt->getToken($payload);
    echo "<pre class="brush:php;toolbar:false">";
    echo $token;
    
    //对token进行验证签名
    $getPayload=$jwt->verifyToken($token);
    echo "<br><br>";
    var_dump($getPayload);
    echo "<br><br>";
    //测试和官网是否匹配end
    
    
    //自己使用测试begin
    $payload_test=array('iss'=>'admin','iat'=>time(),'exp'=>time()+7200,'nbf'=>time(),'sub'=>'www.admin.com','jti'=>md5(uniqid('JWT').time()));;
    $token_test=Jwt::getToken($payload_test);
    echo "<pre class="brush:php;toolbar:false">";
    echo $token_test;
    
    //对token进行验证签名
    $getPayload_test=Jwt::verifyToken($token_test);
    echo "<br><br>";
    var_dump($getPayload_test);
    echo "<br><br>";
    //自己使用时候end
ログイン後にコピー

以上がthinkphp6.0.7での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)

PHP での API 認証と暗号化に JWT と JWE を使用する方法 PHP での API 認証と暗号化に JWT と JWE を使用する方法 Jun 17, 2023 pm 02:42 PM

インターネットの発展に伴い、データ対話のための API インターフェイスを提供する必要がある Web サイトやアプリケーションがますます増えています。この場合、APIの認証と暗号化が非常に重要な問題となります。一般的な認証および暗号化メカニズムとして、JWT と JWE が PHP で使用されることが増えています。さて、この記事では、PHP で API 認証と暗号化に JWT と JWE を使用する方法を説明します。 JWT の基本概念 JWT は JSONWe の略です

JWT 認証に ThinkPHP6 を使用するにはどうすればよいですか? JWT 認証に ThinkPHP6 を使用するにはどうすればよいですか? Jun 12, 2023 pm 12:18 PM

JWT (JSONWebToken) は、JSON オブジェクトをセキュリティ トークンとして使用して、複数のシステム間でユーザー ID 情報を安全に送信する軽量の認証および認可メカニズムです。 ThinkPHP6 は、PHP 言語をベースとした効率的かつ柔軟な MVC フレームワークであり、JWT 認証メカニズムを含む多くの便利なツールと機能を提供します。この記事では、Web アプリケーションのセキュリティと信頼性を確保するための JWT 認証に ThinkPHP6 を使用する方法を紹介します。

PHPにおける安全なJWTトークン生成・検証技術の分析 PHPにおける安全なJWTトークン生成・検証技術の分析 Jul 01, 2023 pm 06:06 PM

PHP における安全な JWT トークンの生成および検証テクノロジの分析 ネットワーク アプリケーションの開発に伴い、ユーザーの認証と認可がますます重要になっています。 JsonWebToken (JWT) は、Web アプリケーションで情報を安全に送信するためのオープン標準 (RFC7519) です。 PHP 開発では、ユーザーの認証と認可に JWT トークンを使用することが一般的になっています。この記事では、PHP における安全な JWT トークンの生成と検証テクノロジを紹介します。 1. JWT の生成方法と作成方法を理解するための JWT の基本的な知識

PHP の OAuth: JWT 認証サーバーを作成する PHP の OAuth: JWT 認証サーバーを作成する Jul 28, 2023 pm 05:27 PM

PHP での OAuth: JWT 認証サーバーの作成 モバイル アプリケーションの台頭とフロントエンドとバックエンドの分離の傾向により、OAuth は最新の Web アプリケーションに不可欠な部分になりました。 OAuth は、標準化されたプロセスとメカニズムを提供することで、ユーザーのリソースを不正アクセスから保護する承認プロトコルです。この記事では、PHP を使用して JWT (JSONWebTokens) ベースの OAuth 認証サーバーを作成する方法を学びます。 JWT の一種です。

Vue.js (API、JWT、axios) でログイン認証を実装するための完全なガイド Vue.js (API、JWT、axios) でログイン認証を実装するための完全なガイド Jun 09, 2023 pm 04:04 PM

Vue.js は、動的 Web アプリケーションを構築するための人気のある JavaScript フレームワークです。ユーザーのログイン認証の実装は、Web アプリケーションの開発に必要な部分の 1 つです。この記事では、Vue.js、API、JWT、axios を使用してログイン検証を実装するための完全なガイドを紹介します。 Vue.js アプリケーションの作成 まず、新しい Vue.js アプリケーションを作成する必要があります。 Vue.js アプリケーションは、VueCLI を使用して、または手動で作成できます。 axiosax をインストールする

JWT (JSON Web Token) の原理と使用法の詳細な分析 JWT (JSON Web Token) の原理と使用法の詳細な分析 Jan 10, 2023 am 10:55 AM

この記事では、JWT とは何かを中心に、JWT に関する関連知識を紹介します。 JWTの原理と使い方は何ですか?興味のある方は以下をご覧ください。

SpringBoot が JWT を組み合わせてログイン許可制御を実装する方法 SpringBoot が JWT を組み合わせてログイン許可制御を実装する方法 May 20, 2023 am 11:01 AM

まず、使用する jwt パッケージをインポートする必要があります: io.jsonwebtokenjjwt0.8.0com.auth0java-jwt3.2.0 1. LoginUser (ログイン ユーザー情報を保存するため) と JwtUserLoginUser.javapublicclassLoginUser{privateIntegeruserId;privateStringusername;privateStringpassword;privateStringrole;generate getter と setter ...}JwtUser.javaimp

Golang 開発: JWT ベースのユーザー認証の実装 Golang 開発: JWT ベースのユーザー認証の実装 Sep 20, 2023 am 08:31 AM

Golang 開発: JWT ベースのユーザー認証の実装 インターネットの急速な発展に伴い、ユーザー認証は Web アプリケーションの重要な部分になりました。従来の Cookie ベースの認証方法は、JWT (JSONWebToken) ベースの認証方法に徐々に置き換えられてきました。 JWT は、サーバーが暗号化されたトークンを生成してクライアントに送信できる軽量の認証標準で、クライアントはリクエストの送信時にトークンを Authori に置きます。

See all articles