AWS AppSyncで複数の認証モードがサポートされました!

GraphQLのマネージドサービスである「AWS AppSync」で複数の認証モードがサポートされました!お試しとして、Cognito User PoolとAPI Keyの両方からリクエストできるようにしてみました。
2019.05.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS AppSyncに熱いアップデート

マネージドGraphQLサービスであるAWS AppSyncで 複数の認証モード がサポートされました!

これまではAPIに対して1つの認証モードのみが設定可能でしたが、今回のアップデートにより複数の認証モードを設定できるようになりました。

メリット

認証モードが1つしか設定できない場合、個人的には主に開発時やデバッグ時に不便な時がありました。例えば以下のようなケースです。

  • APIは一般ユーザーにはCognito User Poolで認証させたいが、開発時はAPI Keyで利用できるようにしたい
  • Cognito User Poolの他にOpenID Connect Providerのユーザーからも利用できるようにしたい

かなり柔軟に対応できるようになりました!

複数の認証モードを使ってみた

認証モードの設定

今回は例として以下のサンプルを用いました。

AppSync APIの設定画面がアップデートされ、以下のように認証モードの追加が行えるようになっています。

サポートされている認証モードは従来通りです。

  • API Key
  • IAM
  • Cognito User Pool
  • OpenID Connect

従来の単一の認証モードを プライマリの認証モード として扱い、複数の認証モードを増やしたい場合は 認証モードを増やす 形を取ります。

今回はCognito User Poolをプライマリの認証モードとし、API Keyによる認証モードを追加します。

API Keyの場合、認証モードを足して一度保存したあとにAPI Keyの管理UI(API Keyの追加や削除)が表示される点に注意してください。

Schemaの修正

複数の認証モードについて、Query、Mutation、Typeごとにどの認証モードで使えるようにするか指定することができます。Schemaに以下のようなディレクティブを追加します。

  • @aws_api_key : API Keyによる認証でのアクセスを許可する
  • @aws_iam : AWS IAMによる認証でのアクセスを許可する
  • @aws_oidc : OpenID Connectによる認証でのアクセスを許可する
  • @aws_cognito_user_pools : Amazon Cognito User Poolsによる認証でのアクセスを許可する

例えば以下のようなSchemaを例とします。

type Query {
  getPicture(id: ID!): Picture
  listPictures(filter: ModelPictureFilterInput, limit: Int, nextToken: String): ModelPictureConnection
}
type ModelPictureConnection {
  items: [Picture]
  nextToken: String
}
type Picture {
  id: ID!
  name: String
  owner: String
  visibility: Visibility
  file: S3Object
  createdAt: String
}

プライマリの認証方法はCognito User Poolで行うこととし listPictures のみをAPI Keyを使ったアクセスを許可したい場合は次のように書きます。

type Query {
  getPicture(id: ID!): Picture
  listPictures(filter: ModelPictureFilterInput, limit: Int, nextToken: String): ModelPictureConnection
  @aws_api_key @aws_cognito_user_pools
}
type ModelPictureConnection @aws_api_key @aws_cognito_user_pools {
  items: [Picture]
  nextToken: String
}
type Picture @aws_api_key @aws_cognito_user_pools {
  id: ID!
  name: String
  owner: String
  visibility: Visibility
  file: S3Object
  createdAt: String
}

詳しくは以下のドキュメントも参考にしてください。

試してみる

今回はサンプルとして aws-samples/aws-amplify-graphql を使っています。こちらはプライベート画像を管理するWebアプリケーションです。

Webアプリケーションからは普通にプライマリの認証モードであるCognito User Poolを使ってログインしたあと、APIリクエストが行えます。

次にサンプルアプリとは別に、GraphQLクライアントを用意します。今回はMacアプリの GraphiQL を使いました。

API Keyの場合はHTTP Headerに x-api-key を設定することで認証ができます。

@aws_api_key ディレクティブを追加しない場合はもちろん弾かれます。

@aws_api_key ディレクティブを追加すると、正常にレスポンスが返ってきました。

AppSyncがより使いやすくなるアップデートです!

開発の効率化や複数の認証プロバイダをサポートしたい場合など、様々なケースで活用できる素晴らしいアップデートでした。

ぜひぜひ使っていきましょう!