使用AWS Cognito Federated Identities进行身份验证失败,因为未对用户进行身份验证

时间:2018-03-22 03:43:10

标签: xamarin.android amazon-cognito aws-cognito federated-identity

我正在为调用AWS-Lambda的Android应用添加适当的身份验证。应用用户需要注册。该应用应支持公共登录提供商,例如Google+或Facebook。为此,我想我会使用AWS Cognito和联合身份。

我试图遵循https://aws.amazon.com/blogs/mobile/understanding-amazon-cognito-authentication记录的工作流程 其中包括

  1. GetId
  2. GetOpenIdToken
  3. AssumeRoleWithWebIdentity
  4. 在AWS控制台中,我创建了一个AWS Identity Pool,并将Google+配置为身份验证提供程序。我已禁用未经身份验证的访问权限,因为我需要用户始终进行身份验证。

    我遇到了调用GetId的问题,这是该工作流程的第一步,它会返回错误,告知我未对此标识池启用未经身份验证的访问权限。是的,我的用户正在进行身份验证,在工作流程的早期阶段,用户无法通过身份验证,这一点并不重要。

    这里是代码(Xamarin.Android C#)

    import scala.reflect.runtime.universe._
    
    case class Params[K]( m: Map[(K, TypeTag[_]), Any] ) extends AnyVal {
      def add[V](k: K, v: V)(implicit vt: TypeTag[V]) = this.copy(
          m = this.m + ((k, vt) -> v)
        )
      def grab[V](k: K)(implicit vt: TypeTag[V]) = m((k, vt)).asInstanceOf[V]
    }
    
    val params = Params[String](Map.empty).
      add[Int]("a", 100).
      add[String]("b", "xyz").
      add[Double]("c", 5.0).
      add[List[Int]]("d", List(1, 2, 3))
    // params: Params[String] = Params( Map(
    //   (a,TypeTag[Int]) -> 100, (b,TypeTag[String]) -> xyz, (c,TypeTag[Double]) -> 5.0,
    //   (d,TypeTag[scala.List[Int]]) -> List(1, 2, 3)
    // ) )
    
    params.grab[Int]("a")
    // res1: Int = 100
    
    params.grab[String]("b")
    // res2: String = xyz
    
    params.grab[Double]("c")
    // res3: Double = 5.0
    
    params.grab[List[Int]]("d")
    // res4: List[Int] = List(1, 2, 3)
    

    GetId调用抛出异常,告诉我此身份池不支持未经身份验证的访问。我误解了使用联合身份验证使用AWS Cognito进行身份验证的哪个部分?

    更新: 这是否意味着为未经身份验证的访问禁用AWS身份识别池,我需要创建一个只拥有该身份池的权限的IAM帐户,并将其凭据存储在移动应用程序中?这样我的移动应用就可以对最终用户进行身份验证。 如果确实如此,那么在移动应用程序中存储访问密钥是否有很好的解决方案可以阻止大多数廉价的逆向工程?如果访问密钥存储在移动应用程序中,那么这确实提供了比未经身份验证的身份池更多的安全性吗?

1 个答案:

答案 0 :(得分:1)

我找到了一个不需要调用以下内容的解决方案

  1. GETID
  2. GetOpenIdToken
  3. AssumeRoleWithWebIdentity
  4. 取而代之的是

    var awsCredentials = new CognitoAWSCredentials(
        "Identity Pool ID",
        AWSConfigs.RegionEndpoint);
    awsCredentials.AddLogin("accounts.google.com", token);
    

    另请参阅this post,其中介绍了如何将Cognito联合到Google。