今日のインターネット アプリケーション開発では、セキュリティへの注目がますます高まっています。 JSON Web トークン (JWT) は、ほとんどの Web API 設計で一般的な認証および認可スキームの 1 つになりました。 JWT は、関係者間で情報を安全に通信するためのコンパクトで自己完結型の方法を定義するオープン スタンダード (RFC 7519) です。
Go 言語は非常に強力なサーバーサイド プログラミング言語であり、JWT を簡単に実装するのが非常に簡単です。この記事では、GolangでJWTを実装する方法を紹介します。
1.依存関係を導入する
まず、次のライブラリを導入する必要があります:
import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/base64" "encoding/pem" "errors" "fmt" "time" "github.com/dgrijalva/jwt-go" )
2. キー ファイルの作成
最初に、秘密キー ファイルを作成する必要があります。次のコマンドを使用して秘密キー ファイルを生成します。
openssl genrsa -out app.rsa 1024
これにより、app.rsa
という名前の 1024 ビット RSA キーが生成されます。このキーを使用して JWT を生成します。
次のコードを使用して JWT トークンを作成できます:
func GenerateJWT() (string, error) { token := jwt.New(jwt.SigningMethodHS256) claims := token.Claims.(jwt.MapClaims) claims["authorized"] = true claims["user"] = "user@example.com" claims["exp"] = time.Now().Add(time.Hour * 1).Unix() tokenString, err := token.SignedString([]byte("secret")) if err != nil { return "", err } return tokenString, nil }
この関数は HS256 を使用して JWT トークンを作成します。アルゴリズム。まず、新しい JWT トークン オブジェクトを作成します。次に、そのステートメントをその主張に追加します。この例では、「Authorization」が「True」に設定され、ユーザーが「user@example.com」に設定され、JWT の有効期限が 1 時間後に設定されることを宣言します。最後に、提供された「シークレット」 (この例では「シークレット」) を使用して JWT に署名し、その文字列を返します。
次のコードを使用して JWT トークンを解析できます:
func ParseJWT(tokenString string) (jwt.MapClaims, error) { 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"), nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return claims, nil } return nil, errors.New("invalid token") }
関数は JWT トークン文字列を受け入れ、試行します。 JWT を解析します。ここでは、HS256 アルゴリズムを使用して jwt を復号します。まず、トークンが HMAC アルゴリズムを使用して署名されているかどうかを確認する必要があります。そうでない場合は、エラーが返されます。次に、暗号化キー (この例では「secret」) を返します。解析が成功すると、関数は検証済みで期限切れになっていないクレームを返します。解析が失敗した場合、関数はエラー メッセージを返します。
HS256 アルゴリズムに加えて、JWT ペイロードの暗号化に使用できる暗号化アルゴリズムが他にも多数あります。たとえば、RSA アルゴリズムを使用して署名された JWT は、HS256 アルゴリズムを使用するよりも安全です。 RSA アルゴリズムを使用して JWT トークンを生成する方法は次のとおりです。
func GenerateJWT() (string, error) { privateKey, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { return "", err } token := jwt.NewWithClaims(jwt.SigningMethodRS256, jwt.MapClaims{ "authorized": true, "user": "user@example.com", "exp": time.Now().Add(time.Hour * 1).Unix(), }) tokenString, err := token.SignedString(privateKey) if err != nil { return "", err } return tokenString, nil }
ここでは、最初に 2048 ビットの RSA 秘密キーを生成します。次に、RS256 アルゴリズムを使用して JWT トークンに署名します。最後に、秘密キーを使用して JWT トークンに署名します。
JWT トークンを解析するときは、別のアプローチも採用する必要があります:
func ParseJWT(tokenString string) (jwt.MapClaims, error) { publicKey := ` -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArtpZKxF+1MDwcJ61KeJt GjHYiAL46jEewsjF9oBz59J2y5/v/tE/RQjJjOtGvLQ5LfPYBK+j+Z6QIwU1ZzCJ I0MT5mn81znZCsy7zcZI7+kRPG8Fk5JzKM2ug7RAuYqnOjArL8+V+uS4Moh2RWdN yZizvjajzKtbH5zLC49Dd3X/SrjzPQpzt8HY4Z7YxYej8/Akl3nxdx9Q/OPG2NYP xtflmpLLJc7roqkfVwwMQeC1apHr/klI3FHPvK/pzBoUCUOpTfnyvHg8O1+PyMKJ CldHEhuzUsTR5jM5fXv0M4+vL36QO8k1WhO4gcQTD6X7fIWqFhfrRM/jreG+bv8c 7wIDAQAB -----END PUBLIC KEY----- ` block, _ := pem.Decode([]byte(publicKey)) if block == nil { return nil, errors.New("failed to decode PEM block containing public key") } pub, err := x509.ParsePKIXPublicKey(block.Bytes) if err != nil { return nil, err } token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return pub, nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return claims, nil } return nil, errors.New("invalid token") }
この関数では、最初に RSA 公開キーを抽出してから、それを jwt.Parse に渡す必要があります。関数。トークンを解析するとき、jwt-go ライブラリは検証のために公開キーを自動的に使用します。ここで使用される公開キーは PKIX 形式で提供されることに注意してください。 OpenSSL などのツールを使用して、PEM 公開キーを PKIX 形式にエクスポートできます。
6. 概要
この記事では、HS256 および RS256 アルゴリズムを使用して Golang で JWT トークンを作成および解析する方法を紹介しました。これは、将来の Web アプリケーションで使用できる一般的な認証および認可スキームです。この記事がお役に立てば幸いです。
以上がgolang は jwt を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。