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

golang は jwt を実装します

WBOY
WBOYオリジナル
2023-05-22 10:31:36924ブラウズ

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