インターネット アプリケーションの継続的な開発に伴い、ユーザーの認証と認可がますます重要になってきています。認証はユーザーがシステムにアクセスする権限を持っているかどうかを確認するプロセスであり、認可はユーザーが実行できるアクションを決定するプロセスです。この記事では、Golang を使用して認証と認可を実装する方法について説明します。
JWT (JSON Web トークン) は、ユーザーの ID を表現するためのコンパクトで自己完結型の方法です。これには、検証およびデコードできるメタデータとクレームが含まれています。一般に、JWT にはヘッダー、ペイロード、署名の 3 つの部分が含まれています。
Golang は、jwt-go など、JWT の実装に役立つ多くの便利なライブラリを提供します。 jwt-go ライブラリを使用して、JWT を簡単に生成、デコード、検証します。 jwt-go ライブラリを使用して JWT を生成するサンプル コードを次に示します。
import ( "time" "github.com/dgrijalva/jwt-go" ) func CreateToken(userId string) (string, error) { token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ "user_id": userId, "exp": time.Now().Add(time.Hour * 24).Unix(), }) return token.SignedString([]byte("your-secret")) }
上記のコードでは、現在のユーザーの ID と有効期限を含む JWT を作成します。次に、 jwt.SigningMethodHS256 メソッドと「your-secret」キーを使用して JWT に署名します。最後に、JWT 文字列が呼び出し元に返されます。
HTTP リクエストごとに、認証に JWT を使用できます。ユーザーが正常にログインすると、生成された JWT をクライアントに返すことができます。クライアントは、後続のすべてのリクエストの「Authorization」ヘッダーの一部として JWT をサーバーに送信できます。サーバーは JWT をデコードし、署名を検証して正当なものであることを確認します。以下は、jwt-go ライブラリを使用して JWT を検証するサンプル コードです。
import ( "net/http" "github.com/dgrijalva/jwt-go" ) func ValidateTokenMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { tokenHeader := r.Header.Get("Authorization") if tokenHeader == "" { w.WriteHeader(http.StatusUnauthorized) return } token, err := jwt.Parse(tokenHeader, func(token *jwt.Token) (interface{}, error) { return []byte("your-secret"), nil }) if err != nil || !token.Valid { w.WriteHeader(http.StatusUnauthorized) return } next.ServeHTTP(w, r) }) }
上記のコードでは、JWT の検証を担当する ValidateTokenMiddleware というミドルウェアを定義します。 ValidateTokenMiddleware は、HTTP ヘッダーに認可トークンが含まれているかどうかを確認し、検証します。 JWT が無効な場合は、HTTP 401 Unauthorized 応答が返されます。それ以外の場合は、リクエストの処理を続行します。
認証に JWT を使用すると、リクエストが正当なユーザーからのものであることが保証され、より高いセキュリティが提供されます。
最新の Web アプリケーションでは、多くの場合、ユーザーは異なるロールと権限を持っている必要があります。たとえば、管理者は、通常のユーザーが持たない高度な操作を実行する権限を持っている場合があります。したがって、異なるユーザーの役割を個別に認可する必要があります。
Golang では、ロールベースのアクセス制御 (RBAC) モデルを使用するのが一般的なアプローチです。 RBAC モデルでは、各ロールに異なるアクセス許可が与えられ、ユーザーは 1 つ以上のロールに割り当てられます。次に、特定のアクションを実行する前に、システムはユーザーがそのアクションを実行する権限を持っているかどうかを確認します。
以下は、ロールベースのアクセス制御モデルを使用したサンプル コードです:
type Role string const ( AdminRole Role = "admin" UserRole Role = "user" ) type User struct { ID string `json:"id"` Name string `json:"name"` Email string `json:"email"` Role Role `json:"role"` } // Check if the user has permission to access the resource based on the specified role. func HasPermission(user *User, requiredRole Role) bool { return user.Role == requiredRole || user.Role == AdminRole }
上記のコードでは、Role という名前の列挙型を定義します。これには、ロールベースのアクセス制御モデルで使用されるロールのリストが含まれています。応用。 User 構造では、各ユーザーを 1 つ以上のロールに割り当て、HasPermission 関数を使用して、ユーザーが特定の操作を実行する権限を持っているかどうかを確認します。この例では、HasPermission 関数は、ユーザーのロールが AdminRole または requiredRole の場合にのみ true を返します。
ミドルウェアを使用してユーザーの役割と権限を確認するなど、他の方法を使用することもできます。以下は、ミドルウェアに基づくサンプル コードです。
func AdminOnlyMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { user, ok := r.Context().Value("user").(*User) if !ok || !HasPermission(user, AdminRole) { w.WriteHeader(http.StatusForbidden) return } next.ServeHTTP(w, r) }) }
上記のコードでは、AdminOnlyMiddleware という名前のミドルウェアを定義します。このミドルウェアは、HTTP リクエストのコンテキストからユーザー ロールを取得し、ユーザーがアクションを実行するために必要な権限を持っているかどうかを確認します。ユーザーに権限がない場合は、HTTP 403 Forbidden 応答が返されます。
Web フレームワークに基づくアプリケーションを使用している場合は、ミドルウェアをルート上に直接登録できます。たとえば、管理者権限を必要とする API エンドポイントに AdminOnlyMiddleware を登録できます。
router.Handle("/api/dashboard", AdminOnlyMiddleware(http.HandlerFunc(handler)))
上記のコードでは、管理者権限を持つユーザーのみが「/api/dashboard」エンドポイントにアクセスできます。
概要
この記事では、Golang を使用して認証と認可を実装する方法を紹介しました。 JWT を使用してユーザーがシステムにアクセスする権限を持っているかどうかを確認し、ロールベースのアクセス制御モデルを使用してユーザーが特定のアクションを実行する権限を持っているかどうかを確認します。これらのテクノロジーは、安全でスケーラブルで保守が容易な Web アプリケーションを作成するのに役立ちます。
以上がGolangを使用して認証と認可を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。