ホームページ >バックエンド開発 >Golang >Go を使用して基本的な API 認証と認可を実装する

Go を使用して基本的な API 認証と認可を実装する

王林
王林オリジナル
2023-06-17 19:51:052364ブラウズ

Web アプリケーションの継続的な開発では、アプリケーションが徐々に大きくなるにつれて、ランダム アクセスを防ぐために API インターフェイスを保護する必要があるため、API の認証および認可メカニズムがますます重要になります。この記事では、Go を使用して基本的な API 認証と認可を実装する方法を紹介します。

まず、認証と認可の基本概念を理解しましょう。

認証: 認証は、ユーザーが要求した ID が正当なものであるかどうかを検証するために使用される ID 検証メカニズムです。 Web アプリケーションでは、ユーザー名とパスワード、または JWT などのトークンを使用して認証を行うことができます。

承認: 承認は、ユーザーが要求されたリソースにアクセスする権利を持っているかどうかを判断するために使用される権限検証メカニズムです。 Web アプリケーションでは、ロールベースのアクセス制御またはアクセス トークンを通じて承認を実行できます。

Go での基本的な API 認証と認可の実装は、次の手順に分けることができます。

ステップ 1: Gin フレームワークをインストールして構成する

Gin フレームワークを使用する前に、最初にインストールする必要があります。次のコマンドを使用してインストールできます:

go get -u github.com/gin-gonic/gin

インストールが完了したら、次のコードを使用して Jin フレームワークを初期化できます:

import "github.com/gin-gonic/gin"

router := gin.Default()

ステップ 2: ルーティングの追加

追加を開始する前に ルーティングの前に、ユーザーが正当であるかどうかを検証するミドルウェア関数を定義する必要があります。ミドルウェア関数は受信リクエスト ヘッダーをチェックし、ステータス コードとエラー メッセージをハンドラーに返します。

func AuthMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        // 验证用户是否合法
        if userValid {
            c.Set("user", "valid")
            c.Next()
        } else {
            c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
        }
    }
}

ルーティング機能にミドルウェア機能を追加して、認証されたユーザーのみが必要なリソースにアクセスできるようにすることができます。

router.GET("/secured", AuthMiddleware(), func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{"message": "You are authorized to access this resource"})
})

上記のコードでは、GET リクエストは /secured エンドポイントにルーティングされますが、認証されたユーザーのみが正常にアクセスできます。

ステップ 3: JWT 認証の実装

これで、ルートを追加し、ミドルウェアを使用して、ユーザーがルートにアクセスするために認証されていることを確認しました。次に、JWT を使用してユーザーを認証する方法を見ていきます。

JWT は、クライアントとサーバー間で情報を安全に転送する方法を提供する JSON ベースの Web トークンです。 JWT は通常、ヘッダー、ペイロード、署名の 3 つの部分で構成されます。ヘッダーにはトークン タイプと署名アルゴリズムが含まれ、ペイロードにはトークン データが含まれ、署名はトークンの整合性を検証するために使用されます。

次のコードを使用して、Go で JWT 認証を実装できます:

import (
    "time"

    "github.com/dgrijalva/jwt-go"
)

func CreateToken() (string, error) {
    token := jwt.New(jwt.SigningMethodHS256)
    claims := token.Claims.(jwt.MapClaims)
    claims["user"] = "john@example.com"
    claims["exp"] = time.Now().Add(time.Hour * 24).Unix()

    tokenString, err := token.SignedString([]byte("secret"))
    if err != nil {
        return "", err
    }

    return tokenString, nil
}

上記のコードでは、最初に JWT トークンを作成し、次にユーザーの要求と有効期限を追加します。最後に、トークンが署名され、結果が返されます。

ステップ 4: ロールベースの承認を実装する

最後のステップでは、ロールベースの承認を使用してリソースへのユーザー アクセスを制御する方法を学習します。

ロールベースのアクセス制御では、ユーザーは 1 つ以上のロールに割り当てられ、各ロールには一連の権限が付与されます。リソースにアクセスするとき、認可センターは、ユーザーがそのロールに基づいてどのリソースにアクセスできるかを決定します。

次のコードを使用して、単純なロールベースの承認を実装できます:

func AuthzMiddleware(roles ...string) gin.HandlerFunc {
    return func(c *gin.Context) {
        userRole := "admin" // 从数据库或其他地方获取用户角色

        for _, role := range roles {
            if role == userRole {
                c.Next()
                return
            }
        }

        c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "Forbidden"})
    }
}

上記のコードでは、ロール リストをパラメーターとして受け入れる AuthzMiddleware ミドルウェア関数を定義します。ユーザーロールが含まれているかどうかを確認してください。ユーザーが必要なロールを持っている場合は、ミドルウェアを渡して次のハンドラーに進みます。そうでない場合は、Forbidden ステータス コードを返します。

最後に、AuthzMiddleware 関数をルートに追加して、特定のロールを持つユーザーのみが必要なリソースにアクセスできるようにすることができます。

router.GET("/admin", AuthMiddleware(), AuthzMiddleware("admin"), func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{"message": "You are authorized to access this resource"})
})

上記は、Go を使用して基本的な API 認証と認可を実装するための基本的な手順です。これらの基本的な実装はアプリケーションの基礎として機能し、必要に応じてさらにカスタマイズおよび拡張できます。

以上がGo を使用して基本的な API 認証と認可を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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