0

在AWS上,我希望创建一个应用程序,允许用户通过手机,网络或两者登录。AWS网络和移动集线器应用程序

我创建了一个使用API​​ Gateway,Lambdas和DynamoDB作为后端的系统。我有使用JavaScript登录web工作,但有问题找到相同代码的iOS Swift示例(目标C仅适用)。所以我创建了一个移动集线器应用程序,导入了我现有的API,并且有一个可以正常工作的iOS登录。

问题是iOS端使用Mobile Hub,因此我现在有2个不同的用户池,因此您无法注册在网络上登录并在移动设备上登录(反之亦然)。

我试图改变iOS应用程序中的设置,指向我的Web应用程序Cognito用户池设置,并删除秘密,但它的错误,因为它不能为空或空。

为什么移动集线器需要客户端密钥?由于可以对代码进行反编译并提取秘密,因此建议的JavaScript文档是不好的做法。

似乎没有任何一致的文档解释了我猜测的,作为移动和Web应用最常见的用例!

另一个问题是我可以下载我的API客户端SDK用于我的API网关,以便与Web应用程序和iOS应用程序一起使用。但是,生成的移动中心应用程序包含基于REST的调用?我会在这里疯狂还是官方的网络方法没有链接到官方的移动方法?

因此,关键的问题是:

  • 可以或应该我改变了移动应用程序在原来的 Cognito点?
    • 如果是这样我应该删除客户端的密码?
    • 设置后我能否有效地忽略移动中心,并将其纯粹用于代码生成?假设它正在工作,我可以使用生成的客户端SDK用于我的API网关吗?

是否有建立在iOS(后来的Android得)和Web应用程序的更好的办法?

我花了相当多的时间和精力,尝试了很多方法。

回答

0

“移动中心”很好地树立用户池,池身份,IAM角色等

等在Info.plist文件大多提供,尽管(不明智)的用户群的开发的关键AWSSignInProvider使它在配置文件中具有硬编码密钥。

SO:

如果你不打算使用“移动中心”控制台应用程序就可以更改您的移动应用程序的配置,那么你将不需要任何更多的下载量。在这种情况下,您不必担心Info.plist或配置文件的更改,并且您可以编辑您想要的内容。

目前尚不清楚您是否要使用移动中心创建的身份池,只想插入您的用户池,或者如果您想更改两个池。显然,如果你使用的是同一个身份池,那么下面的一些变化就不需要了(它们会很明显,因为你将会改变它们完全相同)。

所以你所要做的就是改变ID来让一切正确地连接起来。

一般来说,您需要修复所有下载的密钥和ID在Info.plist和配置文件中,然后您需要更新服务器配置。更详细地,这里有你需要改变它的地方:在应用

更新所有的键在Info.plist的是你想要的钥匙。 (特别是Google的凭证提供商和身份管理器密钥)但是,如果您正在使用其他移动中心服务,请检查那里的密钥。

如果您使用s3和其他一些服务,目录名称/数据库名称也存储在代码中......我将其留作活动来查找它们。

文件MySampleApp-> AmazonAWS-> AWSConfiguration.swift在

编辑由移动枢纽提供的密钥,以配合您的用户群(这样做,而你的呼吸悄悄地说脏话,因为他们不在的Info.plist)

在控制台中: 如果您的应用程序名称不存在,请将您的应用程序名称放入您的用户池应用程序列表中,并记录用户池ID,应用程序ID和应用程序密码。

单击联合身份和移动中心创建的身份池,并更新身份验证提供程序以使用您的cognito用户池ID和应用程序ID。

如果您也在更改身份池,则需要查看身份验证和非身份用户的IAM角色,并特别编辑名为的策略:..... yourapp .... signin_MOBILEHUB_xxxxxxx,并将该策略中的身份池ID更改为您要使用的身份池ID。对auth和unauth都这样做。

(你可以改变的ID,如果你只使用一个池或其他增加的id像这样的列表,如果你将有多个身份库(测试...等))

  "Resource": [ 
      "arn:aws:cognito-identity:*:*:identityPool/us-east-1:8s8df8f8-sd9fosd9f0sdf-999sd99fd", 
      "arn:aws:cognito-identity:*:*:identityPool/us-east-1:dfsf9099-sd9fosd9f0sdf-sd9f0sdf09f9s" 
     ] 

类似地,在与角色关联的信任关系中,您需要修复该ID(或者如果您希望该角色为多个身份池提供服务,则处理多个ID)。以下是如何在那里指定多个ID。

 "Condition": { 
    "ForAllValues:StringLike": { 
     "cognito-identity.amazonaws.com:aud": [ 
     "us-east-1:8s8df8f8-sd9fosd9f0sdf-999sd99fsdfdd", 
     "us-east-1:dfsf9099-sd9fosd9f0sdf-sd9f0sdf09f9s" 
     ] 
    }, 

如果你使用谷歌太...你需要确保你已经在为谷歌的IAM配置的identityProvider(移动中心也替您),如果你使用的是自己的身份池,在你的联合身份池授权提供商配置你需要选择谷歌开放id提供商(并把谷歌放在授权提供商也(但我不认为这部分是严格需要的))

facebook does not use OpenID Connect,它具有配置到身份验证提供程序部分的专有方式,因此如果需要在身份池身份验证提供程序部分输入这些密钥。

而这应该足以让它工作。

不,你不会疯狂......文档与当前的IOS SDK不匹配。移动中心使用在sdk的TOP上构建的aws-mobilehub-helper-ios(github),所以文档也不适用于此!移动Hub助手有一个很好的设计,所以我建议你使用它,而不是原始的SDK。

(最后......我在这里没有深入,因为我没有使用API​​网关,但我的理解是API网关是一种获取凭据以使用AWS服务的方式,而且通过手机轮毂的应用程序,你将使用Cognito获得这些证书,所以我不知道你需要携带API网关进去......在所有)

UPDATE

您可能需要使用无您的JavaScript应用程序用户的客户端密码,并在同一个池中使用IOS移动应用程序。这可以通过两种方式完成:

1)更好的方法是在用户池中创建两个不同的客户端。对于一个你会产生一个客户端的秘密,另一个你将UNCHECK“生成客户端的秘密”框。

