Maison  >  Article  >  cadre php  >  ThinkPHP5-Déployer JWT à l'aide de think-API

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

藏色散人
藏色散人avant
2019-09-12 10:56:473410parcourir

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

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

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

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

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';

5. Configurer le routage

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

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

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');
}

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

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为空
            ]);
        }
    }

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer