将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关联起来。的主要内容,如果未能解决你的问题,请参考以下文章
链接到 Cognito 用户池的 AWS Amplify GraphQL 架构
使用 Amplify 将现有 AWS Cognito 用户池集成到 iOS 项目中
AWS Amplify 与托管 Cognito UI 的联合 Okta 身份验证
是否可以在没有 Cognito 用户池的情况下使用 AWS Amplify Analytics?