Maison  >  Article  >  développement back-end  >  Utilisez JWT en langage Go pour implémenter une authentification utilisateur simple et sécurisée

Utilisez JWT en langage Go pour implémenter une authentification utilisateur simple et sécurisée

王林
王林original
2023-06-15 18:52:081797parcourir

Avec le développement rapide de la technologie réseau, de plus en plus de sites Web et d'applications doivent mettre en œuvre des fonctions d'authentification des utilisateurs. Cependant, les méthodes traditionnelles d'authentification par nom d'utilisateur et mot de passe présentent des risques de sécurité car elles sont généralement stockées dans la base de données. Une fois la base de données attaquée, les informations utilisateur seront divulguées. Afin de résoudre ce problème, JWT (JSON Web Token) a vu le jour. JWT est une norme ouverte (RFC 7519) qui définit un moyen simple et autonome de transmettre des informations pouvant être vérifiées et fiables. Cet article explique comment utiliser JWT en langage Go pour implémenter une authentification utilisateur simple et sécurisée.

Comment fonctionne JWT

Avant de présenter comment utiliser JWT en langage Go, comprenons d'abord comment fonctionne JWT. JWT se compose de trois parties :

  • En-tête : cette partie contient des informations sur le type de jeton et l'algorithme, utilisant généralement le cryptage SHA256.
  • Payload : Cette partie stocke les informations à transmettre, telles que le nom d'utilisateur, les autorisations, etc., et peut également contenir certains champs personnalisés.
  • Signature : Cette partie est une signature générée en cryptant une chaîne composée d'en-tête et de charge utile.

Les jetons générés par JWT peuvent être transmis via des en-têtes HTTP ou des paramètres d'URL. Lorsque le client demande au serveur, le serveur vérifiera le jeton JWT dans l'en-tête de la demande ou les paramètres d'URL. Si le jeton est valide, il renverra les données demandées par le client. Si le jeton n'est pas valide, un message d'erreur est renvoyé.

Dans les applications réelles, le serveur doit définir une période de validité lors de la génération de JWT. Après l'expiration, le client doit à nouveau obtenir un nouveau jeton JWT.

Utilisation de JWT en langage Go

En langage Go, la fonction JWT peut être implémentée rapidement et facilement à l'aide de bibliothèques tierces. Cet article recommande d'utiliser la bibliothèque jwt-go, qui prend en charge la génération et la vérification de JWT et présente les avantages de la sécurité des types et des performances élevées.

Installer la bibliothèque jwt-go

Entrez la commande suivante dans le terminal. Vous pouvez utiliser la commande go get pour installer la bibliothèque jwt-go.

go get github.com/dgrijalva/jwt-go

Générer JWT

En langage Go, la génération de JWT peut être réalisée par le code suivant :

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

Dans le code, utilisez la fonction jwt.New() pour créer les informations d'en-tête JWT, définir la période de validité et les informations transmises (dans l'exemple, un champ nommé sub est transmis) puis le jeton JWT est signé à l'aide de la fonction SignedString().

Verify JWT

En langage Go, la vérification de JWT peut être implémentée à l'aide du code suivant :

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")
    }
}

Dans le code, utilisez la fonction jwt.Parse() pour analyser le jeton JWT à vérifier, puis utilisez la signature transmise clé à vérifier. Lors de la vérification, utilisez d'abord la fonction Claims() pour obtenir l'heure de validité dans le JWT, puis comparez-la avec l'heure actuelle. Si le jeton a expiré, un message d'erreur est renvoyé.

Résumé

En tant que méthode d'authentification sûre et simple, JWT est largement utilisé dans le développement Web. Cet article explique comment utiliser la bibliothèque jwt-go dans le langage Go pour implémenter rapidement et simplement la fonction JWT. JWT peut être utilisé non seulement pour l'authentification des utilisateurs, mais également pour la transmission de données, l'authentification API et d'autres scénarios. Dans les applications pratiques, nous devons prêter attention à la période de validité de JWT et à la protection de sécurité de la clé de signature.

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