0

我能夠成功檢索我的自定義身份驗證提供程序(開發人員身份驗證)的身份標記。這是使用Cognito devauth演示servlet實現的。AWS認證返回 - '登錄令牌無效。不是Cognito令牌'

此令牌返回給運行AWS JS SDK的瀏覽器。當我打電話給getCredentialsForIdentiy時,我收到'無效的登錄令牌'錯誤。

POST https://cognito-identity.us-west-2.amazonaws.com/ 400 (Bad Request) 
app.js:150 Error: Invalid login token. Not a Cognito token. 
    at constructor.a (aws-sdk-2.58.0.min.js:41) 
    at constructor.callListeners (aws-sdk-2.58.0.min.js:41) 
    at constructor.emit (aws-sdk-2.58.0.min.js:41) 
    at constructor.emitEvent (aws-sdk-2.58.0.min.js:41) 
    at constructor.e (aws-sdk-2.58.0.min.js:41) 
    at i.runTo (aws-sdk-2.58.0.min.js:43) 
    at aws-sdk-2.58.0.min.js:43 
    at constructor.<anonymous> (aws-sdk-2.58.0.min.js:41) 
    at constructor.<anonymous> (aws-sdk-2.58.0.min.js:41) 
    at constructor.callListeners (aws-sdk-2.58.0.min.js:41) "NotAuthorizedException: Invalid login token. Not a Cognito token. 
    at constructor.a (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:615) 
    at constructor.callListeners (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:30513) 
    at constructor.emit (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:30224) 
    at constructor.emitEvent (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:16590) 
    at constructor.e (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:12285) 
    at i.runTo (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:43:7277) 
    at https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:43:7482 
    at constructor.<anonymous> (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:12495) 
    at constructor.<anonymous> (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:16645) 
    at constructor.callListeners (https://sdk.amazonaws.com/js/aws-sdk-2.58.0.min.js:41:30619)" 

我傳遞給getCredentialsForIdentity以下參數。

identityId: <returned from servlet in region:guid format> 
customRoleArn: <that maps to authenticated role> 
Logins: <cognito-identity.amazonaws.com = token returned by congito> 

我注意到,新的congnito身份是通過使用id瀏覽器創建的。所以,與servlet的令牌交互似乎是正確的。但令牌被拒絕。

我在這裏錯過了什麼?我如何進一步排除故障?

編輯: 瀏覽器客戶端:javascript sdk,版本2.58。 基本上寫一個JS客戶端到this demo。這些修改只是將令牌作爲登錄調用本身的一部分。生成的令牌對應於只有IOT客戶端訪問權限的角色。 (我想知道這個政策是否需要擴大)。最終用戶將通過內部ID存儲進行驗證,而不是此演示。

編輯2: 不是針對Cognito Service調用getCredentialsForIdentiy,而是針對STS調用了assumeRoleWithWebIdentity並且工作正常。使用基本流程而不是增強流程here.。真的不知道爲什麼增強流量不起作用,但現在將採取基本的流量方法。

+1

您正在使用哪個SDK?你能否詳細說明你如何管理這個流程?你描述的內容聽起來很對,所以它應該是一些小事。 –

+0

謝謝!增加了更多細節。 – user1452132

回答

0

因此,AWS文檔here要麼不準確,要麼記錄效率低下的情況。

使用JavaScript Cognito API,我的Developer Provider返回的令牌無法與針對Cognito API的GetCredentialsForIdentity一起使用。 (這是促使我問這個問題的原因)。

但是,我可以對STS API使用相同的標記並調用AssumeRoleWithWebIdentity,它基本上返回與上面的GetCredentialsForIdentity相同的響應參數。這是我採取的方法。

第一個鏈接中的基本身份驗證流文檔看起來不準確。因爲它按要求的步驟列出了「取得憑證」和「承擔角色」,但實際只需要一個。另外,從瀏覽器,這是一個API調用到亞馬遜服務。因此,如果使用Enhanced Flow而不是Basic,那麼它看起來沒有什麼優勢。