• hasura
  • restful api
  • graphql
  • logto
  • custom jwt
  • アクセス制御
  • 認可

Logto x Hasura: JWT を使用したアクセス制御

この包括的なガイドでは、Logto と Hasura の JWT モードアクセス制御の統合手順を説明し、データのセキュリティを強化します。

Darcy Ye
Darcy Ye
Developer

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 /userPATCH /user があり、それぞれ user:readeruser:maintainer という 2 つのロールに対応しているとします。

1. Logto で Hasura API リソースを作成する

Logto で Hasura API リソースを作成します。

Hasura API

2. Logto で Hasura の設定に従ってロールを作成する

ステップ 1 で言及した Hasura API リソースに対して 2 つの scope を作成する必要があります。それは read:usermaintain:user です。次に user:readerread:user スコープを含む)と user:maintainermaintain:user スコープを含む)という 2 つのロールを作成し、Hasura のロールと 1 対 1 で対応させます。このロールを Logto ユーザーに適宜割り当てます。

Hasura API with scopes

User reader role

User maintainer role

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)から取得できます。

Hasura JWT config

4. ユーザーアクセストークンに追加クレームをカスタマイズする

Logto のカスタム JWT 機能を使用して、JWT 形式のユーザーアクセストークンに追加クレームを追加するためのロジックをカスタマイズします。

User access token script

getCustomJwtClaims メソッドをカスタマイズして、その時点で認可されるユーザーに関連するデータを含む JWT にデータを追加します。これには、context を介してアクセスできる role も含まれます。

また、環境変数 USER_DEFAULT_ROLE_NAMES を定義してハードコーディングを避けました。

5. Logto SDK を統合する

Logto と Hasura を設定した後、Logto SDK を使ってアプリと統合します。ここでは Next の例を使用して、ユーザーサインイン後に Logto が発行するユーザーアクセストークンをプレビューします。

User with roles

まず、先に作成した user:readeruser:maintainer のロールをユーザーに割り当て、そのユーザーとしてログインします。

ユーザーアクセストークンを取得し、Hasura API にリクエストを送信します。

結論

この記事では、Hasura がサポートする JWT ベースのアクセス制御のもう一つの方法を紹介しました。Webhook とは異なります。

Hasura の WebhookJWT のアクセス制御プロセスを比較すると、Webhook アプローチでは、Hasura の各リクエストごとに Logto へ Webhook を送信し、そのレスポンス待ちが発生しますが、JWT ベースのアプローチでは JWT が期限切れになるまで継続的に使用できます。

JWT のアプローチはネットワーク負荷を軽減し、Webhook によるネットワーク遅延を排除できます。一方で、Webhook アプローチはユーザー権限の変更をリアルタイムで同期できます。

これらの結論を踏まえ、実際のビジネスニーズに基づいて適切なアプローチを選択できます。