以下の手順でユーザーの新規登録時に情報をDynamoDBに書き込む際の最適解についておたずねしたく思います。
- クライアントサイドから
Amplify.Auth.signUp()
でサインアップを実行する PostConfirmation Lambda Trigger
によってmutation createUser
を行う関数が実行される
作成されたユーザーは以下の情報を持ちます。
フィールド名 | 書き込まれる内容 | 読み取り権限 |
---|---|---|
id | 識別子 | 全ユーザー(ユーザープールへのログインを問わない) |
firstName | 姓 | 本人のみ |
lastName | 姓 | 本人のみ |
nickname | 識別子 | 全ユーザー(ユーザープールへのログインを問わない) |
また、以下の場合においてIAM認証を用います
- Lambdaから
mutation createUser
を実行する際 - アカウントを持たない(Cognitoユーザープールにログインしていない)閲覧者が登録されたユーザーの
id
とnickname
を参照する際
この場合、恐らくスキーマは以下のようになると思います。
graphql
1type User 2 @model 3 @auth(rules: [ 4 { allow: public, provider: iam }, 5 { allow: owner, ownerField: "id", operations: [read, update] } 6 ]) 7{ 8 id: ID! 9 firstName: String! 10 @auth(rules: [{ allow: owner, ownerField: "id" }]) 11 lastName: String! 12 @auth(rules: [{ allow: owner, ownerField: "id" }]) 13 nickname: String! 14} 15
ここで一点疑問があります。
Lambdaからmutation createUser
を実行するためIAM認証は必要不可欠ですが、それは同時に一般ユーザーも同じIAM権限を使ってUserに対しCRUDを行えてしまうということになります。
これは明らかに設計として不自然なので行うべきではないと思うのですが、このような場合には一般的にどういった対応を行うのが正解でしょうか。
ちなみに以下の対応も考えましたが、いずれも後述する理由からなるべく採用したくないと思っています。
DynamoDBClientを使って直接書き込みを行う
_version
lastChangedAt
_deleted
などAmplify側で自動生成された属性値を手動で書き込む必要が出てくる
Cognitoのカスタム属性を用いる
- 一度作成したカスタム属性が削除できなくなる
- Userだけでなく他のモデルでも起こりうることなので一時しのぎにしかならない
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。