nomolog

プロダクトマネジメント、技術、ビジネス、ときどきライフハック

February 20, 2021

AmplifyのGraphQL directive @authについて調べた


調べました。公式ドキュメント読んだ理解をまとめときます 🙆‍♂️

これはなに?(@auth)

GraphQLのスキーマに付与すると、対象リソースに認証・認可機能を付与することができるディレクティブ。

Owner authorization

# The simplest case
type Post @model @auth(rules: [{ allow: owner }]) {
  id: ID!
  title: String!
}

# The long form way
type Post
  @model
  @auth(
    rules: [
      { allow: owner, ownerField: "owner", operations: [create, update, delete, read] },
    ])
{
  id: ID!
  title: String!
  owner: String
}
  • Owner authorizationによって、ユーザがリソースに対してCRUDできるかを制御できる。
  • Amazon Cognito User Poolsを利用する必要がある
  • ownerFieldに指定したフィールドへ認証・認可に利用する情報が保存される
    • Cognitoで試したところ、ユーザIDが入る模様
  • operations に指定した操作は、リソースのオーナーのみ可能

Multiple authorization rules

type Draft @model
  @auth(rules: [
    # Defaults to use the "owner" field.
    { allow: owner },

    # Authorize the update mutation and both queries.
    { allow: owner, ownerField: "editors", operations: [update, read] }
  ]) {
  id: ID!
  title: String!
  content: String
  owner: String
  editors: [String]
}
  • 複数のルールを適用可能
  • ブログのドラフトを作っていて、他の人にも閲覧と編集をさせたいような場合
    • editorsに入っている人たちは閲覧と編集可能

Ownership with create mutations

mutation CreateDraft {
  createDraft(input: { title: "A new draft" }) {
    id
    title
    owner
    editors
  }
}
  • create mutationにおいては、ownerに指定したフィールドにデフォルトで適切な値が挿入される
  • 防ぎたければ、ownerフィールドに入る値を明示する

Static group authorization

type Salary @model @auth(rules: [{ allow: groups, groups: ["Admin"] }]) {
  id: ID!
  wage: Int
  currency: String
}
  • 認証認可を特定のグループに所属する人たちに対してかけることができる
    • 例:Adminグループに属するユーザにのみ、サラリーへのCRUDを認める
  • ownerにCRUD, editorsにUpdate, Adminに所属するユーザにCRUDを許可する例↓
type Draft @model
  @auth(rules: [
    # Defaults to use the "owner" field.
    { allow: owner },

    # Authorize the update mutation and both queries.
    { allow: owner, ownerField: "editors", operations: [update] },

    # Admin users can access any operation.
    { allow: groups, groups: ["Admin"] }
  ]) {
  id: ID!
  title: String!
  content: String
  owner: String
  editors: [String]!
}

Dynamic group authorization

# Dynamic group authorization with multiple groups
type Post @model @auth(rules: [{ allow: groups, groupsField: "groups" }]) {
  id: ID!
  title: String
  groups: [String]
}

# Dynamic group authorization with a single group
type Post @model @auth(rules: [{ allow: groups, groupsField: "group" }]) {
  id: ID!
  title: String
  group: String
}
  • リソースに対しgroups(またはgroup)フィールドを設けてそこにアクセス可能なgroupsを動的に指定できる
  • 指定したグループならばドラフトを閲覧できるするようにする例↓
type Draft @model
  @auth(rules: [
    # Defaults to use the "owner" field.
    { allow: owner },

    # Authorize the update mutation and both queries.
    { allow: owner, ownerField: "editors", operations: [update] },

    # Admin users can access any operation.
    { allow: groups, groups: ["Admin"] }

    # Each record may specify which groups may read them.
    { allow: groups, groupsField: "groupsCanAccess", operations: [read] }
  ]) {
  id: ID!
  title: String!
  content: String
  owner: String
  editors: [String]!
  groupsCanAccess: [String]!
}

Public Authorization

# The simplest case
type Post @model @auth(rules: [{ allow: public }]) {
  id: ID!
  title: String!
}
  • だれでもアクセスできる
  • これをやる場合はAPI keyによる認証を必ずかけること

Private Authorization

# The simplest case
type Post @model @auth(rules: [{ allow: private }]) {
  id: ID!
  title: String!
}
  • Cognito User Poolsで設定されたJWTトークンを持っていれば誰でもアクセスできる
  • これをやる場合は必ずCognito User Pools

飽きたのでここまで 💁‍♂️

残りは気が向いたらまとめます 🙋‍♂️


気に入ったら、以下からシェアやフォローいただけると嬉しいです!