ホームページ バックエンド開発 Golang golang は jwt を実装します

golang は jwt を実装します

May 22, 2023 am 10:31 AM

今日のインターネット アプリケーション開発では、セキュリティへの注目がますます高まっています。 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 を生成します。

  1. 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 に署名し、その文字列を返します。

  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」) を返します。解析が成功すると、関数は検証済みで期限切れになっていないクレームを返します。解析が失敗した場合、関数はエラー メッセージを返します。

  1. より高度な暗号化方法

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 サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Debian OpenSSLの脆弱性は何ですか Debian OpenSSLの脆弱性は何ですか Apr 02, 2025 am 07:30 AM

OpenSSLは、安全な通信で広く使用されているオープンソースライブラリとして、暗号化アルゴリズム、キー、証明書管理機能を提供します。ただし、その歴史的バージョンにはいくつかの既知のセキュリティの脆弱性があり、その一部は非常に有害です。この記事では、Debian SystemsのOpenSSLの共通の脆弱性と対応測定に焦点を当てます。 Debianopensslの既知の脆弱性:OpenSSLは、次のようないくつかの深刻な脆弱性を経験しています。攻撃者は、この脆弱性を、暗号化キーなどを含む、サーバー上の不正な読み取りの敏感な情報に使用できます。

PPROFツールを使用してGOパフォーマンスを分析しますか? PPROFツールを使用してGOパフォーマンスを分析しますか? Mar 21, 2025 pm 06:37 PM

この記事では、プロファイリングの有効化、データの収集、CPUやメモリの問題などの一般的なボトルネックの識別など、GOパフォーマンスを分析するためにPPROFツールを使用する方法について説明します。

Goでユニットテストをどのように書きますか? Goでユニットテストをどのように書きますか? Mar 21, 2025 pm 06:34 PM

この記事では、GOでユニットテストを書くことで、ベストプラクティス、モッキングテクニック、効率的なテスト管理のためのツールについて説明します。

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Goの反射パッケージの目的を説明してください。いつリフレクションを使用しますか?パフォーマンスへの影響は何ですか? Goの反射パッケージの目的を説明してください。いつリフレクションを使用しますか?パフォーマンスへの影響は何ですか? Mar 25, 2025 am 11:17 AM

この記事では、コードのランタイム操作に使用されるGoの反射パッケージについて説明します。シリアル化、一般的なプログラミングなどに有益です。実行やメモリの使用量の増加、賢明な使用と最高のアドバイスなどのパフォーマンスコストについて警告します

GOでテーブル駆動型テストをどのように使用しますか? GOでテーブル駆動型テストをどのように使用しますか? Mar 21, 2025 pm 06:35 PM

この記事では、GOでテーブル駆動型のテストを使用して説明します。これは、テストのテーブルを使用して複数の入力と結果を持つ関数をテストする方法です。読みやすさの向上、重複の減少、スケーラビリティ、一貫性、および

go.modファイルで依存関係をどのように指定しますか? go.modファイルで依存関係をどのように指定しますか? Mar 27, 2025 pm 07:14 PM

この記事では、go.modを介してGOモジュールの依存関係の管理、仕様、更新、競合解決をカバーすることについて説明します。セマンティックバージョンや定期的な更新などのベストプラクティスを強調しています。

See all articles