aws appsync

2023-03-11 08:25
2023-03-11 08:25

AWS AppSync に関する情報を集約するページ

認証と認可

AWS AppSync の認証と認可に関する情報をまとめていく

see also: Authorization and Authentication

2022/05 現在、以下の 5 つの認証方式を選択できる

  • API_KEY
  • AWS_LAMBDA
  • AWS_IAM
  • OPENID_CONNECT
  • AMAZON_COGNITO_USER_POOLS

それぞれの認証モードについて

API_KEY 認証

  • 開発時もしくは公開して問題ない API にのみ用いることが推奨されている
  • 最大 365 日までの有効期限を持つ API キーを発行し、API リクエスト時に x-api-key ヘッダーに合致する API キーが含まれているか確認することにより認証を行う仕組み

AWS_LAMBDA 認証

  • Lambda 関数を利用して独自の認証ロジックを実装できる仕組み
  • API に対してひとつの Lambda 関数のみ指定可能
  • Authorization トークンは 2048 文字、Lambda がリゾルバに返却できるデータは 5MB が上限となる
  • API ID と Authorization トークンをもとに Lambda 関数の実行結果はデフォルトで 300 秒キャッシュされるが、Lambda 関数が返却する ttlOverride の値でキャッシュ時間を上書きできる

AWS_IAM 認証

  • SigV4 署名を用いて GraphQL API へのアクセスを制御できる仕組み
  • 認証情報のエンティティが該当の GraphQL API に対して AppSync:GraphQL アクションの実行権限を持っているか確認することにより認証を行う仕組み
  • 対象リソースは API 単位やスキーマ単位にて指定可能

OPENID_CONNECT 認証

  • OpenID Connect(OIDC) トークンを用いて GraphQL API へのアクセスを制御できる仕組み
  • 単に Issuer URL を設定すれば利用できる

AMAZON_COGNITO_USER_POOLS 認証

  • Cognito User Pool の OIDC トークンを用いて GraphQL API へのアクセスを制御できる仕組み
  • 本認証モードでは JWT トークンに含まれる認証ユーザー所属する Cognito User Pool のグループに応じて細かなアクセス制御が可能であり、この際の認証戦略として deny-or-grant と grant-or-deny のどちらかを選択可能
  • 下記のようにスキーマに対して @aws_auth ディレクティブを付与することによりユーザーの属するグループに応じた認証制御が実現できる仕組み
type Query {
  posts: [Post!]! @aws_auth(cognito_groups: ["Bloggers", "Readers"])
}

type Mutation {
  addPost(id: ID!, title: String!): Post!
    @aws_auth(cognito_groups: ["Bloggers"])
}

複数の認証モードを利用する

追加の認証モード指定にあたる制約

デフォルトの認証モードとして API_KEY, AWS_LAMBDA, AWS_IAM を指定している場合、追加の認証モードとして同じものを追加できない

その一方でデフォルトの認証モードとして OPENID_CONNECT, AMAZON_COGNITO_USER_POOLS を指定している場合、他の OpenID Connect Provider や Cognito User Pool を追加の認証モードとして指定できる

追加の認証モードとディレクティブ

ひとつまたは複数の認証モードが利用できるが、複数の認証モードを指定した場合、スキーマにデフォルトでない認証モードでのアクセスを許可するディレクティブを追記する必要がある

  • @aws_api_key - To specify the field is API_KEY authorized.
  • @aws_iam - To specify that the field is AWS_IAM authorized.
  • @aws_oidc - To specify that the field is OPENID_CONNECT authorized.
  • @aws_cognito_user_pools - To specify that the field is AMAZON_COGNITO_USER_POOLS authorized.
  • @aws_lambda - To specify that the field is AWS_LAMBDA authorized.

Q&A

認証モードを追加したがデフォルトの認証モードでのアクセスしかできない

スキーマに追加した認証モードでのアクセスを許可するディレクティブが存在しているか確認する: 下記ドキュメント記載のとおり、スキーマに特にディレクティブを指定していない場合、デフォルトの認証モードでしかアクセスできない

When you add additional authorization modes, you can directly configure the authorization setting at the AWS AppSync GraphQL API level (that is, the authenticationType field that you can directly configure on the GraphqlApi object) and it acts as the default on the schema. This means that any type that doesn’t have a specific directive has to pass the API level authorization setting. Using Additional Authorization Modes

(IAM 認証の場合) 利用している認証情報が該当の GraphQL API をコールする権限をもっているか確認する: 利用している認証情報が該当の GraphQL API に対して AppSync:GraphQL アクションの実行権限を持たない場合、当然リクエストは拒否される

Copyright © 53ningen.com