ホームページ  >  記事  >  バックエンド開発  >  Go で JWT を使用した認証のベスト プラクティス

Go で JWT を使用した認証のベスト プラクティス

王林
王林オリジナル
2023-06-17 12:54:102450ブラウズ

Web アプリケーションの人気とその適用範囲の拡大に伴い、ユーザー データと ID 情報を保護することがますます重要になっています。アプリケーションでの認証は非常に必要ですが、この記事では JWT を使用して Go 言語で認証を実装する方法のベスト プラクティスを紹介します。

JWTとは

JWTとはJSON Web Tokenの略で、Cookieなどの保存手段を必要とせずに安全に情報を送信できる認証機構です。

A JWT は 3 つの部分で構成されます。

  • ヘッダー: アルゴリズムやタイプなどの情報が含まれます。
  • Payload: ユーザー名、ID など、渡されるユーザー情報を保存します。
  • 署名: ヘッダー、ペイロード、キーによって生成された署名により、JWT が改ざんされていないことが保証されます。

ユーザーがログインすると、サーバーはユーザーの情報を検証します。合格した場合、サーバーは JWT を生成し、クライアントに返します。クライアントが他のリソースに再度アクセスするときは、サーバー側でのユーザー認証のために、JWT を送信します。これにより、リクエストごとにセッションを認証して保存する必要がなくなります。

JWT を使用して Go 言語で認証を実装する方法

インストール

JWT を使用するには、関連パッケージをインストールする必要があります。 Go 言語では、公式パッケージ github.com/dgrijalva/jwt-go が提供されており、簡単に利用できます。

go get github.com/dgrijalva/jwt-go

JWT トークンの作成

次のコードを使用して JWT トークンを作成できます。

func createToken() string {
    token := jwt.New(jwt.SigningMethodHS256)
    claims := token.Claims.(jwt.MapClaims)
    claims["name"] = "张三"
    claims["exp"] = time.Now().Add(time.Hour * 24).Unix() // 1天过期
    tokenString, _ := token.SignedString([]byte("自定义密钥"))
    return tokenString
}

jwt.New(jwt.SigningMethodHS256) は作成に使用されます。 JWT トークン インスタンス。jwt.SigningMethodHS256 は HS256 アルゴリズムを使用することを意味します。

トークン インスタンスのクレーム タイプはマップです。マップに情報を追加することで、カスタマイズされたデータをトークンに保存できます。認証時にペイロード内のデータを取得できます。

Claims では、「name」と「exp」を追加してユーザー情報と有効期限を定義し、キーで署名することで JWT トークンを生成しました。

JWT トークンの解析

クライアントが JWT トークンをサーバーに送信すると、サーバーは JWT トークンの有効性を確認し、解析してユーザー情報を取得する必要があります。

func parseToken(tokenString string) {
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("预期的签名方法不正确:%v", token.Header["alg"])
        }
        return []byte("自定义密钥"), nil
    })
    if err != nil {
        fmt.Println("JWT解析失败")
        return
    }
    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
        fmt.Println(claims["name"], claims["exp"])
    } else {
        fmt.Println("无效的JWT令牌")
    }
}

コードでは、型変換をキャストtoken.Claims.(jwt.MapClaims)jwt.Claimsをマップ形式で取得して確認します。

また、送信中に署名が改ざんされていないことを確認するために、署名を検証するためのキー (ここでは「カスタム キー」) を提供する必要があります。

JWT トークンの検証に合格すると、トークンに保存されているカスタム データなどの情報を Claims から取得できます。

JWT 使用例

以下は、JWT トークンの作成と JWT トークンの解析の完全なプロセスを示す完全な Go の例です。

package main

import (
    "fmt"
    "time"

    "github.com/dgrijalva/jwt-go"
)

func main() {
    // 创建JWT令牌
    token := jwt.New(jwt.SigningMethodHS256)
    claims := token.Claims.(jwt.MapClaims)
    claims["name"] = "张三"
    claims["exp"] = time.Now().Add(time.Hour * 24).Unix()

    // 签名密钥
    tokenString, _ := token.SignedString([]byte("自定义密钥"))
    fmt.Println("JWT创建成功", tokenString)

    // 解析JWT令牌
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("预期的签名方法不正确:%v", token.Header["alg"])
        }
        return []byte("自定义密钥"), nil
    })
    if err != nil {
        fmt.Println("JWT解析失败")
        return
    }
    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
        fmt.Println("JWT解析成功", claims["name"], claims["exp"])
    } else {
        fmt.Println("无效的JWT令牌")
    }
}

概要

Web アプリケーションでは認証が非常に必要です。JWT 資格情報を使用すると、サーバー側の処理オーバーヘッドが削減され、パフォーマンスが向上します。また、より安全で信頼性の高い認証メカニズムでもあります。 Go 言語では、JWT の使用は非常に便利で、関連パッケージ github.com/dgrijalva/jwt-go を通じて簡単に実装できます。

つまり、JWT は非常に優れた認証方法であり、JWT を使用すると、ユーザー データと ID 情報のセキュリティを保護し、Web アプリケーションのパフォーマンスと信頼性を向上させることができます。

以上がGo で JWT を使用した認証のベスト プラクティスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。