Maison > cadre php > PensezPHP > le corps du texte

ThinkPHP5-Déployer JWT à l'aide de think-API

藏色散人
Libérer: 2019-09-30 18:09:30
avant
3467 Les gens l'ont consulté

Parce que le prochain projet utilisera TP5 pour développer un petit programme, j'ai donc utilisé le framework TP. Parce que le développement de petits programmes nécessite l'arrière-plan pour écrire l'interface API, j'ai vérifié en ligne s'il existe des dépendances associées. Je le recommande ici. Outil d'extension think-api, car je souhaite principalement utiliser la fonction jwt pour déterminer l'état de connexion de l'utilisateur du mini-programme. Prenons mon projet comme exemple et parlons brièvement du déploiement de JWT via think-api. .

1. Installer les dépendances

La version TP que j'utilise est TP5.1, l'adresse de téléchargement de l'extension est : https://github.com/czewail/think- api, Installez les dépendances via composer :

$ composer require zewail/think-api:1.1.x
Copier après la connexion

2. Instructions de configuration

Une fois l'extension installée, nous pouvons la voir dans le fichier supplier/think-api/config/. fichier jwt.php configuration jwt.

Principalement le chemin du modèle utilisateur, qui doit être modifié :

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,
];
Copier après la connexion

3. Créer le contrôleur d'interface API

Créer ce que nous voulons via le. ligne de commande Pour renvoyer le jeton au contrôleur frontal

$ php thnk make:controller api/Index
Copier après la connexion

4. Dépendance de référence

Ajoutez le chemin du fichier dans l'en-tête du fichier créé : utilisez ZewailApiFacadesJWT Le cas ; le code est le suivant :

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);
    }
Copier après la connexion

Une chose à noter est que les paramètres par défaut reçus par l'API sont le mobile et le mot de passe. Dans l'exemple du porte-à-porte, il s'agit du numéro de téléphone et du mot de passe. Le nom de la variable a été modifié, nous devons donc insérer du code dans le modèle utilisateur pour illustrer. Et ainsi de suite.

public $jwtSub = 'tel';
Copier après la connexion

5. Configurer le routage

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

6. Exécuter le test

Les résultats du test dans Postman sont les suivants, donc nous pouvons Le jeton peut être généré en arrière-plan et renvoyé à la réception pour vérification et connexion.

ThinkPHP5-Déployer JWT à laide de think-API

7. Jeton de vérification (supplémentaire)

Nous renvoyons le jeton généré précédemment dans postman avec l'en-tête inclus Aller au backend pour effectuer la vérification du jeton, comme indiqué dans la figure ci-dessous.

ThinkPHP5-Déployer JWT à laide de think-API

porte ensuite l'en-tête pour accéder à la route de vérification. Le code de vérification est le suivant :

       if ($user = JWT::authenticate()) {
                return true;
        }
Copier après la connexion

Si la vérification est correcte, true sera renvoyé.

8. Concernant le problème de non-existence et d'expiration des jetons (supplémentaire)

L'interface think-api dans le fichier supplierthink-apisrcJWT/Factoriescode.php fournit nous avec un retour d'erreur correspondant.

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

Alors, comment utilisons-nous ces retours d'état ? Cela nécessite l'utilisation d'un middleware frontal pour vérifier les informations de jeton envoyées par le front-end.

Créez d'abord le middleware :

$ php think make:middle Test
Copier après la connexion

Puis écrivez le contenu suivant dans le 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为空
            ]);
        }
    }
Copier après la connexion

Puis référencez-le dans la route.

Tutoriel recommandé : tutoriel thinkphp

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal