Heim  >  Artikel  >  PHP-Framework  >  Detailliertes Beispiel für thinkphp6 mit JWT-Authentifizierung

Detailliertes Beispiel für thinkphp6 mit JWT-Authentifizierung

WBOY
WBOYnach vorne
2022-06-24 12:57:124555Durchsuche

Dieser Artikel bringt Ihnen relevantes Wissen über thinkphp, das hauptsächlich die Probleme der Verwendung der JWT-Authentifizierung vorstellt. Ich hoffe, es wird für alle hilfreich sein.

Detailliertes Beispiel für thinkphp6 mit JWT-Authentifizierung

Empfohlenes Lernen: „PHP-Video-Tutorial

thinkphp6 Verwenden Sie jwt

  1. Der Client verwendet den Benutzernamen und das Passwort, um die Anmeldung anzufordern
  2. Der Server empfängt die Anfrage und überprüft den Benutzernamen und das Passwort
  3. Danach Bei erfolgreicher Überprüfung gibt der Server ein Token aus und gibt es an den Client zurück. Nach Erhalt des Tokens kann der Client es beispielsweise in einem Cookie speichern. Der Client muss den Server jedes Mal mitbringen, wenn er Ressourcen anfordert vom Server. Das ausgegebene Token kann in einem Cookie oder Header übertragen werden. Der Server empfängt die Anforderung und überprüft dann das in der Client-Anfrage enthaltene Token. Wenn die Überprüfung erfolgreich ist, werden die Anforderungsdaten an den Client zurückgegeben
  4. Installieren Sie die JWT-Erweiterung
  5. composer require firebase/php-jwt
  6. Gehen Sie nach der Installation zum Firebase-Ordner im Vendor-Verzeichnis
Rufen Sie die Kodierungs- und Dekodierungsmethoden in JWT auf, um Token zu generieren und Token zu überprüfen

Die globale Datei common.php im Projekt Das App-Verzeichnis wird verwendet und öffentlich gemacht. Da ich mehrere Anwendungen habe, habe ich es in common.php unter der API geschrieben. Sie können es entsprechend Ihren eigenen Bedürfnissen anpassen

Detailliertes Beispiel für thinkphp6 mit JWT-Authentifizierung

Führen Sie zuerst JWT ein und schreiben Sie dann zwei Methoden zum Generieren einer Signaturüberprüfung und eines Überprüfungstokens.

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

Verwenden Sie JWT, um ein Token zu generierenDetailliertes Beispiel für thinkphp6 mit JWT-Authentifizierung

    /**
     * 使用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;
    }

Benutzer-Controller erstellen

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

Der Benutzer meldet sich erfolgreich an und gibt das Front-End-Token zurück. Das Front-End speichert das Token und trägt dieses Token im Header Die nächste Anfrage. Das Back-End akzeptiert das Token und überprüft es in der Middleware. Erstellen Sie eine API-Middleware. Abschließend gibt es zwei Lösungen, um mit dem Problem des Token-Ablaufs umzugehen Die Token-Zeit ist länger, sodass das Token nicht abläuft. Dies hat jedoch einen Nachteil. Sobald der Client das Token erhält, ist es gleichbedeutend mit dem Besitz eines Schlüssels und die Initiative liegt in den Händen des Benutzers. Daher wird diese Lösung nicht empfohlen. Die zweite Möglichkeit ist die Back-End-Verarbeitung. Wenn das Token abläuft, wird das neue Token an das Front-End übergeben, das neue Token wird gespeichert und bei der nächsten Anforderung übertragen . Token-Anfrage. Ich bin Programmierer Fengfeng, ein Programmierer, der es liebt zu lernen und herumzuspielen.

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonDetailliertes Beispiel für thinkphp6 mit JWT-Authentifizierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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