Logto x Hasura: JWT を使用したアクセス制御
この包括的なガイドでは、Logto と Hasura の JWT モードアクセス制御の統合手順を説明し、データのセキュリティを強化します。
Hasura は、データにフィットした対応する GraphQL および REST API を迅速に提供できるツールです。データのセキュリティを考慮して、Hasura は各異なる API に対するアクセス制御を微調整する機能も提供します。
通常、Hasura のユーザーは他のアイデンティティ管理および認証サービスを利用しており、その中でも Logto が非常に人気です。
このブログ記事では、既に Hasura サービスを利用していることを前提とし、データのセキュリティを最大化するための Hasura と Logto の統合方法について紹介します。Logto アカウントを持っていない場合は、今すぐサインアップして使用を開始しましょう!
背景
Hasura は ロールベースのアクセス管理 を採用しており、一方 Logto は標準の ロールベースのアクセス制御 (RBAC) を使用しています。
Logto のモデルと RBAC に関するベストプラクティスでは、ユーザーに scope
を使用して最も細かい権限の粒度を提供することを推奨し、便宜的なバッチ操作を行うために role
を多数の scope
として使用し、最終的にリソースプロバイダ側で scope
をチェックして、ユーザーが特定の操作を実行できるかどうかを確認します。
Hasura では、role
が最も細かい権限の粒度に対応し、権限チェックは role
に対して行われます。そのため、Logto の設定中に、1 つの role
を正確に 1 つの scope
にマッピングすることを推奨します。このアプローチにより、Logto と Hasura の権限を結びつけ、混乱や誤使用を避けることができます。
Hasura では Webhooks または JWT を使用してアクセス制御を行うことができます。前回の記事では Webhooks の使用方法を紹介しましたが、次のセクションでは Hasura の JWT モードアクセス制御を利用する方法を説明します。
始めましょう
簡単な例を挙げてみましょう。既に Hasura に 2 つの API GET /user
と PATCH /user
があり、それぞれ user:reader
と user:maintainer
という 2 つのロールに対応しているとします。
1. Logto で Hasura API リソースを作成する
Logto で Hasura API リソースを作成します。
2. Logto で Hasura の設定に従ってロールを作成する
ステップ 1 で言及した Hasura API リソースに対して 2 つの scope
を作成する必要があります。それは read:user
と maintain:user
です。次に user:reader
(read:user
スコープを含む)と user:maintainer
(maintain:user
スコープを含む)という 2 つのロールを作成し、Hasura のロールと 1 対 1 で対応させます。このロールを Logto ユーザーに適宜割り当てます。
3. JWT モードを有効にするために Hasura の環境変数 HASURA_GRAPHQL_JWT_SECRET
を設定する
Hasura JWT 設定オプション を参照して、JWT を使用したアクセス制御を行えるようにするために、環境変数 HASURA_GRAPHQL_JWT_SECRET
を追加および設定する必要があります。
さまざまな設定オプションがありますが、ここでは最もシンプルなケースを紹介します。必要なのは jwk_url
のみです。この値は、Logto の OpenID 設定エンドポイント(https://your.logto.domain/oidc/.well-known/openid-configuration)から取得できます。
4. ユーザーアクセストークンに追加クレームをカスタマイズする
Logto のカスタム JWT 機能を使用して、JWT 形式のユーザーアクセストークンに追加クレームを追加するためのロジックをカスタマイズします。
getCustomJwtClaims
メソッドをカスタマイズして、その時点で認可されるユーザーに関連するデータを含む JWT にデータを追加します。これには、context
を介してアクセスできる role
も含まれます。
また、環境変数 USER_DEFAULT_ROLE_NAMES
を定義してハードコーディングを避けました。
5. Logto SDK を統合する
Logto と Hasura を設定した後、Logto SDK を使ってアプリと統合します。ここでは Next の例を使用して、ユーザーサインイン後に Logto が発行するユーザーアクセストークンをプレビューします。
まず、先に作成した user:reader
と user:maintainer
のロールをユーザーに割り当て、そのユーザーとしてログインします。
ユーザーアクセストークンを取得し、Hasura API にリクエストを送信します。
結論
この記事では、Hasura がサポートする JWT ベースのアクセス制御のもう一つの方法を紹介しました。Webhook とは異なります。
Hasura の Webhook と JWT のアクセス制御プロセスを比較すると、Webhook アプローチでは、Hasura の各リクエストごとに Logto へ Webhook を送信し、そのレスポンス待ちが発生しますが、JWT ベースのアプローチでは JWT が期限切れになるまで継続的に使用できます。
JWT のアプローチはネットワーク負荷を軽減し、Webhook によるネットワーク遅延を排除できます。一方で、Webhook アプローチはユーザー権限の変更をリアルタイムで同期できます。
これらの結論を踏まえ、実際のビジネスニーズに基づいて適切なアプローチを選択できます。