Maison développement back-end Problème PHP Comment définir un jeton en php

Comment définir un jeton en php

Sep 25, 2020 pm 02:06 PM
token

Comment définir le jeton en PHP : définissez d'abord le chemin de routage pour obtenir le jeton ; puis établissez la couche Service ; puis créez la classe Utilisateur dans la couche Modèle, et créez les méthodes de vérification et la gestion des exceptions correspondantes dans le validateur. classe et classe d'exception ; Terminez enfin l'écriture du jeton Token.

Comment définir un jeton en php

Recommandé : "Tutoriel vidéo PHP"

L'interface API back-end que nous avons développée aura des exigences d'autorisation , comme certaines interfaces contenant des informations privées, exigent que le visiteur transmette un jeton qui lui a été délivré à l'avance lors de la demande de l'interface.

C'est comme un jeton, nous le "passerons" seulement si le visiteur le montre.

Ce qui suit est un enregistrement des idées d'écriture de code pour les jetons d'autorisation.

1. Aperçu du processus

Définir le chemin de routage pour obtenir le Token et accepter le paramètre de code (source du code : serveur WeChat, le système de connexion est basé sur le système WeChat)

Établir la couche Service, dans Créer la classe de base Token et la classe UserToken dans cette couche

La classe UserToken gère toute la logique : Génération et retour du Token

Créer la classe User dans le Modèle couche, qui est responsable de la lecture et de l'écriture des tables de données utilisateur pour le service. L'appel UserToken de la couche

Créer les méthodes de vérification correspondantes et la gestion des exceptions dans la classe de validation et la classe d'exception

Controller-> Couche de service->La couche modèle renvoie la valeur à la couche de service-> ;La couche de service renvoie la valeur au contrôleur et l'ensemble du processus termine l'écriture du jeton

2. Instructions spécifiques

Définissez d'abord le chemin de routage :

Route::post(    'api/:version/token/user',    'api/:version.Token/getToken');
Copier après la connexion

Ensuite créez le Token control Device, définissez la méthode getToken correspondant au chemin de routage :

public function getToken($code='') {
        (new TokenGet())->goCheck($code); // 验证器        $token = (new UserToken($code))->get();        return [            'token' => $token
        ];
    }
Copier après la connexion

Avant d'appeler la couche Service, vous devez vérifier le paramètres passés, définissez donc le validateur TokenGet :

class TokenGet extends BaseValidate
{
    protected $rule = [      'code' => 'require|isNotEmpty'
    ];
 
    protected $message = [        'code' => '需要code才能获得Token!'
    ];
 }
Copier après la connexion

Retour au contrôle Token Une fois la vérification réussie, nous appelons la classe UserToken définie par la couche Service :

$token = (new UserToken($code))->get();
Copier après la connexion

Nous discutons ici de la couche Service et Couche modèle. Notre compréhension générale est que la couche Service est une encapsulation abstraite basée sur la couche Modèle.

La couche Modèle est uniquement chargée d'exploiter la base de données et de la renvoyer à la couche Service

Ensuite, la couche Service traite la logique métier et enfin la renvoie à la couche Contrôleur

Mais je pense que pour les petits projets, Service est en fait au même niveau que Modèle, car certaines interfaces simples peuvent être directement connectées au Contrôleur via la couche Modèle. Seules les interfaces relativement complexes, telles que les autorisations utilisateur, peuvent séparer les codes pour différentes fonctions. via la couche Service.

Ce type de traitement est plus flexible. Il existe un grand nombre d'interfaces très simples et il n'est pas nécessaire de passer par la couche Service une seule fois. Cela ressemble plus à des mouvements et n'a aucun sens.

Retour à l'écriture du code de la couche Service. Puisqu'il existe différents types de Token, nous créons d'abord une classe de base Token, qui contient quelques méthodes courantes. Il y a ensuite la préparation de la classe UserToken qui renvoie le token au visiteur.

Comme il est basé sur WeChat, nous avons besoin de trois informations : code, appid, appsecret, puis attribuons une valeur initiale à la classe UserToken via le constructeur :

function __construct($code) {    $this->code = $code;    $this->wxAppID = config('wx.app_id');    $this->wxAppSecret = config('wx.app_secret');    $this->wxLoginUrl = sprintf(
        config('wx.login_url'),        $this->wxAppID, $this->wxAppSecret, $this->code
    );
    }
Copier après la connexion

Ensuite, mettez-les Trois dans La position du paramètre de l'interface fournie par WeChat est d'obtenir une URL complète côté serveur WeChat et de demander l'openid dont nous avons besoin.

Ensuite, l'étape d'envoi d'une requête réseau est ignorée ici. Le serveur WeChat renverra un objet contenant openid. Après avoir jugé que la valeur de cet objet est OK, nous commençons l'étape de génération du token. Créez la fonction grantToken() :

