Closed4
Hasura認証周り学習メモ
Auth Headerの扱いを雰囲気でやらずに、ちゃんと学ばないといけなそう。
Authentication & Authorization
- 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を設定することもできる
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
ヘッダーがあり、管理者アクセスが許可されている場合はスキップされる
-
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にクローズされました