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

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

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

Darcy Ye
Darcy Ye
Developer

ユーザー認証に何週間も費やすのはもうやめましょう
Logto でより速く安全なアプリをリリース。数分で認証を統合し、コア製品に集中できます。
始めましょう
Product screenshot

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 アプローチはユーザー権限の変更をリアルタイムで同期できます。

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