Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist JWT? Ein kurzes Verständnis von JWT

Was ist JWT? Ein kurzes Verständnis von JWT

不言
不言nach vorne
2018-10-10 17:09:215589Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Frage, was JWT ist. Ein einfaches Verständnis von JWT hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen.

Ich habe mir jwt noch nie genau angesehen, bis ich vor zwei Tagen eine Webverifizierung durchführen musste. Ein Freund hat mir jwt empfohlen. Erst dann entdeckte ich, dass JWT von allen weit verbreitet ist. Es scheint, ich bin ein wenig daneben. Haha, nutzen Sie die Welt, um sich das genauer anzusehen.

JWT (JSON Web Token) ist, wie der Name schon sagt, ein Token, der im Web übertragen werden kann. Dieses Token ist im JSON-Format formatiert. Es handelt sich um einen Open-Source-Standard (RFC 7519), der eine kompakte, eigenständige Möglichkeit zur sicheren Übertragung von Informationen im JSON-Format zwischen verschiedenen Entitäten definiert.

Da viele Projekte mittlerweile über eine Front-End- und Back-End-Trennung verfügen, ist ein erholsamer API-Modus möglich. Daher kann der herkömmliche Sitzungsmodus die Authentifizierungsanforderungen nicht erfüllen. Zu diesem Zeitpunkt kommt die Rolle von JWT. Man kann sagen, dass die restful API-Authentifizierung ein gutes Anwendungsszenario für JWT ist.

Das Folgende ist eine sehr kleine Demo

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

Dieses DMEO verwendet JWT, um eine einfache Authentifizierung durchzuführen. Es wird ein PHP-JWT-Verschlüsselungspaket verwendet.

Der SCHLÜSSEL ist der definierte private Schlüssel, der den Vorzeichenteil in JWT darstellt.
Der Header-Teil des PHP-JWT-Pakets wurde für uns fertiggestellt. Der Verschlüsselungscode lautet wie folgt

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

Es ist ersichtlich, dass die Standardverschlüsselungsmethode HS256 ist. Dies ist auch der Grund, warum jwt sicher ist. Zu diesem Zeitpunkt ist die HS256-Verschlüsselung noch sehr sicher.
Dieses Paket unterstützt auch die Zertifikatverschlüsselung.

Dieses Paket hat den Ver- und Entschlüsselungsprozess für uns abgeschlossen. Wir müssen also nur den Poyload-Teil in JWT definieren. Das ist der Token-Teil in der Demo. Wenn die Verschlüsselung erfolgreich ist, wird eine verschlüsselte JWT-Zeichenfolge abgerufen. Das Frontend muss diese JWT-Zeichenfolge beim nächsten Anfordern der API als Authentifizierung übertragen.
Autorisierung in der Kopfzeile hinzufügen. Bei der serverseitigen Überprüfung wird dieser Wert ermittelt, um die Gültigkeit der Antwort zu überprüfen.

Im Folgenden sind einige gängige Konfigurationen von poyload aufgeführt

 $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",
         
        ];

Die darin enthaltenen Konfigurationen können frei konfiguriert werden, oder Sie können einige andere selbst hinzufügen. Diese werden allgemein von allen im Internet verwendet und man kann sagen, dass es sich dabei um eine Art Vereinbarung handelt.

Das obige ist der detaillierte Inhalt vonWas ist JWT? Ein kurzes Verständnis von JWT. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen