Web アプリケーションの人気とその適用範囲の拡大に伴い、ユーザー データと ID 情報を保護することがますます重要になっています。アプリケーションでの認証は非常に必要ですが、この記事では JWT を使用して Go 言語で認証を実装する方法のベスト プラクティスを紹介します。
JWTとはJSON Web Tokenの略で、Cookieなどの保存手段を必要とせずに安全に情報を送信できる認証機構です。
A JWT は 3 つの部分で構成されます。
ユーザーがログインすると、サーバーはユーザーの情報を検証します。合格した場合、サーバーは JWT を生成し、クライアントに返します。クライアントが他のリソースに再度アクセスするときは、サーバー側でのユーザー認証のために、JWT を送信します。これにより、リクエストごとにセッションを認証して保存する必要がなくなります。
JWT を使用するには、関連パッケージをインストールする必要があります。 Go 言語では、公式パッケージ github.com/dgrijalva/jwt-go
が提供されており、簡単に利用できます。
go get github.com/dgrijalva/jwt-go
次のコードを使用して 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 トークンの有効性を確認し、解析してユーザー情報を取得する必要があります。
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 トークンの解析の完全なプロセスを示す完全な 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 サイトの他の関連記事を参照してください。