0

カスタム認証プロバイダ(開発者認証)のIDトークンを正常に取得できました。これは、Cognito devauthデモサーブレットを使用して実装されています。AWS Cognito returned - '無効なログイントークン。 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> 

idブラウザを使用すると、新しいcongnito IDが作成されていることがわかりました。したがって、サーブレットとのトークンの相互作用は正しいようです。しかし、トークンは拒否されています。

私はここで何が欠けていますか?どうすればそれをさらにトラブルシューティングできますか?

編集: ブラウザクライアント:javascript sdk、バージョン2.58 JSクライアントを本来this demoに書き込んでいます。この変更は、ログイン呼び出し自体の一部としてトークンを取得するだけです。生成されたトークンは、IOTクライアント・アクセスのみを持つロールに対応します。 (私はその政策が拡大する必要があるのだろうと思う)。最終的に、ユーザーはこのデモではなく内部IDストアに対して検証されます。

編集2: Cognitoサービスに対してgetCredentialsForIdentiyを呼び出す代わりに、私はSTSに対してassumeRoleWithWebIdentityを呼び出し、それが機能しました。拡張フローhere.ではなく、基本フローの使用。なぜ、拡張されたフローがうまくいかなかったのかは分かりませんが、今は基本的なフローのアプローチをとるでしょう。

+1

お使いのSDKはどちらですか?あなたはこの流れをどのように管理しているかについてもう少し詳しく説明できますか?あなたが説明したことは正しく聞こえるので、それはちょっとしたことであるはずです。 –

+0

ありがとう!追加の詳細を追加しました。 – user1452132

答えて

0

したがって、AWSのドキュメントhereは、不正確であるか、非効率的なシナリオを示しています。

JavaScript Cognito APIを使用すると、デベロッパープロバイダの返されたトークンをGetCredentialsForIdentityでCognito APIに対して使用できませんでした。 (これは私にこの質問をするよう促したものです)。

しかし、私はSTS APIに対して同じトークンを使用して、上記のGetCredentialsForIdentityと同じ応答パラメータを本質的に返すAssumeRoleWithWebIdentityを呼び出すことができます。これが私が取ったアプローチです。

最初のリンクの基本認証フローのドキュメントが不正確に見えます。なぜなら、「資格を取得する」と「役割を担う」ということを必要なステップとして挙げているが、実際には1つだけが必要だからだ。また、ブラウザから、これはAmazonサービスに呼び出されるAPIです。したがって、Basicの代わりにEnhanced Flowを使用しても、うまくいくとは思わしくありません。

関連する問題