然后在您的联合身份验证池中,转到身份验证提供程序,然后单击Cognito,并指定两个不同的提供商使用同一个用户POOL ID。 (这不是两个不同的提供者,但这是控制台如何指定它的)。并且您将这两个不同的客户端ID添加到这些提供商中。

现在IOS应用程序和Javascript应用程序都可以访问该池并从identityProvider和credentialsProvider获取身份验证和凭据。

2)一个不太好的方法。这种方式更糟糕的原因是因为我不知道它对移动应用程序安全性的影响(如果有的话)。而在AWS上,没有人可以在没有购买支持合同的情况下提出这个问题。但另一种方式存在。

您所做的是在两个应用程序中使用相同的客户端ID,并且不生成客户端密钥。要做到这一点,你把“无”在clientSecret。这工作很好,有一些注意事项。

首先,AWS Mobile Hub在AWSCognitoUserPoolsSignInProvider中存在一个错误。该类要求clientSecret非空。但是在SDK中,告诉SDK你不需要客户机密的唯一方法是通过零!但是有一些解决方法。
(我所做的是使用AWSCUPIdPSignInProvider.swift(我写的),它可以很好地工作,我有一个版本,将为零的秘密。我这样做是因为我测试这个更快。如果你想使用它,你可以在github上找到该登录提供者)

但是更好的(更具未来性的证明)解决方案可能使用移动集线器提供的AWSCognitoUserPoolsSignInProvider,但更改AWSMobileClient中的代码以配置和注册你自己的游泳池,而不是让AWSCognitoUserPoolsSignInProvider为你做。我还没有打算试试这个,(因为我们只需要这样做,因为AWS还没有开始更新github aws-mobilehub-helper-ios)。但基本上在AWSMobileClient而不是此代码:

func setupUserPool() { 
    // register your user pool configuration 
    AWSCognitoUserPoolsSignInProvider.setupUserPoolWithId(AWSCognitoUserPoolId, cognitoIdentityUserPoolAppClientId: AWSCognitoUserPoolAppClientId, cognitoIdentityUserPoolAppClientSecret: AWSCognitoUserPoolClientSecret, region: AWSCognitoUserPoolRegion) 

    AWSSignInProviderFactory.sharedInstance().registerAWSSignInProvider(AWSCognitoUserPoolsSignInProvider.sharedInstance(), forKey:AWSCognitoUserPoolsSignInProviderKey) 

} 

你有这样的事情代码

 func setupUserPool() { 
     // register your user pool configuration 
    // find the service configuration (we don't know if they set it as default) 
      let credentialProvider = AWSCognitoCredentialsProvider(regionType: .USEast1 (or your region), identityPoolId: "YourIdentityPoolId") 
      let configuration = AWSServiceConfiguration(region: .USWest2 (or your region), credentialsProvider: credentialProvider) 

    // configure and put your own user pool in the service configuration 
       let userPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: AWSCognitoUserPoolAppClientId, clientSecret: nil, poolId:AWSCognitoUserPoolId) 

    // now we register that pool with the service configuration using the key they use 
       AWSCognitoIdentityUserPool.register(with: configuration, userPoolConfiguration: userPoolConfiguration, forKey: AWSCognitoUserPoolsSignInProviderKey) 

AWSSignInProviderFactory.sharedInstance().registerAWSSignInProvider(AWSCognitoUserPoolsSignInProvider.sharedInstance(), forKey:AWSCognitoUserPoolsSignInProviderKey) 

    } 

但正如我上面所说的,解决方案1,使用两个不同的客户端,并指定了两个不同的供应商优先。

+0

非常感谢您的回应。我已经为该Web应用程序设置了用户池,因此我将转而使用该应用程序,但由于移动生成的用户池需要客户端密钥,因此Web/javascript文档建议不要使用该密钥,因为它是可见的给客户。 iOS应用程序可以不用秘密工作吗?该方法有必要的秘密。 –

+0

在API网关上,我使用它来为网页和移动设备提供一致的后端。我的计划是将其用于大多数应用程序,并且只能使用对S3的直接访问,以便上传和下载需要IAM策略的图像。我最关心的是理想情况下,网络应用程序将被允许访问特定用户的特定上传。是否可以或应该使用不同的方法? –

+0

有两个问题,1)如何指定IOS API中缺少秘密,以及2)安全问题。很容易配置一个没有秘密的应用程序,问题是如何配置这个缺少秘密的池。你如何在JavaScript中做到这一点(你通过“Authenticate”api调用传递什么秘密信息?)。我们应该可以对IOS做同样的事情。在问题2中,这需要一些调查,但我感兴趣,并会采取一些措施。如果这有帮助,请接受答案。 – Bruce0

相关问题