ThinkPHP5 – Stellen Sie JWT mithilfe der think-API bereit

藏色散人
Freigeben: 2019-09-30 18:09:30
nach vorne
3467 Leute haben es durchsucht

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
Nach dem Login kopieren

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,
];
Nach dem Login kopieren

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
Nach dem Login kopieren

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);
    }
Nach dem Login kopieren

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';
Nach dem Login kopieren

5. Routing konfigurieren

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

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;
        }
Nach dem Login kopieren

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');
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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为空
            ]);
        }
    }
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage