Heim  >  Artikel  >  Backend-Entwicklung  >  Verwenden Sie JWT in der Go-Sprache, um eine einfache und sichere Benutzerauthentifizierung zu implementieren

Verwenden Sie JWT in der Go-Sprache, um eine einfache und sichere Benutzerauthentifizierung zu implementieren

王林
王林Original
2023-06-15 18:52:081752Durchsuche

Mit der rasanten Entwicklung der Netzwerktechnologie müssen immer mehr Websites und Anwendungen Benutzerauthentifizierungsfunktionen implementieren. Herkömmliche Methoden zur Benutzernamen- und Passwortauthentifizierung bergen jedoch Sicherheitsrisiken, da sie normalerweise in der Datenbank gespeichert werden. Sobald die Datenbank angegriffen wird, werden Benutzerinformationen preisgegeben. Um dieses Problem zu lösen, wurde JWT (JSON Web Token) ins Leben gerufen. JWT ist ein offener Standard (RFC 7519), der eine einfache, eigenständige Methode zur Übertragung von Informationen definiert, die überprüft und vertrauenswürdig sein können. In diesem Artikel wird erläutert, wie Sie JWT in der Go-Sprache verwenden, um eine einfache und sichere Benutzerauthentifizierung zu implementieren.

So funktioniert JWT

Bevor wir die Verwendung von JWT in der Go-Sprache vorstellen, wollen wir zunächst verstehen, wie JWT funktioniert. JWT besteht aus drei Teilen:

  • Header: Dieser Teil enthält Informationen zum Tokentyp und zum Algorithmus, normalerweise unter Verwendung der SHA256-Verschlüsselung.
  • Payload: Dieser Teil speichert die zu übertragenden Informationen wie Benutzername, Berechtigungen usw. und kann auch einige benutzerdefinierte Felder enthalten.
  • Signatur: Dieser Teil ist eine Signatur, die durch Verschlüsselung einer Zeichenfolge bestehend aus Header und Payload generiert wird.

JWT-generierte Token können über HTTP-Header oder URL-Parameter übergeben werden. Wenn der Client den Server anfordert, überprüft der Server das JWT-Token im Anforderungsheader oder in den URL-Parametern. Wenn das Token gültig ist, gibt er die vom Client angeforderten Daten zurück. Wenn das Token ungültig ist, wird eine Fehlermeldung zurückgegeben.

In tatsächlichen Anwendungen sollte der Server beim Generieren von JWT einen Gültigkeitszeitraum festlegen. Nach Ablauf muss der Client erneut ein neues JWT-Token erhalten.

JWT in der Go-Sprache verwenden

In der Go-Sprache kann die JWT-Funktion mithilfe von Bibliotheken von Drittanbietern schnell und einfach implementiert werden. In diesem Artikel wird die Verwendung der jwt-go-Bibliothek empfohlen, die die Generierung und Überprüfung von JWT unterstützt und die Vorteile von Typsicherheit und hoher Leistung bietet.

Jwt-go-Bibliothek installieren

Geben Sie den folgenden Befehl in das Terminal ein. Sie können den Befehl go get verwenden, um die jwt-go-Bibliothek zu installieren.

go get github.com/dgrijalva/jwt-go

JWT generieren

In der Go-Sprache kann die Generierung von JWT durch den folgenden Code erreicht werden:

package main

import (
    "fmt"
    "time"
    "github.com/dgrijalva/jwt-go"
)

func main() {
    // 创建JWT头信息
    token := jwt.New(jwt.SigningMethodHS256)
    // 设置有效期
    token.Claims = jwt.MapClaims{
        "exp": time.Now().Add(time.Hour * 72).Unix(),
        "iat": time.Now().Unix(),
        "sub": "1234567890",
    }
    // 对生成的JWT令牌进行签名
    signedToken, err := token.SignedString([]byte("secret-key"))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(signedToken)
}

Verwenden Sie im Code die Funktion jwt.New(), um die JWT-Header-Informationen zu erstellen, den Gültigkeitszeitraum und die übertragenen Informationen festzulegen (im Beispiel wird ein Feld mit dem Namen sub übertragen) und dann wird das JWT-Token mit der Funktion SignedString() signiert.

JWT überprüfen

In der Go-Sprache kann die Überprüfung von JWT mit dem folgenden Code implementiert werden:

package main

import (
    "fmt"
    "time"
    "github.com/dgrijalva/jwt-go"
)

func main() {
    // 待验证的JWT令牌
    tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTAzMDAzMTAsImlhdCI6MTYxMDgwNTExMCwic3ViIjoiMTIzNDU2Nzg5MCJ9.5AtrChvChVuWI3TkazGt1mDhbscT8-Qal5U6Qc4dqhc"
    // 解析JWT头信息
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }
        return []byte("secret-key"), nil
    })
    if err != nil {
        fmt.Println(err)
        return
    }
    // 验证JWT有效期
    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
        expirationTime := time.Unix(int64(claims["exp"].(float64)), 0)
        if expirationTime.Before(time.Now()) {
            fmt.Println("JWT has expired")
        } else {
            fmt.Println("JWT is valid")
        }
    } else {
        fmt.Println("JWT is not valid")
    }
}

Verwenden Sie im Code die Funktion jwt.Parse(), um das zu überprüfende JWT-Token zu analysieren, und verwenden Sie dann die übergebene Signatur Schlüssel zur Überprüfung. Verwenden Sie während der Überprüfung zunächst die Funktion Claims(), um die Gültigkeitszeit im JWT abzurufen, und vergleichen Sie sie dann mit der aktuellen Zeit. Wenn das Token abgelaufen ist, wird eine Fehlermeldung zurückgegeben.

Zusammenfassung

Als sichere und einfache Authentifizierungsmethode wird JWT häufig in der Webentwicklung eingesetzt. In diesem Artikel wird erläutert, wie Sie mit der jwt-go-Bibliothek in der Go-Sprache schnell und einfach die JWT-Funktion implementieren. JWT kann nicht nur zur Benutzerauthentifizierung, sondern auch zur Datenübertragung, API-Authentifizierung und anderen Szenarien verwendet werden. In praktischen Anwendungen sollten wir auf die Gültigkeitsdauer von JWT und den Sicherheitsschutz des Signaturschlüssels achten.

Das obige ist der detaillierte Inhalt vonVerwenden Sie JWT in der Go-Sprache, um eine einfache und sichere Benutzerauthentifizierung zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn