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 アプローチはユーザー権限の変更をリアルタイムで同期できます。
これらの結論を踏まえ、実際のビジネスニーズに基づいて適切なアプローチを選択できます。

