JSON Web Token (JWT), une norme Open JSON (RFC 7519) implémentée pour adopter des déclarations entre les environnements d'application réseau. Le jeton est conçu pour être compact et sécurisé, particulièrement adapté aux scénarios de connexion unique (SSO) pour les sites distribués.
Les instructions JWT sont généralement utilisées pour transmettre des informations d'identité utilisateur authentifiées entre le fournisseur d'identité et le fournisseur de services afin de faciliter l'acquisition de ressources à partir du serveur de ressources. Certaines informations de déclaration supplémentaires nécessaires à une autre logique commerciale peuvent également être ajoutées. Le jeton peut également être utilisé pour l'authentification ou chiffré.

HMAC-SHA256(SecretKey, Base64UrlEncode(JWT-Header)+'.'+Base64UrlEncode(JWT-Payload))base64(header).base64(payload).signature de jeton JWT pour revenir au client.composer require tinywan/jwt use Tinywan Jwt JwtToken ;
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' email ' => ' [email protected] '
];
$ token = JwtToken:: generateToken ( $ user );
var_dump ( json_encode ( $ token ));Sortie (format JSON)
{
"token_type" : " Bearer " ,
"expires_in" : 36000 ,
"access_token" : " eyJ0eXAiOiJAUR-Gqtnk9LUPO8IDrLK7tjCwQZ7CI... " ,
"refresh_token" : " eyJ0eXAiOiJIEGkKprvcccccQvsTJaOyNy8yweZc... "
}Paramètres de réponse
| paramètre | taper | décrire | Exemples de valeurs |
|---|---|---|---|
| token_type | chaîne | Type de jeton | Porteur |
| expires_in | int | Le temps de validité du bon, unité: secondes | 36000 |
| Access_token | chaîne | Accéder aux informations d'identification | Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| actualiser | chaîne | Actualiser les informations d'identification (utilisation des informations d'accès à l'accès expirées) | Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
1. Obtenez l' id actuel
$ id = Tinywan Jwt JwtToken:: getCurrentId ();2. Obtenez tous les champs
$ email = Tinywan Jwt JwtToken:: getExtend ();3. Obtenez des champs personnalisés
$ email = Tinywan Jwt JwtToken:: getExtendVal ( ' email ' );4. Token de rafraîchissement (Get Access Token par un jeton rafraîchissant)
$ refreshToken = Tinywan Jwt JwtToken:: refreshToken ();5. Le temps restant de la période de validité des jetons
$ exp = Tinywan Jwt JwtToken:: getTokenExp (); 6. Connexion unique du périphérique. La valeur par défaut est désactivée. Veuillez modifier le fichier de configuration config/plugin/tinywan/jwt
' is_single_device ' => true,La connexion à disque unique prend en charge la définition des champs
clientet la personnalisation de la connexion unique du client (par défaut estWEB, c'est-à-dire la page Web), telle que:MOBILE,APP,WEB,ADMIN,API,OTHER, etc.
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => ' MOBILE ' ,
];
$ token = Tinywan Jwt JwtToken:: generateToken ( $ user );
var_dump ( json_encode ( $ token ));7. Obtenir les informations utilisateur actuelles (modèle)
$ user = Tinywan Jwt JwtToken:: getUser (); Le projet de configuration 'user_model' est une fonction anonyme, qui renvoie un tableau vide par défaut. Vous pouvez personnaliser votre propre modèle de retour en fonction de votre projet ORM
Configuration Thinkorm
' user_model ' => function ( $ uid ) {
// 返回一个数组
return think facade Db:: table ( ' resty_user ' )
-> field ( ' id,username,create_time ' )
-> where ( ' id ' , $ uid )
-> find ();
}Configuration de Laravelor
' user_model ' => function ( $ uid ) {
// 返回一个对象
return support Db:: table ( ' resty_user ' )
-> where ( ' id ' , $ uid )
-> select ( ' id ' , ' email ' , ' mobile ' , ' create_time ' )
-> first ();
}8. Nettoyage de jeton
$ res = Tinywan Jwt JwtToken:: clear ();Ce n'est que si l'élément de configuration
is_single_deviceesttruequ'il prendra effet. Paramètres facultatifs:MOBILE,APP,WEB,ADMIN,API,OTHER, etc.
9. client de terminal personnalisé
// 生成WEB令牌
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => JwtToken:: TOKEN_CLIENT_WEB
];
$ token = JwtToken:: generateToken ( $ user );
// 生成移动端令牌
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => JwtToken:: TOKEN_CLIENT_MOBILE
];
$ token = JwtToken:: generateToken ( $ user ); La valeur par défaut est WEB
10. Personnalisez l'heure d'expiration du jeton d'accès et de la token de rafraîchissement
$ extend = [
' id ' => 2024 ,
' access_exp ' => 7200 , // 2 小时
];
$ token = Tinywan Jwt JwtToken:: generateToken ( $ extend );11. Code d'erreur d'expiration des jetons
401011401012401013401014401015401021401022401023401024401025 Les algorithmes de signature les plus courants de JWT (JWA): HS256(HMAC-SHA256) , RS256(RSA-SHA256) et ES256(ECDSA-SHA256)
+--------------+-------------------------------+--------------------+
| " alg " Param | Digital Signature or MAC | Implementation |
| Value | Algorithm | Requirements |
+--------------+-------------------------------+--------------------+
| HS256 | HMAC using SHA - 256 | Required |
| HS384 | HMAC using SHA - 384 | Optional |
| HS512 | HMAC using SHA - 512 | Optional |
| RS256 | RSASSA - PKCS1 -v1_5 using | Recommended |
| | SHA - 256 | |
| RS384 | RSASSA - PKCS1 -v1_5 using | Optional |
| | SHA - 384 | |
| RS512 | RSASSA - PKCS1 -v1_5 using | Optional |
| | SHA - 512 | |
| ES256 | ECDSA using P- 256 and SHA - 256 | Recommended+ |
| ES384 | ECDSA using P- 384 and SHA - 384 | Optional |
| ES512 | ECDSA using P- 521 and SHA - 512 | Optional |
| PS256 | RSASSA - PSS using SHA - 256 and | Optional |
| | MGF1 with SHA - 256 | |
| PS384 | RSASSA - PSS using SHA - 384 and | Optional |
| | MGF1 with SHA - 384 | |
| PS512 | RSASSA - PSS using SHA - 512 and | Optional |
| | MGF1 with SHA - 512 | |
| none | No digital signature or MAC | Optional |
| | performed | |
+--------------+-------------------------------+--------------------+
The use of " + " in the Implementation Requirements column indicates
that the requirement strength is likely to be increased in a future
version of the specification.Vous pouvez voir que seuls RS256 et ES256 sont marqués recommandés.
L'installation du plug-in utilise
HS256par défaut.
HS256 utilise le même 「secret_key」 pour la signature et la vérification. Une fois que secret_key fuit, il n'y a pas de sécurité du tout. Par conséquent, HS256 ne convient qu'à l'authentification centralisée, et les signatures et la vérification doivent être effectuées par des parties de confiance.
La série RS256 est signée à l'aide de la clé privée RSA et vérifiée à l'aide de la clé publique RSA.
Même si la clé publique est divulguée, elle n'aura aucun effet. Assurez-vous simplement que la clé privée est sécurisée. RS256 peut déléguer la vérification à d'autres applications, il suffit de leur donner la clé publique.
Voici les commandes de génération d'algorithmes RS Series pour référence uniquement
ssh-keygen -t rsa -b 4096 -E SHA512 -m PEM -P "" -f RS512 .key
openssl rsa -in RS512 .key -pubout -outform PEM -out RS512 .key.pubssh-keygen -t rsa -b 4096 -E SHA354 -m PEM -P "" -f RS384 .key
openssl rsa -in RS384 .key -pubout -outform PEM -out RS384 .key.pubssh-keygen -t rsa -b 4096 -E SHA256 -m PEM -P "" -f RS256 .key
openssl rsa -in RS256 .key -pubout -outform PEM -out RS256 .key.pubLes élèves qui ne comprennent pas peuvent en apprendre davantage sur la vidéo et il y aura des instructions détaillées.
https://www.w3cschool.cn/fastapi/fastapi-cmia3lcw.html
Il existe de nombreuses façons de traiter des questions telles que la sécurité, l'authentification de l'identité et l'autorisation. Et c'est souvent un sujet complexe et «difficile». Dans de nombreux cadres et systèmes, le traitement de la sécurité et de l'authentification de l'identité ne fait que beaucoup d'efforts et de code (dans de nombreux cas, il peut représenter 50% ou plus de tout le code écrit).
JWT vous aide à gérer la sécurité facilement et rapidement de manière standard sans rechercher et apprendre toutes les spécifications de sécurité.
Supposons que vous ayez une API backend dans un domaine. Et vous avez un frontage dans un chemin différent (ou une application mobile) dans un autre domaine ou dans le même domaine. Et vous voulez qu'il existe un moyen d'obtenir le frontal pour s'authentifier avec le back-end en utilisant le nom d'utilisateur et le mot de passe. Nous pouvons utiliser OAuth2 pour le construire via JWT.
username et password dans l'avant et clique sur Entrée.username et password à notre API à une URL spécifique (pour déclarer tokenUrl="token" ).Authorization d'un en-tête avec le Bearer de valeur plus le jeton. Si le jeton contient foobar , le contenu de l'en-tête Authorization sera: Bearer foobar .注意:中间是有个空格.