Heim  >  Artikel  >  PHP-Framework  >  ThinkPHP5 – Stellen Sie JWT mithilfe der think-API bereit

ThinkPHP5 – Stellen Sie JWT mithilfe der think-API bereit

藏色散人
藏色散人nach vorne
2019-09-12 10:56:473460Durchsuche

Da das nächste Projekt TP5 zum Entwickeln eines kleinen Programms verwenden wird, habe ich das TP-Framework verwendet. Da die Entwicklung kleiner Programme den Hintergrund zum Schreiben der API-Schnittstelle erfordert, habe ich online überprüft, ob es entsprechende Abhängigkeiten gibt. Ich empfehle das Think-API-Erweiterungstool, da ich hauptsächlich die JWT-Funktion verwenden möchte, um den Anmeldestatus des Miniprogrammbenutzers zu ermitteln. Lassen Sie uns kurz über die Bereitstellung von JWT über Think-API sprechen .

1. Installationsabhängigkeiten

Die TP-Version, die ich verwende, ist TP5.1, die Download-Adresse der Erweiterung lautet: https://github.com/czewail/think- api, Abhängigkeiten über Composer installieren:

$ composer require zewail/think-api:1.1.x

2. Konfigurationsanweisungen

Nachdem die Erweiterung installiert wurde, können wir sie in der Datei „vendor/think-api/config/“ anzeigen. jwt.php-Datei, JWT-Konfiguration.

Hauptsächlich der Benutzermodellpfad, der geändert werden muss:

return [
    // 加密算法
    'algorithm'      => 'HS256',
    // HMAC算法使用的加密字符串
    'key'            => 'ex-key',
    // RSA算法使用的私钥文件路径
    'privateKeyPath' => '/home/rsa_private_key.pem',
    // RSA算法使用的公钥文件路径
    'publicKeyPath'  => '/home/rsa_public_key.pem',
    // 误差时间,单位秒
    'deviation'      => 60,
    // 过期时间, 单位分钟
    'ttl'            => 120,
    // 用户模型路径
    'user'           => app\api\model\User::class,
];

3. Erstellen Sie den API-Schnittstellencontroller

Erstellen Sie, was wir wollen Befehlszeile Um das Token an den Front-End-Controller zurückzugeben

$ php thnk make:controller api/Index

4. Referenzabhängigkeit

Fügen Sie den Dateipfad im erstellten Dateiheader hinzu: Verwenden Sie ZewailApiFacadesJWT Der Code lautet wie folgt:

public function index()
    {
        //获取前台发送过来的登录信息
        $tel      = $this->request->tel;
        $password = $this->request->passwword;
        //把登录信息传入JWT验证匹配
        $credentials = ['tel' => $tel, 'password' => $password];
        //1.验证通过返回token  1和2任意取一种方式
        $token = JWT::attempt($credentials);
        //2.通过已有账户模型生成token  1和2任意取一种方式
        $user  = User::find(84);
        $token = JWT::fromUser($user);
        $msg   = "验证成功";
        //把token发送给前台确认是否成功登陆
        return $this->ApiSuccess($token, $msg);
    }

Zu beachten ist, dass die von der API empfangenen Standardparameter Mobil und Passwort sind. Im Tür-zu-Tür-Beispiel sind dies Tel und Passwort. Der Variablenname wurde geändert, daher müssen wir zur Veranschaulichung Code in das Benutzermodell einfügen. Und so weiter.

public $jwtSub = 'tel';

5. Routing konfigurieren

在 route/route.php 中加入路由地址 Route::get('api/test', 'api/Index/index');

6. Test ausführen

Die Testergebnisse in Postman sind wie folgt Wir können das Token im Hintergrund generieren und zur Überprüfung und Anmeldung an die Rezeption zurücksenden.

ThinkPHP5 – Stellen Sie JWT mithilfe der think-API bereit

7. Verifizierungstoken (ergänzend)

Wir senden das zuvor generierte Token erneut mit dem enthaltenen Header. Gehen Sie zum Backend um eine Token-Überprüfung durchzuführen, wie in der Abbildung unten gezeigt.

ThinkPHP5 – Stellen Sie JWT mithilfe der think-API bereit

trägt dann den Header, um auf die Verifizierungsroute zuzugreifen. Der Verifizierungscode lautet wie folgt:

       if ($user = JWT::authenticate()) {
                return true;
        }

Wenn die Verifizierung korrekt ist, wird true zurückgegeben.

8. Bezüglich des Problems der Nichtexistenz und des Token-Ablaufs (ergänzend)

Die think-api-Schnittstelle in der Datei sellerthink-apisrcJWT/Factoriescode.php bietet uns mit entsprechender Fehlerrückmeldung.

// 检查是否过期
if (isset($payload->exp) && (time() - $this->deviation) >= $payload->exp) {
    throw new TokenExpiredException('该 Token 已过期');
}
// 验证签名
if (!$this->verify("$header64.$payload64", $signature)) {
    throw new TokenInvalidException('无效的 Token');
}

Wie nutzen wir diese Statusrückmeldungen? Dazu ist die Verwendung von Front-End-Middleware erforderlich, um die vom Front-End gesendeten Token-Informationen zu überprüfen.

Erstellen Sie zuerst die Middleware:

$ php think make:middle Test

Schreiben Sie dann den folgenden Inhalt in die Middleware:

  //用try catch捕获报错反馈
    public function handle($request, Closure $next)
    {
        try {
            if (!$user = JWT::authenticate()) {
                return response()->json([
                    'errcode' => 1004,
                    'errmsg'  => '无此用户',
                ], 404);
            }
            return $next($request);
        } catch (TokenExpiredException $e) {
            return response()->json([
                'errcode' => 1003,
                'errmsg'  => 'token 过期', //token已过期
            ]);
        } catch (TokenInvalidException $e) {
            return response()->json([
                'errcode' => 1002,
                'errmsg'  => 'token 无效', //token无效
            ]);
        } catch (JWTException $e) {
            return response()->json([
                'errcode' => 1001,
                'errmsg'  => '缺少token', //token为空
            ]);
        }
    }

Dann referenzieren Sie ihn in der Route.

Empfohlenes Tutorial: Thinkphp-Tutorial

Das obige ist der detaillierte Inhalt vonThinkPHP5 – Stellen Sie JWT mithilfe der think-API bereit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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