如何从Swift中的AWS Cognito用户池获取用户属性?

时间:2017-03-20 23:47:23

标签: swift amazon-web-services swift3 amazon-cognito

我正在使用带有Amazon's Swift sample app的AWS Cognito用户池。我可以使用given_name属性创建用户,但以后检索given_name的方法并不明显。

Amazon示例将属性检索为AWSCognitoIdentityUserGetDetailsResponse,然后将其转储到屏幕上。但是,我无法找到AWSCognitoIdentityUserGetDetailsResponse的文档。它似乎是一个数组,但对我来说,如何从返回的属性中提取given_name并不明显。人们会认为将属性作为字典归还是一个好主意,但亚马逊并没有这样做。

任何指针?

编辑:为了澄清,返回的是AttributeType个对象的数组。 Cognito示例中的代码显示了所有返回的属性:

override func tableView(_ tableView: UITableView, cellForRowAt 
        indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "attribute", for: indexPath)
    let userAttribute = self.response?.userAttributes![indexPath.row]
    cell.textLabel!.text = userAttribute?.name
    cell.detailTextLabel!.text = userAttribute?.value
    return cell
}

这是原始回复:

Response body:
{"UserAttributes":[{"Name":"sub","Value":"XXXXXXXX-XXXX-XXXX-XXXX-
XXXXXXXXXXXX"},{"Name":"email_verified","Value":"true"},
{"Name":"given_name","Value":"Bob"},
{"Name":"email","Value":"bob@example.com"}],"Username":"AAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE"}

如果没有遍历整个数组,如何拔出given_name对我来说并不明显。

2 个答案:

答案 0 :(得分:1)

此处不是iOS专家,但从我在SDK implementation中看到的内容看来,它们copy来自AWSCognitoIdentityProviderGetUserResponse的详细信息,documentation显示它具有用户属性以地图的形式。您是否尝试在响应中查找userAttributes数组?

此外,原始GetUser API表示UserAttributes应该在响应中。

答案 1 :(得分:0)

以下是使用getDetails()访问userAttributes

的示例
    self.user?.getDetails().continueOnSuccessWith { (task) -> AnyObject? in // handle all auth setup
        DispatchQueue.main.async(execute: {
            self.response = task.result // AWSCognitoIdentityUserGetDetailsResponse

            if let attributes = task.result?.userAttributes { // https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-attributes.html
                for attribute in attributes {
                    print(attribute.name, attribute.value)
                    if attribute.name == "name" {
                        // ... do something with name
                    }
                }
            }

        })
        return task
    }
}