【问题标题】:How to get AWS Cognito user attributes using AWSMobileClient in iOS?如何在 iOS 中使用 AWSMobileClient 获取 AWS Cognito 用户属性?
【发布时间】:2019-05-08 12:05:38
【问题描述】:

问题很简单:我使用 AWS Cognito 和 AWS Amplify 向 iOS 应用程序添加了用户身份验证。我已经成功实现了登录和注册,但是如何获取邮箱、全名或电话号码等用户属性呢?

【问题讨论】:

    标签: ios amazon-web-services amazon-cognito


    【解决方案1】:

    更新:

    对于 AWSMobileClient ~> 2.12.0,您可以按如下方式获取用户属性。

    AWSMobileClient.default().getUserAttributes { (attributes, error) in
         if(error != nil){
            print("ERROR: \(error)")
         }else{
            if let attributesDict = attributes{
               print(attributesDict["email"])
               print(attributesDict["given_name"])
            }
         }
    }
    

    【讨论】:

      【解决方案2】:

      根据documentation,有几个用于常见属性(如用户名)的属性助手:

      AWSMobileClient.getInstance().getUsername()
      AWSMobileClient.getInstance().isSignedIn()
      AWSMobileClient.getInstance().getIdentityId()
      

      你也可以获取 JWT 令牌,然后拉出任何用户属性:

      AWSMobileClient.getInstance().getTokens().getIdToken().getTokenString()
      

      【讨论】:

      • AWSMobileClient.getInstance().getIdentityId() 正在返回空值....知道为什么我在登录过程返回成功的地方得到空值
      【解决方案3】:

      您可以在最新的 SDK 版本2.8.x 中将 getUserAttributes 与以下 API 一起使用:

      public func getUserAttributes(completionHandler: @escaping (([String: String]?, Error?) -> Void))
      

      你可以在这里找到源代码:

      https://github.com/aws-amplify/aws-sdk-ios/blob/master/AWSAuthSDK/Sources/AWSMobileClient/AWSMobileClientExtensions.swift#L532

      【讨论】:

        【解决方案4】:

        如果您正在寻找特定的电子邮件地址,并且可能需要离线进行,这对您有用:

        AWSMobileClient.sharedInstance().getTokens { (tokens, error) in
            if let error = error { print(error.localizedDescription) }
            if let tokens = tokens {
                let email = tokens.idToken?.claims?["email"] as? String
                //completionHandler(email)... etc.
            }
        
        

        虽然AWSMobileClient.sharedInstance().getUsername() 很方便,但即使用户池设置为使用电子邮件作为用户名,它也会返回用户池用户的 ID。我认为这是一个错误,但尚未向 AWS 报告。

        【讨论】:

          【解决方案5】:

          我也在 android (Kotlin) 上研究它。

          // retrieve username
          val username = AWSMobileClient.sharedInstance().username
          

          当您使用“电子邮件”和“密码”登录时,“用户名”为“电子邮件”。

          另一方面,在 iOS (Swift) 的情况下,“用户名”实际上是 cognito 用户池的“用户名”,即使您使用“电子邮件”和“密码”登录。

          这太令人困惑了......

          【讨论】:

            猜你喜欢
            • 2021-03-09
            • 2017-08-25
            • 2017-08-12
            • 2019-01-06
            • 2019-05-08
            • 2022-11-16
            • 2018-01-05
            • 2018-08-25
            • 2021-05-06
            相关资源
            最近更新 更多