用户数据存储设计模式AWS AppSyn与GraphQL和CognitoAuth



我第一次在空闲时间构建一个无服务器的web应用程序。我已经使用AWS Cognito和Amplify完成了整个登录工作流程,但现在我很尴尬。

我想在cognito之外存储与用户相关的数据(如生日、显示用户名、头像图片URL等(,但由于我使用cognito auth设置了appsync,由于授权问题,我无法在注册时(在用户验证之前(在数据库中创建用户。我没有将这些数据存储在cognito中,原因有二:

  1. 这些字段稍后可能会更改(如添加或删除一个字段(,并且cognito不允许删除属性
  2. 根据我所读到的内容,AWS Cognito不允许使用其属性进行反向搜索

我觉得这是一个完整的工作流程问题,我对建议持开放态度,但我知道我只有在注册时才有一些用户数据(如显示用户名或生日(。

你可以在这里找到我的AppSync graphql配置(目前这是非常基本的(

schema {
query: Query
mutation: Mutation
subscription: Subscription
}
type Mutation {
createUserData(input: CreateUserDataInput!): UserData
deleteUserData(input: DeleteUserDataInput!): UserData
updateUserData(input: UpdateUserDataInput!): UserData
}
type Query {
getUserData(email: String!, id: ID!): UserData
listUserData(filter: TableUserDataFilterInput, limit: Int, nextToken: String): UserDataConnection
}
type Subscription {
onCreateUserData(email: String, first_name: String, id: ID, last_name: String, pseudoname: String): UserData @aws_subscribe(mutations : ["createUserData"])
onDeleteUserData(email: String, first_name: String, id: ID, last_name: String, pseudoname: String): UserData @aws_subscribe(mutations : ["deleteUserData"])
onUpdateUserData(email: String, first_name: String, id: ID, last_name: String, pseudoname: String): UserData @aws_subscribe(mutations : ["updateUserData"])
}
type UserData {
avatar: String
email: String!
first_name: String
id: ID!
last_name: String
pseudoname: String
}
type UserDataConnection {
items: [UserData]
nextToken: String
}
enum ModelAttributeTypes {
_null
binary
binarySet
bool
list
map
number
numberSet
string
stringSet
}
enum ModelSortDirection {
ASC
DESC
}
input CreateUserDataInput {
avatar: String
email: String!
first_name: String
id: ID!
last_name: String
pseudoname: String
}
input DeleteUserDataInput {
email: String!
id: ID!
}
input ModelBooleanInput {
attributeExists: Boolean
attributeType: ModelAttributeTypes
eq: Boolean
ne: Boolean
}
input ModelFloatInput {
attributeExists: Boolean
attributeType: ModelAttributeTypes
between: [Float]
eq: Float
ge: Float
gt: Float
le: Float
lt: Float
ne: Float
}
input ModelIDInput {
attributeExists: Boolean
attributeType: ModelAttributeTypes
beginsWith: ID
between: [ID]
contains: ID
eq: ID
ge: ID
gt: ID
le: ID
lt: ID
ne: ID
notContains: ID
size: ModelSizeInput
}
input ModelIntInput {
attributeExists: Boolean
attributeType: ModelAttributeTypes
between: [Int]
eq: Int
ge: Int
gt: Int
le: Int
lt: Int
ne: Int
}
input ModelSizeInput {
between: [Int]
eq: Int
ge: Int
gt: Int
le: Int
lt: Int
ne: Int
}
input ModelStringInput {
attributeExists: Boolean
attributeType: ModelAttributeTypes
beginsWith: String
between: [String]
contains: String
eq: String
ge: String
gt: String
le: String
lt: String
ne: String
notContains: String
size: ModelSizeInput
}
input TableBooleanFilterInput {
eq: Boolean
ne: Boolean
}
input TableFloatFilterInput {
between: [Float]
contains: Float
eq: Float
ge: Float
gt: Float
le: Float
lt: Float
ne: Float
notContains: Float
}
input TableIDFilterInput {
beginsWith: ID
between: [ID]
contains: ID
eq: ID
ge: ID
gt: ID
le: ID
lt: ID
ne: ID
notContains: ID
}
input TableIntFilterInput {
between: [Int]
contains: Int
eq: Int
ge: Int
gt: Int
le: Int
lt: Int
ne: Int
notContains: Int
}
input TableStringFilterInput {
beginsWith: String
between: [String]
contains: String
eq: String
ge: String
gt: String
le: String
lt: String
ne: String
notContains: String
}
input TableUserDataFilterInput {
avatar: TableStringFilterInput
email: TableStringFilterInput
first_name: TableStringFilterInput
id: TableIDFilterInput
last_name: TableStringFilterInput
pseudoname: TableStringFilterInput
}
input UpdateUserDataInput {
avatar: String
email: String!
first_name: String
id: ID!
last_name: String
pseudoname: String
}

Cognito支持所有OIDC标准声明,这些声明应该涵盖各种各样的用例。对于未涵盖的其他属性,请考虑将注册表单中的数据序列化,并将其作为单个自定义属性存储在用户池中(如果它低于2048个字符的限制(。如果需要验证,请在预注册lambda触发器中进行验证。

要使该用户数据可用,请考虑创建另一个处理程序作为预令牌生成触发器。在处理程序中,您可以反序列化表单数据,并将它们作为声明添加到令牌中,以便于使用。通过这个处理程序,您还可以将数据推送到数据库,使其可用于查询。

最新更新