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

相關問題