Maison  >  Article  >  cadre php  >  Exemple détaillé de thinkphp6 utilisant l'authentification jwt

Exemple détaillé de thinkphp6 utilisant l'authentification jwt

WBOY
WBOYavant
2022-06-24 12:57:124394parcourir

Cet article vous apporte des connaissances pertinentes sur thinkphp, qui présente principalement les problèmes liés à l'utilisation de l'authentification jwt. Examinons-le ensemble, j'espère qu'il sera utile à tout le monde.

Exemple détaillé de thinkphp6 utilisant l'authentification jwt

Apprentissage recommandé : "Tutoriel vidéo PHP"

thinkphp6 Utilisez jwt

  1. Le client utilise le nom d'utilisateur et le mot de passe pour demander la connexion
  2. Le serveur reçoit la demande et vérifie le nom d'utilisateur et le mot de passe
  3. Après vérification réussie, le serveur émettra un jeton et le renverra au client. Après avoir reçu le jeton, le client peut le stocker, par exemple en le plaçant dans un cookie. Le client doit apporter le serveur avec lui à chaque fois qu'il demande des ressources. du serveur. Le jeton émis peut être transporté dans un cookie ou un en-tête
  4. Le serveur reçoit la demande, puis vérifie le jeton transporté dans la demande du client. Si la vérification réussit, les données de la demande sont renvoyées au client
  5. .
  6. Installez l'extension jwt
  7. composer require firebase/php-jwt
  8. Après l'installation, accédez au dossier Firebase dans le répertoire du fournisseur

Appelez les méthodes d'encodage et de décodage dans JWT pour générer des jetons et vérifier les jetons

Exemple détaillé de thinkphp6 utilisant lauthentification jwtLe fichier global common.php dans le projet Le répertoire de l'application est utilisé et rendu public Méthode, puisque j'ai plusieurs applications, je l'ai écrit dans common.php sous l'API. Vous pouvez l'ajuster de manière appropriée en fonction de vos propres besoins

Introduisez d'abord JWT, puis écrivez-en deux. méthodes pour générer une vérification de signature et un jeton de vérification.

Exemple détaillé de thinkphp6 utilisant lauthentification jwt

<?phpuse  \Firebase\JWT\JWT;use Firebase\JWT\Key;// 应用公共文件/**
 * 生成验签
 * @param $uid 用户id
 * @return mixed
 */function signToken($uid){
    $key=&#39;abcdefg&#39;;         //自定义的一个随机字串用户于加密中常用的 盐  salt
    $token=array(
        "iss"=>$key,        //签发者 可以为空
        "aud"=>'',          //面象的用户,可以为空
        "iat"=>time(),      //签发时间
        "nbf"=>time(),      //在什么时候jwt开始生效
        "exp"=> time()+30,  //token 过期时间
        "data"=>[           //记录的uid的信息
            'uid'=>$uid,
        ]
    );
    $jwt = JWT::encode($token, $key, "HS256");  //生成了 token
    return $jwt;}/**
 * 验证token
 * @param $token
 * @return array|int[]
 */function checkToken($token){
    $key='abcdefg';     //自定义的一个随机字串用户于加密中常用的 盐  salt
    $res['status'] = false;
    try {
        JWT::$leeway    = 60;//当前时间减去60,把时间留点余地
        $decoded        = JWT::decode($token, new Key($key, 'HS256')); //HS256方式,这里要和签发的时候对应
        $arr            = (array)$decoded;
        $res['status']  = 200;
        $res['data']    =(array)$arr['data'];
        return $res;

    } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
        $res['info']    = "签名不正确";
        return $res;
    }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
        $res['info']    = "token失效";
        return $res;
    }catch(\Firebase\JWT\ExpiredException $e) { // token过期
        $res['info']    = "token过期";
        return $res;
    }catch(Exception $e) { //其他错误
        $res['info']    = "未知错误";
        return $res;
    }}

