【问题标题】:How to add a user into a AWS Cognito userpool group?如何将用户添加到 AWS Cognito 用户池组?
【发布时间】:2019-11-29 02:17:04
【问题描述】:

我正在使用 AWS Cognito 在我的 iOS APP (Swift) 中实现用户注册和登录。

当用户注册时,我想将该用户添加到已在我的 cognito 用户池中创建的指定用户池组中。

我已经尝试了下面的 swift 代码,但它似乎不起作用。

用户注册后,按[addToGroup]按钮加入名为[GroupA]的用户池组。

@IBAction func addToGroupButton(_ sender: Any) {
        let request = AWSCognitoIdentityProviderAdminAddUserToGroupRequest()
        request?.groupName = "GroupA"
        request?.userPoolId = "ap-northeast-1_8H0k*****"
        request?.username = eMailAdd

        let identityProvider = AWSCognitoIdentityProvider()
        identityProvider.adminAddUser(toGroup: request!).continueWith { (task) -> Any? in
            DispatchQueue.main.async(execute: {
                if let error = task.error {
                    print("\(error.localizedDescription)")
                }
            })
        }
    }

用户注册没有问题,我可以确认用户注册的信息。 但是,用户名只是没有出现在 GroupA 中。

谁能告诉我我的代码有什么问题? 谢谢!!