private function grantToken($openidObj) {
 
        // 取出openid        $openid = $openidObj['openid'];
         
        // 通过Model层调用数据库,检查openid是否已经存在        $user = UserModel::getByOpenID($openid);
         
        // 如果存在,不处理,反之则新增一条user记录        if ($user) {            $uid = $user->id;
        } else {
            // 不存在,生成一条数据,具体方法略过            $uid = $this->newUser($openid); 
        }
         
        // 生成令牌,写入缓存(具体方法见下面的定义)        $cachedValue = $this->prepareCacheValue($openidObj, $uid);        $token = $this->saveToCache($cachedValue);
         
        // 令牌返回到调用者端        return $token;
}
 
private function prepareCacheValue($openidObj, $uid) {    $cachedValue = $openidObj;    $cachedValue['uid'] = $uid;    $cachedValue['scope'] = 16; // 权限值,自己定义    return $cachedValue;
}
     
private function saveToCache($cachedValue) {    $key = self::generateToken(); // 生成令牌的方法    $value = json_encode($cachedValue);    $tokenExpire = config('setting.token_expire'); // 设定的过期时间    $request = cache($key, $value, $tokenExpire);        if (!$request) {
            throw new TokenException([            'msg' => '服务器缓存异常',            'errorCode' => 10005
        ]);
    }    return $key; // 返回令牌:token
}
Copier après la connexion

Comme vous pouvez le voir, le Le processus principal est :

Obtenir l'openid

Vérifiez la base de données et vérifiez si l'openid existe déjà

S'il existe, ne le traitez pas, sinon ajoutez un nouvel enregistrement utilisateur

Générer le token, préparer les données du cache, écrire dans le cache

Renvoyer le token au client

La méthode generateToken() est définie en détail comme suit :

public static function generateToken() {    $randomChars = getRandomChars(32); // 32个字符组成一组随机字符串    $timestamp = $_SERVER['REQUEST_TIME_FLOAT'];  
    $salt = config('security.token_salt'); // salt 盐
    // 拼接三组字符串,进行MD5加密,然后返回    return md5($randomChars.$timestamp.$salt);
}    
function getRandomChars($length) {    $str = null;    $strPoll = &#39;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&#39;;    $max = strlen($strPoll) - 1;    for ($i = 0; $i < $length; $i++) {        $str .= $strPoll[rand(0, $max)];
    }    return $str;
}
Copier après la connexion

Sa fonction principale n'est pas claire. Il ne fait aucun doute qu'il s'agit de générer le jeton dont nous avons besoin - Chaîne de jeton. Il convient de mentionner que, comme generateToken() est également utilisé dans d'autres types de Token, il est placé dans la classe de base Token.

À ce stade, il vous suffit de renvoyer le jeton généré au contrôleur.

3. Résumé

L'écriture de jetons implique de nombreux processus. Afin d'éviter toute confusion, veillez à définir les codes responsables des différentes tâches selon différentes méthodes. Comme le reflète la méthode grantToken() dans l'exemple ci-dessus, il s'agit d'une méthode de base qui inclut tous les processus, mais différents processus spécifiques sont définis dans d'autres méthodes puis fournis à l'appel de la méthode grantToken().

Après cela, la méthode grantToken() est toujours facile à lire même si elle contient tous les processus.

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Que faire si le jeton de connexion n'est pas valide Que faire si le jeton de connexion n'est pas valide Sep 14, 2023 am 11:33 AM

Les solutions au jeton de connexion invalide incluent la vérification si le jeton a expiré, la vérification si le jeton est correct, la vérification si le jeton a été falsifié, la vérification si le jeton correspond à l'utilisateur, la suppression du cache ou des cookies, la vérification de la connexion réseau et l'état du serveur. , vous reconnecter ou demander un nouveau jeton. Contacter le support technique ou les développeurs, etc. Introduction détaillée : 1. Vérifiez si le jeton a expiré. Le jeton de connexion a généralement une période de validité définie. Une fois la période de validité dépassée, il sera considéré comme invalide, etc.

Comment résoudre le problème du jeton de connexion invalide Comment résoudre le problème du jeton de connexion invalide Sep 14, 2023 am 10:57 AM

Le problème du jeton de connexion invalide peut être résolu en vérifiant la connexion réseau, en vérifiant la période de validité du jeton, en effaçant le cache et les cookies, en vérifiant l'état de connexion, en contactant le développeur de l'application et en renforçant la sécurité du compte. Introduction détaillée : 1. Vérifiez la connexion réseau, reconnectez-vous au réseau ou modifiez l'environnement réseau ; 2. Vérifiez la période de validité du jeton, obtenez un nouveau jeton ou contactez le développeur de l'application 3. Effacez le cache et les cookies, effacez le navigateur ; cache et Cookie, puis reconnectez-vous à l'application; 4. Vérifiez l'état de connexion.

