Maison  >  Article  >  développement back-end  >  Introduction aux principes JWT et aux applications simples (avec code)

Introduction aux principes JWT et aux applications simples (avec code)

不言
不言avant
2019-03-29 10:53:392931parcourir

Cet article vous apporte une introduction aux principes de JWT et aux applications simples (avec code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Connexion par authentification JWT

Récemment, je travaille sur un système d'audit, l'authentification de connexion JWT est utilisée pour la connexion en arrière-plan

Qu'est-ce que JWT

<.>Le jeton Web Json (JWT), selon la définition du site officiel, est un standard ouvert basé sur JSON mis en œuvre pour transférer les revendications entre les environnements d'applications réseau. Le jeton est conçu pour être compact et sécurisé, particulièrement adapté aux sites distribués. Signature unique. sur scénario. Les revendications JWT sont généralement utilisées pour transférer des informations d'identité d'utilisateur authentifiées entre les fournisseurs d'identité et les fournisseurs de services afin d'obtenir des ressources du serveur de ressources. Certaines informations de revendication supplémentaires nécessaires à d'autres logiques métier peuvent également être ajoutées. pour authentification ou crypté.

Pourquoi utiliser JWT

Ceci est principalement comparé à la session traditionnelle. La session traditionnelle doit enregistrer certaines informations de connexion côté serveur, généralement en mémoire, et le serveur back-end est un. cluster, etc. Dans une situation distribuée, les autres hôtes ne sauvegardent pas ces informations, ils doivent donc tous être vérifiés via un hôte fixe. Si le nombre d'utilisateurs est important, il est facile de former un goulot d'étranglement au point d'authentification, ce qui crée un goulot d'étranglement. l'application est difficile à développer.

Principe JWT

JWT se compose de trois parties, séparées par des points. Il ressemble à ceci. Le jeton JWT lui-même n'a pas d'espaces, de sauts de ligne, etc. Ce qui suit est traité pour des raisons d'esthétique

1. En-tête
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19.
m0HD1SUd30TWKuDQImwjIl9a-oWJreG7tKVzuGVh7e4
La partie En-tête est un json qui décrit les métadonnées de JWT, généralement comme suit

alg indique la signature utilisée Algorithme, la valeur par défaut est HMAC SHA256, écrit HS256, tye représente le type de ce jeton, le jeton JWT utilise JWT uniformément, le jeton généré par l'en-tête ci-dessus est
{
  "alg": "HS256",
  "typ": "JWT"
}

2. >Stipule officiellement 7 champs, expliqués comme suit
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
iss : l'émetteur, vous pouvez renseigner l'ID pour générer ce token, etc. Paramètres optionnels

sub : qu'est-ce que le JWT pour les clients, ils peuvent stocker l'identifiant du compte de l'utilisateur, etc. Facultatif
  • aud : Le destinataire du JWTtoken peut renseigner l'URL de l'interface qui génère ce jeton, mais ce n'est pas obligatoire
  • exp : Heure d'expiration, horodatage, entier, paramètres facultatifs
  • iat : heure à laquelle le token a été généré, heure unix, horodatage, paramètres facultatifs
  • nbf (Not Before) : indique que le token est ici Non disponible avant l'heure, ce qui signifie que la vérification a échoué, facultatif
  • jti : ID JWT, principalement utilisé pour générer un jeton unique, paramètres facultatifs
  • En plus des officiels, nous pouvons également définir certains champs personnalisés, mais étant donné que BASE64 est réversible, ne mettez pas d'informations sensibles
  • Voici un exemple

La charge utile ci-dessus est générée après le cryptage BASE64. Le jeton est

{
  "iss": "labs_purifier-api-panel",
  "iat": 1552975878,
  "exp": 1555567878,
  "aud": "http://ff-labs_purifier-api-test.fenda.io/prod/v1/auth/jwt",
  "sub": "1501385611884704",
  "scopes": [
    "register",
    "open",
    "login",
    "panel"
  ]
}
3. Signature (Signature)

La signature est le cryptage des deux jetons générés dans les deux parties précédentes. La méthode de cryptage utilisée est précisée dans l'en-tête, ici c'est HS256. La clé secrète est requise et ne peut pas être divulguée. Le processus général est le suivant :
eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19
Utilisation du jeton JWT

Le jeton JWT est généralement placé dans l'en-tête de la requête, mais bien sûr, il peut également être placé dans le cookie, mais il ne peut pas être placé dans le cookie sur plusieurs domaines, par exemple :
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

Génération et vérification simples de JWT en Python

bibliothèque jwt
Authorization: Bearer <token>

Générer le token

Jeton de vérification

def create_token():
    payload={
              "iss": "labs_purifier-api-panel",
              "iat": 1552975878,
              "exp": 1555567878,
              "aud": Config.AUDIENCE,
              "sub": "1501385611884704",
              "scopes": [
                "register",
                "open",
                "login",
                "panel"
              ]
            }
    token = jwt.encode(payload, Config.SECRET_KEY, algorithm='HS256')
    return True, {'access_token': token}
A noter que si le paramètre aud est ajouté lors de la génération, le paramètre audience doit également être utilisé lors de la vérification, et la valeur must Idem

Cet article est terminé ici Pour d'autres contenus passionnants, vous pouvez faire attention à la colonne
def verify_jwt_token(token):
    try:
        payload = jwt.decode(token, Config.SECRET_KEY,
                             audience=Config.AUDIENCE,
                             algorithms=['HS256'])
    except (ExpiredSignatureError, DecodeError):
        return False, token
    if payload:
        return True, jwt_model
Tutoriel vidéo Python

du site Web PHP chinois !

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