【问题讨论】:

    标签: ios swift amazon-web-services amazon-cognito aws-userpools


    【解决方案1】:

    我假设您遇到了一些错误,例如 AWSCognitoIdentityProviderErrorNotAuthorized。因为这是一个“管理员”API 调用,此处建议“需要开发人员凭据”[0]。

    我建议您对您的凭据进行硬编码,以测试此 API 调用是否首先有效

    AWSStaticCredentialsProvider *credentialsProvider = [AWSStaticCredentialsProvider credentialsWithAccessKey:"your-access-key" secretKey:"your-secret-key"];
    AWSServiceConfiguration *configuration = [AWSServiceConfiguration configurationWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider];
    [AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;
    

    请注意,不要在生产环境中对您的凭据进行硬编码。

    21/07/2019 更新:

    let staticCredentialProvider = AWSStaticCredentialsProvider.init(accessKey: "yourAccessKey", secretKey: "yourSecretKey")
    let configuration = AWSServiceConfiguration.init(region: .APSoutheast2, credentialsProvider: staticCredentialProvider)
    AWSServiceManager.default()?.defaultServiceConfiguration = configuration
    
    let request = AWSCognitoIdentityProviderAdminAddUserToGroupRequest()
    request?.groupName = "GroupA"
    request?.userPoolId = "ap-southeast-2_xxxxxxxxx"
    request?.username = "yourUserName"
    
    
        AWSCognitoIdentityProvider.default().adminAddUser(toGroup: request!).continueWith { (task) -> Any? in
            DispatchQueue.main.async(execute: {
                if let error = task.error {
                    print("\(error.localizedDescription)")
                }
            })
        }
    

    我已经测试过了,上面的代码在我的测试环境中运行。我在这里列出以供您参考。下一步将尝试从代码库中删除硬编码凭证。可以使用 Cognito 身份池获取临时凭证,而不是使用 AWSStaticCredentialsProvider。我认为在获得足够许可的情况下,此流程无需开发人员凭据即可工作。

    26/07/2019 更新:

    // using Cognito userpool with identity pool, to provider credential to AWSServiceManager
    let serviceConfiguration = AWSServiceConfiguration(region: .APSoutheast2, credentialsProvider: nil)
    let userPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: "YourUserPoolClientId", clientSecret: "YourUserPoolClientSecret", poolId: "YourUserPoolId")
    AWSCognitoIdentityUserPool.register(with: serviceConfiguration, userPoolConfiguration: userPoolConfiguration, forKey: "RandomStringForIdentifyingYourPoolWithinThisApp")
    let pool = AWSCognitoIdentityUserPool(forKey: "RandomStringForIdentifyingYourPoolWithinThisApp")
    let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .APSoutheast2, identityPoolId: "YourIdentityPoolId", identityProviderManager:pool)
    
    let configuration = AWSServiceConfiguration.init(region: .APSoutheast2, credentialsProvider: credentialsProvider)
    AWSServiceManager.default()?.defaultServiceConfiguration = configuration
    
    // sign in a user
    pool.getUser("UserNameOfAUserInYourPool").getSession("UserNameOfAUserInYourPool", password: "PasswordOfAUserInYourPool", validationData: nil).continueWith { (task) -> Any? in
        if let error = task.error {
            print("user sign in error: \(error.localizedDescription)")
        } else {
            print("user session is: \(String(describing: task.result))")
        }
    
        // add a user to GroupA
        let request = AWSCognitoIdentityProviderAdminAddUserToGroupRequest()
        request?.groupName = "GroupA"
        request?.userPoolId = "YourUserPoolId"
        request?.username = "UserNameOfAUserInYourPool"
    
        return AWSCognitoIdentityProvider.default().adminAddUser(toGroup: request!)
        }.continueWith { (task) -> Any? in
            if let error = task.error {
                print("cannot add user to group \(error.localizedDescription)")
            }
    }
    

    就像我建议的那样,这是没有硬编码 AWS 凭证的解决方案。 Cognito 身份池在用户登录到 Cognito 用户池 [3] 后提供温度 AWS 凭证,从而启用“adminAddToGroup”API 调用。

    除了上述代码,您还需要在 AWS 控制台或使用 AWS CLI 设置您的 Cognito 身份池。您可以在屏幕截图中找到详细信息。

    您还需要为经过身份验证的用户创建一个身份验证 IAM 角色以代入。这是策略示例。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "cognito-idp:AdminRemoveUserFromGroup",
                    "cognito-idp:AdminAddUserToGroup"
                ],
                "Resource": "Your_userpool_ARN"
            }
        ]
    }
    

    参考: [0]https://aws-amplify.github.io/aws-sdk-ios/docs/reference/Classes/AWSCognitoIdentityProvider.html#//api/name/adminAddUserToGroup: [2]https://aws.amazon.com/blogs/mobile/how-amazon-cognito-keeps-mobile-app-users-data-safe/ [3]https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-integrating-user-pools-with-identity-pools.html

    【讨论】:

    • 感谢您的回答。这可能是解决这个问题的关键。但是现在,我什至无法打印错误,因为这部分代码似乎有问题。错误消息是 [由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“- init 不是有效的初始化程序。请改用+ defaultCognitoIdentityProvider+ CognitoIdentityProviderForKey:。']。我想我昨天确实用相同的代码打印了“(error.localizedDescription)”。但是今天当我运行程序时,出现了上面的消息。好困惑……你有什么想法吗?
    • @keishinzzz 不用担心,我已经更新了我的答案。您收到异常的原因是无法使用普通的 init() 方法创建 AWSCognitoIdentityProvider。您应该改用它的单例。就像我昨天建议的那样,您需要配置 AWSServiceConfiguration 来签署这个管理 API 调用。一旦我有时间摆脱硬编码的开发人员凭据,我可能会更新答案。
    • @keishinzzz 不客气 :) 最终,您将希望摆脱 AWSStaticCredentialsProvider,改用 AWSCognitoCredentialsProvider。在这种情况下,登录用户可以从身份池中获取临时凭据,这在理论上使他们能够将自己添加到组中。身份池中的 auth 角色应该有足够的权限来调用管理 API 调用。这周比较忙,有时间试试。
    • @keishinzzz 正如承诺的那样,我添加了没有硬编码 AWS 凭证的新解决方案。要在 iOS 中使用 AWS 服务,我建议您查看最新的 Amplify iOS SDK (aws-amplify.github.io/docs/ios/start)。它具有更好的文档并提供更好的开发体验。开箱即用不支持“AdminAddToGroup”,但我认为它可以与我的上述解决方案一起使用,并进行一些调整。有时间我可以举个例子。
    • @keishinzzz 不用担心 :) 我知道你不会打扰我,但是在这里提问可以让其他有同样问题的人受益,对吧?您可以随时在这里提问,并联系我,我会在有空时尽力回答。
    猜你喜欢
    • 2018-12-11
    • 2018-09-08
    • 2018-06-02
    • 2021-09-03
    • 2019-09-02
    • 2020-02-25
    • 2018-08-23
    • 2020-09-19
    • 1970-01-01
    相关资源
    最近更新 更多