Utilisez jwt pour générer un jeton
    /**
     * 使用jwt生成token字符串
     */
    public function setJwtToken()
    {
        $uid = input('uid'); // 接收生成token字符串 如:123
        $token = signToken($uid);
        // 生成字符串: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQxNDUwMTU0LCJuYmYiOjE2NDE0NTAxNTcsImV4cCI6MTY0MTQ1NzM1NCwiZGF0YSI6eyJ1aWQiOiIxMjMifX0.I_GAkMsOhtEpIPkizCuQA-b9H6ovSovWx0AwAYI-b0s
        echo $token;die;
    }

    /**
     * 使用jwt验证token字符串
     */
    public function checkJwtToken()
    {
        $token  = input('token'); // 接收生成token字符串
        $result = checkToken($token);
        // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) )
        print_r($result);die;
    }

Créer un contrôleur utilisateur
<?phpdeclare  (strict_types = 1);namespace app\api\controller;use think\facade\Db;use think\Request;class User{
    public function login(Request $request)
    {
        if ($request->isPost()){
            $username = $request->param('username','','trim');
            $password = $request->param('password','','trim');

            //查询数据库
            $user = Db::name('user')->where('username',$username)->find();

            if (!$user){
                return json(['status' => 'fail','msg' => '用户名不存在']);
            }
            if ($user['password']!==md5($password)){
                return json(['status' => 'fail','msg' => '密码错误']);
            }
            $getToken = $this->token($user);
            return json(['status' => 'success','msg' => '登陆成功','token' => $getToken]);
        }
    }
    public function token($user)
    {
        $uid = $user['username']; // 接收生成token字符串 如:123
        $token = signToken($uid);
        dd($token);
    }
    /**
     * 验证token
     */
    public function chToken()
    {
        $token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQ4MDkwMDkyLCJuYmYiOjE2NDgwOTAwOTIsImV4cCI6MTY0ODA5MDEyMiwiZGF0YSI6eyJ1aWQiOiJcdTVmMjBcdTRlMDlcdTk4Y2UifX0.oJFpNcZ6stMymOCbD-meX0IPEIYLYNcwKxhMItF2cMw';
        $result = checkToken($token);
        // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) )
        print_r($result);die;
    }}

L'utilisateur se connecte avec succès et renvoie le jeton frontal. Le front-end stocke le jeton et transporte ce jeton dans l'en-tête pendant. la requête suivante. Le back-end Acceptez le jeton et vérifiez-le dans le middleware

Créer un middleware api

<?phpdeclare  (strict_types = 1);namespace app\middleware;class Api{
    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    public function handle($request, \Closure $next)
    {
        //toke 合法性验证
        $header = $request->header();
        //判读请求头里有没有token
        if(!isset($header['token'])){
            return json(['code'=>440,'msg'=>'request must with token']);
        }
        $token = $header['token'];

        try {
            // token 合法
            $token = checkToken($token);
        }catch (\Exception $e){
            return json(['code'=>440,'msg'=>'invalid token']);
        }

        return $next($request);
    }}
Enfin, il existe deux solutions pour gérer le problème de l'expiration du jeton. La première consiste à définir. le temps de jeton est plus long, de sorte que le jeton n'expire pas, mais cela présente un inconvénient. Une fois que le client obtient le jeton, cela équivaut à avoir une clé, et l'initiative est entre les mains de l'utilisateur. Cette solution n'est donc pas recommandée. Le second est le traitement back-end. Lorsque le jeton expire, le jeton est réacquis et le nouveau jeton est transmis au front-end. Le front-end stocke le nouveau jeton, remplace le jeton d'origine et transporte le nouveau jeton avec la requête suivante. .demande de jeton.

Je suis le programmeur Fengfeng, un programmeur qui aime apprendre et jouer.

Apprentissage recommandé : "

Tutoriel vidéo PHP

"

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