今日のインターネット アプリケーション開発では、セキュリティへの注目がますます高まっています。 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" )
- crypto/rsa: RSA public および RSA を生成および解析する関数が含まれています。秘密鍵 。
- crypto/x509: PKIX 形式の証明書関数が含まれています
- encoding/base64: JWT の一部をエンコードおよびデコードするために使用されます
- encoding/pem: 抽出および保存に使用されますPEM 形式の証明書
- errors: 返されたエラー メッセージの処理に使用されます
- fmt: 標準フォーマット関数
- time: 標準時刻関数
- github .com/ dgrijalva/jwt-go: JWT の主な依存関係
2. キー ファイルの作成
最初に、秘密キー ファイルを作成する必要があります。次のコマンドを使用して秘密キー ファイルを生成します。
openssl genrsa -out app.rsa 1024
これにより、app.rsa
という名前の 1024 ビット RSA キーが生成されます。このキーを使用して JWT を生成します。
- 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 トークンの解析
次のコードを使用して 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 サイトの他の関連記事を参照してください。

GoroutinesAreSareSareSareSormethodSthaturncurlyntingo、Enableing and LightweightConcurrency.1)theyRuntimeSimeSingMultiplexing、SountyStorunonFeweroSthReads.2)ゴルチンズを失ったことを許可します

initistoistoInitializevariables、setupconutupurations、orforformndexedarysetupbe foreThemainfunctionexecutes.useinitby:1)inginginyourcodeTorunautorunaintalunain、2)KeepingItshortandpocusedonsimpletasks、3)ConsididiriveSusinginsingingingingingingingingingingingingingingingingingingingingingingsingpltassksを使用すると、

go interfacesaremethodsignaturesetsetsattypesmustimplement、unableingpolymorphism withintinheritance forcleaner、modularcode.theyareimplictilistifisisfiestified、houseforfflexibleapisanddeaupling、busrecarefulusoavoidoidoimoidimeerrororsypertety。

Goで回復()関数を使用して、パニックから回復します。特定の方法は次のとおりです。1)回復()を使用して、延期関数でパニックをキャプチャして、プログラムのクラッシュを避けます。 2)デバッグの詳細なエラー情報を記録します。 3)特定の状況に基づいてプログラムの実行を再開するかどうかを決定します。 4)パフォーマンスに影響を及ぼさないように注意して使用します。

この記事では、弦の操作にGOの「文字列」パッケージを使用し、効率を高め、ユニコードを効果的に処理するための一般的な機能とベストプラクティスの詳細を説明します。

記事の詳細は、暗号化操作のためのGoの「暗号」パッケージ、安全な実装のための主要な生成、管理、およびベストプラクティスについて議論するためのパッケージ。

この記事では、現在の時間の取得、特定の時間の作成、文字列の解析、経過時間の測定など、日付、時間、およびタイムゾーンを処理するためのGoの「時間」パッケージの使用について詳しく説明しています。

記事では、可変検査と変更のためにGOの「反射」パッケージを使用して、方法とパフォーマンスの考慮事項を強調するために説明します。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

WebStorm Mac版
便利なJavaScript開発ツール

Dreamweaver Mac版
ビジュアル Web 開発ツール

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ホットトピック