Comment résoudre le problème du stockage des jetons utilisateur dans Redis Comment résoudre le problème du stockage des jetons utilisateur dans Redis May 31, 2023 am 08:06 AM

Redis stocke les jetons utilisateur Lors de la conception d'un système similaire au commerce électronique, une exigence courante est que chaque page doit contenir des informations sur l'utilisateur connecté. Il existe deux solutions courantes : utiliser des cookies pour enregistrer et utiliser JWT pour enregistrer. Mais si le cache Redis est utilisé dans le système, il existe également une troisième solution : mettre en cache le jeton utilisateur dans Redis. Générez un jeton lors de la connexion et stockez-le dans Redis // Générez un objet jeton et enregistrez-le dans Redis redisTemplate.opsForHash().put("token","user",user)

Comment Vue3+Vite utilise deux jetons pour obtenir une actualisation insensée Comment Vue3+Vite utilise deux jetons pour obtenir une actualisation insensée May 10, 2023 pm 01:10 PM

1. Authentification de connexion par jeton jwt : JSONWebToken. Il s'agit d'un protocole d'authentification généralement utilisé pour vérifier les informations d'identité et les autorisations d'identité demandées. Composé de trois parties : Header, Hayload, Signatureheader : c'est-à-dire les informations d'en-tête, qui sont les informations de base décrivant ce jeton, au format json {"alg": "HS256", // indique l'algorithme de signature, la valeur par défaut est HMACSHA256 ( écrit comme HS256) "type": "JWT" ​​// Indique le type de jeton. Les jetons JWT sont uniformément écrits comme JWT} pa.

Comment résoudre l'erreur de syntaxe C++ : « expression primaire attendue avant le jeton « : » » ? Comment résoudre l'erreur de syntaxe C++ : « expression primaire attendue avant le jeton « : » » ? Aug 26, 2023 pm 04:06 PM

Comment résoudre l'erreur de syntaxe C++ : « expectedprimary-expressionbefore » : « jeton » ? Les erreurs de syntaxe sont un problème courant dans la programmation C++. L'une des erreurs courantes est le message d'erreur "expectedprimary-expressionbefore':'token". Cette erreur se produit généralement lors de l'utilisation d'expressions conditionnelles et de l'opérateur ternaire. Cet article présentera la cause de cette erreur

Que signifie le jeton ? Que signifie le jeton ? Feb 29, 2024 am 10:19 AM

Le jeton est une sorte de monnaie virtuelle. C'est une monnaie numérique utilisée pour représenter les autorisations des utilisateurs, enregistrer les informations de transaction et payer en monnaie virtuelle. Le jeton peut être utilisé pour effectuer des transactions sur un réseau spécifique, il peut être utilisé pour acheter ou vendre des monnaies virtuelles spécifiques, et il peut également être utilisé pour payer des services spécifiques.

Le cours ChatGPT d'Andrew Ng est devenu viral : l'IA a renoncé à écrire des mots à l'envers, mais a compris le monde entier Le cours ChatGPT d'Andrew Ng est devenu viral : l'IA a renoncé à écrire des mots à l'envers, mais a compris le monde entier Jun 03, 2023 pm 09:27 PM

De manière inattendue, ChatGPT ferait encore des erreurs stupides à ce jour ? Maître Ng Enda l'a souligné lors du dernier cours : ChatGPT n'inversera pas les mots ! Par exemple, laissez-le inverser le mot sucette, et le résultat est pilollol, ce qui est complètement déroutant. Oh, c'est effectivement un peu choquant. À tel point qu’après qu’un internaute qui écoutait le cours ait publié un message sur Reddit, celui-ci a immédiatement attiré un grand nombre de spectateurs et le message a rapidement atteint 6 000 vues. Et ce n'est pas un bug accidentel. Les internautes ont constaté que ChatGPT est effectivement incapable d'accomplir cette tâche, et les résultats de nos tests personnels sont également les mêmes. △Le test actuel de ChatGPT (GPT-3.5) et même de nombreux produits dont Bard, Bing, Wen Xinyiyan, etc. ne fonctionne pas. △Test réel Bard△Test réel Wen Xinyiyan

Quelle est l'utilisation du jeton dans vue Quelle est l'utilisation du jeton dans vue Jan 29, 2023 am 10:31 AM

Le jeton dans Vue est une chaîne de chaînes générées côté serveur, utilisée comme jeton pour les requêtes des clients ; ses méthodes d'utilisation sont les suivantes : 1. Encapsuler la méthode d'exploitation du stockage local 2. Après avoir encapsulé le stockage, utilisez-le pour monter ; dans le composant global ; 3. Mettez "token" dans "request.js" 4. Définissez le garde de routage dans "index.vue" sous router.

See all articles