Closed4

Hasura認証周り学習メモ

okunokentarookunokentaro

Authentication & Authorization

https://hasura.io/docs/latest/graphql/core/auth/index.html

  • GraphQL query + req headersがHasuraに投げられる
  • Hasuraが受け取る
  • Authenticationフローにreq headersが投げられる
  • session variablesがHasuraに返却される
  • Roleに基づいてPostgres(例えばHeroku)にクエリが投げられる

外部で認証

  • 認証はHasuraの外で処理される
  • X-Hasura-Roleなどのセッション変数の形で、ユーザーの認可情報を渡す
  • X-Hasura-User-Idのようなユーザー情報を渡して、パーミッションのルールを構築する
  • HasuraはGraphQLスキーマのすべてのフィールドに対して、きめ細かいロールベースのアクセスコントロールルールを定義することができる
  • Hasuraは、セッション変数のロール/ユーザー情報と実際のリクエスト自体を使用して、定義されたルールに照らしてリクエストを検証する
  • すべての未認証リクエストに設定される特定のロールを設定することにより、未認証ユーザーにアクセスを許可するようにHasuraを設定することもできる
okunokentarookunokentaro

https://hasura.io/docs/latest/graphql/core/auth/authentication/index.html

https://hasura.io/docs/latest/graphql/core/auth/authentication/jwt.html

2つのモード

  • Hasuraは、2つのモードの認証設定をサポートしている
    • Webhook
    • JWT

JWTモード

  • Auth0(自分の場合の例)がJWTを発行する
  • JWTはリクエストに含められる
  • GraphQLエンジンによって検証・復号される
    • GraphQLエンジンはアクセス制御ルールを評価するために必要なメタデータを取得する
  • JWT modeにする必要がある
    • x-hasura-* headersを見るようになる
      • JWTがデコードされ、署名が検証される
      • ユーザーの要求したロール(リクエストで指定されている場合)が、許可されたロールのリストに含まれているかどうかがアサートされる
      • 希望するロールがリクエストで指定されていない場合は、デフォルトのロールが適用される
      • 認可がパスした場合、クレーム内のすべてのx-hasura-*値がパーミッション・システムに使用される
  • 前提条件としてJWT modeを有効にするには、まずGraphQLエンドポイントをセキュアにする必要がある
  • JWT 認証は
    • X-Hasura-Admin-Secret ヘッダーがリクエストに見つからない場合に実施される
    • リクエストにX-Hasura-Admin-Secretヘッダーがあり、管理者アクセスが許可されている場合はスキップされる
okunokentarookunokentaro

https://hasura.io/docs/latest/graphql/core/auth/authentication/jwt.html#tl-dr

JWT認証

TL;DR

TL;DR

  • JWTには、claimのカスタムnamespaceにx-hasura-default-role, x-hasura-allowed-rolesが含まれている必要がある
  • その他のx-hasura-*フィールドは任意であり、定義されたパーミッションに応じて必要となる
  • ユーザーのロールを示すために、リクエストのヘッダとしてx-hasura-roleを送ることができる
  • JWTをAuthorization headerにAuthorization: Bearer <JWT>として送信

JWT modeを有効にするには、--jwt-secretフラグまたはHASURA_GRAPHQL_JWT_SECRET環境変数(JSONオブジェクトの値)を使用する

このスクラップは2021/10/04にクローズされました