Ryusuke Nomoto

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

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

 

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が入る模様
    • デフォルト値は owner
  • 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を使うこと
    •  

      飽きたのでここまで 💁‍♂️
      残りは気が向いたらまとめます 🙋‍♂️
badge