Golang 学習 Web サーバーの認証と認可

PHPz
リリース: 2023-06-24 09:04:05
オリジナル
1180 人が閲覧しました

Golang は新興言語であり、特に Web サービスの実装に適しています。 Web サービスでは、認証と認可は非常に重要なセキュリティ メカニズムです。この記事では、Golang で Web サーバーの認証と認可を実装する方法を紹介します。

認証 (認証) は、ユーザーの身元を確認し、リソースにアクセスする権利があるかどうかを判断することを指します。一般的な認証方法には、ユーザー名とパスワード、トークンなどが含まれます。承認とは、ユーザーがリソースにアクセスする権限を持っているかどうかを判断することを指します。通常、ロールベースのアクセス制御とリソースベースのアクセス制御承認メソッドが含まれます。

Golang では、さまざまなフレームワークとライブラリを使用して、Web サービスの認証と認可を実装できます。この記事では、Gin フレームワークを例として、トークンベースの認証とロールベースの認可を実装する方法を紹介します。

1. トークンベースの認証

Gin フレームワークでは、JWT (Json Web Token) を使用してトークンベースの認証を実装できます。 JWT は、Web 上で情報を安全に送信するための簡潔で自己完結型の方法を定義するオープン スタンダードです。 JWT は、ヘッダー、ペイロード、署名の 3 つの部分で構成されます。

ヘッダーは、トークンのタイプと署名アルゴリズムを記述するために使用されます。例:

{"alg": "HS256", "typ": "JWT"}

ペイロードは、ユーザー名、ロールなど、送信する必要がある情報を保存するために使用されます。例:

{"sub": "123456789", "name": "John Doe", "iat": 1516239022}

署名は情報の改ざんを防ぐために使用され、署名には秘密キーの使用が必要です。例:

HMACSHA256(
base64UrlEncode(header) "."
base64UrlEncode(payload),
secret)

Golang では、github.com/dgrijalva/jwt-go ライブラリを使用して JWT の生成と検証を実現できます。例:

// 署名方法とそれに含めるクレームを指定して、新しいトークン オブジェクトを作成します。
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{

"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
ログイン後にコピー

})

// Secret
tokenString を使用して署名し、完全にエンコードされたトークンを文字列として取得します。err := token.SignedString([]byte("secret"))

// トークンを解析して有効性を確認し、クレーム
トークンを抽出します。err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) ) {

return []byte("secret"), nil
ログイン後にコピー

})

Gin フレームワークでは、gin-jwt ライブラリを使用して、JWT ベースの認証メカニズムを迅速に構築できます。例:

// 指定された署名キーを使用して新しい JWT ミドルウェアを作成します
middleware := jwtmiddleware.New(jwtmiddleware.Options{

SigningMethod:   jwt.SigningMethodHS256,
Claims:          &CustomClaims{},
KeyFunc: func(token *jwt.Token) (interface{}, error) {
    // Check the signing method and return the key for verifying the signature
    if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
        return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
    }
    return []byte("secret"), nil
},
ログイン後にコピー

})

// リソースを保護するために、Gin ルートでミドルウェアを使用します
router.GET("/protected", middleware.MiddlewareFunc(), func(c *gin.Context) {

claims := jwtmiddleware.ExtractClaims(c)
user := claims["user"].(string)
c.JSON(200, gin.H{
    "user": user,
    "message": "Hello, World!",
})
ログイン後にコピー

})

2. ロールベースの承認

Gin フレームワークでは、ロールベースの承認を使用してリソースへのユーザー アクセスを制限できます。たとえば、ブログ アプリケーションでは、一般ユーザーと管理者を区別するためにロールが使用されます。管理者はすべてのブログ リソースにアクセスできますが、一般ユーザーは自分が公開したブログ リソースにのみアクセスできます。

gin-authz ライブラリを使用して、ロールベースの承認を実装できます。例:

// ロールベースのアクセスを強制する認可ミドルウェアを定義します。
authMiddleware := authz.NewAuthorizer(authz.BuiltinRolebased())

// ロールを定義します。すべてのリソースへの「管理者」ロールのアクセスを許可するベースのポリシー
adminRole := authz.NewRole("admin", []string{"*"})
policy := authz.NewPolicy()
policy .AddRole(adminRole)

//gin ルートでポリシー ミドルウェアを使用して、ロールベースのアクセス制御を強制します
router.GET("/blogs", authMiddleware.CheckPermission(policy, "admin " ), func(c *gin.Context) {

// Return the list of all blogs
ログイン後にコピー

})

router.GET("/blog/:id", authMiddleware.CheckPermission(policy, "read"), func (c *gin.Context) {

// Return the specified blog
ログイン後にコピー

})

router.POST("/blog", authMiddleware.CheckPermission(policy, "write"), func(c *gin. Context ) {

// Create a new blog
ログイン後にコピー

})

上記のコードでは、すべてのリソース (「*」) にアクセスできる「admin」という名前のロールが定義されています。次に、各ルートで、authMiddleware.CheckPermission 関数を使用して、ユーザーのロールがリソースにアクセスできるかどうかを確認します。

概要

この記事では、Golang で Web サーバーの認証と認可を実装する方法を紹介します。 Gin フレームワークと関連ライブラリを使用することで、安全で信頼性の高い Web サービスを迅速に構築できます。

以上がGolang 学習 Web サーバーの認証と認可の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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