【问题标题】:How to get a user attribute from an AWS Cognito user pool in Swift?如何从 Swift 中的 AWS Cognito 用户池中获取用户属性?
【发布时间】:2017-08-12 11:08:55
【问题描述】:

我正在使用带有 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 对我来说并不明显。

【问题讨论】:

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


    【解决方案1】:

    这里不是 iOS 专家,但从我在 SDK implementation 中看到的情况来看,他们看起来像 copy AWSCognitoIdentityProviderGetUserResponse 的详细信息,documentation 显示它具有地图形式的用户属性.您是否尝试在响应中查找 userAttributes 数组?

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

    【讨论】:

    • 是的,我确实看到响应是一个数组,特别是 AttributeType 对象的数组。我没有看到一种明显的方法来提取特定属性。相反,看来我必须查看数组中的每个元素,看看它是否包含我正在寻找的键。我对 Swift 有点陌生,所以也许我错过了一些东西。我将编辑我的原始帖子以包含更多信息。
    • 由于模式是相当固定的(基线属性对每个人都是通用的,而自定义属性是由您创建的),所以属性在地图中。您可以随意获取所需的内容,因为键应该是常量。
    【解决方案2】:

    这是一个使用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
        }
    }
    

    【讨论】:

    • 这个方法不需要我。
    猜你喜欢
    • 2019-01-06
    • 1970-01-01
    • 2021-03-09
    • 2022-01-21
    • 2018-09-18
    • 2018-08-25
    • 2017-04-12
    • 2020-04-21
    • 2018-01-13
    相关资源
    最近更新 更多