Go 言語の JWT を使用してシンプルで安全なユーザー認証を実装する

王林
リリース: 2023-06-15 18:52:08
オリジナル
1803 人が閲覧しました

ネットワーク技術の急速な発展に伴い、ユーザー認証機能を実装する必要があるWebサイトやアプリケーションが増えています。しかし、従来のユーザー名とパスワードによる認証方法は、データベースに保存されることが多く、データベースが攻撃されるとユーザー情報が漏洩してしまうというセキュリティ上のリスクがありました。この問題を解決するために登場したのがJWT(JSON Web Token)です。 JWT は、検証および信頼できる情報を送信するためのシンプルで自己完結型の方法を定義するオープン スタンダード (RFC 7519) です。この記事では、Go言語のJWTを使って簡単かつ安全なユーザー認証を実現する方法を紹介します。

JWT の動作原理

Go 言語で JWT を使用する方法を紹介する前に、まず JWT がどのように動作するかを理解しましょう。 JWT は 3 つの部分で構成されます。

  • ヘッダー: この部分には、通常 SHA256 暗号化を使用するトークン タイプとアルゴリズム情報が含まれます。
  • ペイロード: この部分には、ユーザー名、権限など、送信される情報が保存されます。また、いくつかのカスタム フィールドを含めることもできます。
  • Signature: この部分は、Header と Payload からなる文字列を暗号化して生成される署名です。

JWT によって生成されたトークンは、HTTP ヘッダー情報または URL パラメーターを通じて渡すことができます。クライアントがサーバーにリクエストを送信すると、サーバーはリクエスト ヘッダーまたは URL パラメーター内の JWT トークンをチェックし、トークンが有効であれば、クライアントがリクエストしたデータを返します。トークンが無効な場合は、エラー メッセージが返されます。

実際のアプリケーションでは、サーバーは JWT 生成時に有効期限を設定する必要があり、有効期限が切れた後、クライアントは新しい JWT トークンを再度取得する必要があります。

Go 言語での JWT の使用

サードパーティのライブラリを使用すると、JWT 関数を Go 言語で迅速かつ簡単に実装できます。この記事では、JWT の生成と検証をサポートし、型安全性と高いパフォーマンスの利点を持つ jwt-go ライブラリの使用を推奨します。

jwt-go ライブラリのインストール

ターミナルで次のコマンドを入力し、 go get コマンドを使用して jwt-go ライブラリをインストールできます。

go get github.com/dgrijalva/jwt-go
ログイン後にコピー

JWT の生成

Go 言語では、次のコードを使用して JWT を生成できます。

package main

import (
    "fmt"
    "time"
    "github.com/dgrijalva/jwt-go"
)

func main() {
    // 创建JWT头信息
    token := jwt.New(jwt.SigningMethodHS256)
    // 设置有效期
    token.Claims = jwt.MapClaims{
        "exp": time.Now().Add(time.Hour * 72).Unix(),
        "iat": time.Now().Unix(),
        "sub": "1234567890",
    }
    // 对生成的JWT令牌进行签名
    signedToken, err := token.SignedString([]byte("secret-key"))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(signedToken)
}
ログイン後にコピー

コードでは、 jwt.New() 関数を使用してJWT ヘッダー情報、有効期間と送信される情報 (この例では、sub という名前のフィールドが送信されます) を設定し、SignedString() 関数を使用して JWT トークンに署名します。

JWT の検証

Go 言語では、次のコードを使用して JWT の検証を実装できます。

package main

import (
    "fmt"
    "time"
    "github.com/dgrijalva/jwt-go"
)

func main() {
    // 待验证的JWT令牌
    tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTAzMDAzMTAsImlhdCI6MTYxMDgwNTExMCwic3ViIjoiMTIzNDU2Nzg5MCJ9.5AtrChvChVuWI3TkazGt1mDhbscT8-Qal5U6Qc4dqhc"
    // 解析JWT头信息
    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-key"), nil
    })
    if err != nil {
        fmt.Println(err)
        return
    }
    // 验证JWT有效期
    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
        expirationTime := time.Unix(int64(claims["exp"].(float64)), 0)
        if expirationTime.Before(time.Now()) {
            fmt.Println("JWT has expired")
        } else {
            fmt.Println("JWT is valid")
        }
    } else {
        fmt.Println("JWT is not valid")
    }
}
ログイン後にコピー

コードでは、 jwt.Parse() 関数を使用して、検証される JWT 次に、渡された署名キーを使用してトークンが検証されます。検証中は、最初に Claims() 関数を使用して JWT の有効時間を取得し、それを現在の時間と比較します。トークンの有効期限が切れている場合は、エラー メッセージが返されます。

概要

JWT は安全で簡単な認証方法として、Web 開発で広く使用されています。この記事では、Go 言語の jwt-go ライブラリを使用して、JWT 関数を迅速かつ簡単に実装する方法を紹介します。 JWTはユーザー認証だけでなく、データ送信やAPI認証などにも利用できます。実際のアプリケーションでは、JWT の有効期間と署名キーのセキュリティ保護に注意を払う必要があります。

以上がGo 言語の JWT を使用してシンプルで安全なユーザー認証を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート