Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in JWT-Prinzipien und einfache Anwendungen (mit Code)

Einführung in JWT-Prinzipien und einfache Anwendungen (mit Code)

不言
不言nach vorne
2019-03-29 10:53:392931Durchsuche

Dieser Artikel bietet Ihnen eine Einführung in die JWT-Prinzipien und einfache Anwendungen (mit Code). Ich hoffe, dass er für Freunde hilfreich ist.

JWT-Authentifizierungs-Login

Kürzlich arbeite ich an einem Audit-System, bei dem die JWT-Login-Authentifizierung für die Hintergrundanmeldung verwendet wird.

Was ist JWT

Json Web Token (JWT) ist gemäß der Definition der offiziellen Website ein JSON-basierter offener Standard, der zur Übertragung von Ansprüchen zwischen Netzwerkanwendungsumgebungen implementiert ist. Der Token ist kompakt und sicher konzipiert und eignet sich besonders für verteilte Standorte. auf Szenario. JWT-Ansprüche werden im Allgemeinen verwendet, um authentifizierte Benutzeridentitätsinformationen zwischen Identitätsanbietern und Dienstanbietern zu übertragen, um Ressourcen vom Ressourcenserver zu erhalten. Es können auch einige zusätzliche Anspruchsinformationen hinzugefügt werden, die für andere Geschäftslogiken erforderlich sind zur Authentifizierung oder verschlüsselt.

Warum JWT verwenden

Dies wird hauptsächlich mit der herkömmlichen Sitzung verglichen. Bei der herkömmlichen Sitzung müssen einige Anmeldeinformationen auf der Serverseite gespeichert werden, normalerweise im Speicher, und der Back-End-Server ist ein Cluster usw. In einer verteilten Situation speichern andere Hosts diese Informationen nicht, daher müssen sie alle über einen festen Host überprüft werden. Wenn die Anzahl der Benutzer groß ist, kann es leicht zu einem Engpass am Authentifizierungspunkt kommen Die Anwendung ist schwer zu erweitern.

JWT-Prinzip

JWT besteht aus drei Teilen, die durch Punkte getrennt sind. Es sieht so aus, dass das JWT-Token selbst keine Leerzeichen, Zeilenumbrüche usw. enthält. Das Folgende wird aus ästhetischen Gründen verarbeitet.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19.
m0HD1SUd30TWKuDQImwjIl9a-oWJreG7tKVzuGVh7e4
1. Header

Der Header-Teil ist ein JSON, der die Metadaten von JWT beschreibt, normalerweise wie folgt

{
  "alg": "HS256",
  "typ": "JWT"
}

alg gibt den für die Signatur verwendeten Algorithmus an, der Standardwert ist HMAC SHA256, geschrieben als HS256, tye stellt den Typ dieses Tokens dar, JWT-Token verwendet JWT einheitlich, das durch den obigen Header generierte Token ist

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
2 Payload (Payload)

Offizielle Vorschriften 7 Felder, wie folgt erklärt

  • iss: der Aussteller, Sie können die ID eingeben, um dieses Token usw. zu generieren, optionale Parameter
  • sub: der Kunde, für den dieses JWT bestimmt ist, Sie können die Benutzerkonto-ID usw. speichern, optional
  • aud: Der Empfänger des JWTtokens kann die Schnittstellen-URL eingeben, die dieses Token generiert, dies ist jedoch nicht obligatorisch, optional
  • exp: Ablaufzeit, Zeitstempel, Ganzzahl, optionale Parameter
  • iat: die Zeit, zu der das Token generiert wurde, Unix-Zeit, Zeitstempel, optionale Parameter
  • nbf (Not Before): zeigt an, dass das Token nicht generiert wurde vor diesem Zeitpunkt verfügbar, Überprüfung bedeutet, dass es nicht bestanden wird, optional
  • jti: JWT-ID, wird hauptsächlich zum Generieren eines einmaligen Tokens verwendet, optionale Parameter

Zusätzlich zu den offiziellen, Wir können auch einige benutzerdefinierte Felder definieren, aber bedenken Sie, dass BASE64 umkehrbar ist, also geben Sie keine vertraulichen Informationen ein.
Das Folgende ist ein Beispiel;

{
  "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"
  ]
}

Die obige Nutzlast ist nach der BASE64-Verschlüsselung das generierte Token

eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19
Signatur ist die Verschlüsselung der beiden in den beiden vorherigen Teilen generierten Token. Hier ist sie HS256. Ein geheimer Schlüssel ist erforderlich, kann nicht durchgesickert werden, der allgemeine Prozess ist wie folgt:
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

Verwendung von JWT

JWT-Token wird im Allgemeinen im Anforderungsheader platziert, natürlich kann es auch platziert werden im Cookie, kann aber nicht domänenübergreifend im Cookie platziert werden, zum Beispiel:

Authorization: Bearer <token>

Einfache Generierung und Überprüfung von JWT in Python

jwt-Bibliothek

Token generieren

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}

Token überprüfen

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

Es ist zu beachten, dass, wenn der aud-Parameter beim Generieren hinzugefügt wird, der Audience-Parameter auch bei der Überprüfung verwendet werden muss und die Werte gleich sein müssen

Dieser Artikel ist hier drüben. Weitere spannende Inhalte finden Sie in der Spalte

Python-Video-Tutorial

auf der chinesischen PHP-Website!

Das obige ist der detaillierte Inhalt vonEinführung in JWT-Prinzipien und einfache Anwendungen (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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