将Cognito的用户信息与AWS Amplify GraphQL关联起来。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Cognito的用户信息与AWS Amplify GraphQL关联起来。相关的知识,希望对你有一定的参考价值。

我使用的是xcode 11.4,Swift 4。我的目标是

  1. 在Cognito用户池中注册一个新用户,然后使用Amplify GraphQL保存一个相关的用户记录。

  2. 用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.htmlhttps:/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?

AWS-amplify 在请求中包含 cognito Authorization 标头

AWS Amplify/Cognito - 一种仅在用户首次登录时设置 TOTP MFA 的方法