将Cognito的用户信息与AWS Amplify GraphQL关联起来。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Cognito的用户信息与AWS Amplify GraphQL关联起来。相关的知识,希望对你有一定的参考价值。
我使用的是xcode 11.4,Swift 4。我的目标是
在Cognito用户池中注册一个新用户,然后使用Amplify GraphQL保存一个相关的用户记录。
用Cognito User Pool登录后,对用户的记录进行CRUD。
问题是我不知道如何将Cognito与Amplify GraphQL关联起来。例如,在Google Firebase auth和Firestore中,我会得到一个独特的用户ID。UID
注册后,我将在 Firestore
照这样 UID
. 然后在用户签名认证时,我可以得到这样的结果。UID
从firebase auth中找到相关的记录,并在firestore中找到相关的记录。
目前,在AWS堆栈中,我创建了一个用户模型,在 schema.graphql
为。
type User @model @auth(rules: [{ allow: owner, ownerField: "id", operations: [create, update, delete]}]){
id: ID!
firstName : String
lastName : String
handle : String
email : String!
}
所以,只有经过认证的用户才能创建,更新和删除。接下来在 SignUpController
我创建了一个新用户。
AWSMobileClient.default().signUp( username: email
, password: password
, userAttributes: ["email": email]) { (signUpResult, error) in
if let signUpResult = signUpResult {
switch(signUpResult.signUpConfirmationState) {
case .confirmed:
self.showAlert(msg: "You already have an account. Please go back and press log in")
case .unconfirmed:
break
case .unknown:
self.showAlert(msg: "Network error")
}
} else if let error = error { ... }
然后确认用户的W码
AWSMobileClient.default().confirmSignUp(username: email, confirmationCode: code) { (signUpResult, error) in
if let signUpResult = signUpResult {
switch(signUpResult.signUpConfirmationState) {
case .confirmed:
// This is where I need to create an associated user account
break
case .unconfirmed:
self.showAlert(title: "Error", msg: "User is not confirmed and needs verification via (signUpResult.codeDeliveryDetails!.deliveryMedium) sent at (signUpResult.codeDeliveryDetails!.destination!)")
case .unknown:
self.showAlert(title: "Error", msg: "Network error")
}
} else { //if let error = error {
self.showAlert(title: "Error", msg: "Network error")
}
现在我的解决方案是 case .confirmed
是立即登录,然后获取用户的 client token
通过。
class CognitoPoolProvider : AWSCognitoUserPoolsAuthProviderAsync {
/// this token may not be what you want ...
func getLatestAuthToken(_ callback: @escaping (String?, Error?) -> Void) {
AWSMobileClient.default().getTokens { (token, error) in
if let error = error {
callback(nil,error)
}
callback(token?.accessToken?.tokenString, error)
}
}
}
事实证明这是一个错误的解决方案,因为用户的客户端令牌一直在变化。
总的来说,这是一个标准的hello-world问题,AWS应该有一个标准的开箱即用的解决方案。我搜索了文档和github,但找不到满意的答案。
正确的方法是不要相信CLIENT从Cognito创建关联用户信息,你必须在服务器端进行。
你应该为Cognito创建一个新的Lambda Post Confirmation Trigger,并编写代码来创建一个关联账户。你可以使用 event.userName
或创建自定义属性uuid类型的喜欢。custom:id
链接您的关联账户。
参考资料:/docs.aws.amazon.comcognitolatestdeveloperguideuser-pool-lambda-post-confirmation.html。https:/docs.aws.amazon.comcognitolatestdeveloperguideuser-pool-lambda-post-confirmation.html。
以上是关于将Cognito的用户信息与AWS Amplify GraphQL关联起来。的主要内容,如果未能解决你的问题,请参考以下文章