エンドポイントのプロテクションのためにさまざまな認証方式があります。Hasuraは認証をHasura外で行う必要があります。
色々な方式がありますが、いずれの方式もSession Variables(セッション変数)という変数(X-Hasura-Role)をHasuraに渡すことでユーザーの識別を実施します。
webhook認証
すでに古くから使っている認証用コードなどを持っている場合にそれを組み込まなきゃとなった場合はこちらを使います。
Hasura admin secretを使った認証
Hasuraでデフォルトで用意されているシークレットキーを使った方法です。こちらは無料でできるので楽です。
手順
- プロジェクト
- 設定
- Env Vars
- New Env Vars
- 「HASURA_GRAPHQL_ADMIN_SECRET」を選択して、Valueに任意のパスワードを入力して、Add。
- APIの画面の方に「x-hasura-admin-secret」というリクエストヘッダーが追加されています。
以降は、「x-hasura-admin-secret」というヘッダーをつけないとHasuraのエンドポイントにアクセスができなくなります。
JWT(JSON web token)認証
Hasuraのエンドポイントに対して適切なJWTトークンを付与してリクエストしないとHasuraがレスポンスを返さないようにする手法です。
一から実装する場合は基本こちらを使います。サードパーティ(例えば、Firebase、Auth0など)とかのJWTトークンを他に発行してくれるようなサービスを使っている場合はこちらを選びます。基本的に、ユーザーやパスワードの情報などはいくら暗号化したからといって自分のサーバーに持つことは設計的にアンチパターンと言われているので昨今の開発ではサードパーティの認証機構を使うのが主流になっています。
懸念点
本番環境とかではNext.jsはVercelにデプロイすることが多いのですが、その際にHasuraのエンドポイントに通そうとするとFirebaseのCloud functionsのcustomClaimsという機能が必要で、有料プランなどの契約が別途必要になってしまいます。
流れ
- クライアントが認証サーバー(Auth0、Firebase)にJWTトークンを受け取り、それを含めてHasuraに対してJWTを含めたリクエストを送信する。
- Hasuraはsercretを用いてユーザーから受け取ったJWTをパースします。パースするとアクセスコントール情報が記載があるJSONになります。(Hasuraの「HASURA_GRAPHQL_JWT_SECRET」で設定した内容と、ユーザーから受け取ったJWTの内容が合致しているかチェックして一致していない場合はエラーになります。)
- JWT内のclaimに記述された「X-Hasura-Allowed-Role」の中からユーザーに割り当てるロールを選択して、Authenticationを実施します。
JWTトークンの作成
HasuraのJWT configにアクセスします。
https://hasura.io/jwt-config/
Select Provider
firebaseを選択します。Auth0を使っている場合はAuth0も選択できます。
Enter Firebase Project ID
firebaseで作成したプロジェクトIDを入力します。
GENERATE CONFIG
JWTトークンを生成できます。
Hasura側の設定
Env.varsで「HASURA_GRAPHQL_JWT_SECRET」を選択して、先ほど生成したJWTトークンを貼り付けます。
Firebaseとの連携
以下は参考までにFirebaseと連携する場合の流れです。
この記事へのコメントはありません。