コグニトIDプールidentityIdからコグニトユーザープールユーザー名を取得しています


10

このユーザープールをIDプロバイダーとして持つCognito IDプールでのアカウント管理にAWS Congitoユーザープールを使用しています。これを使用して、Lambdaにリクエストを送信するAPI Gatewayを介してAPIへのアクセスを制御しています。私のラムダはMicronautを使用してJava 8で実装されています。これらはすべて正常に機能しています。

ラムダでは、名前はのから取得PrincipalしていHttpRequestます:

  protected String resolveUser( HttpRequest request ){
    String ret = null;

    Optional<Principal> principal = request.getUserPrincipal();
    if( principal.isPresent() ){
      ret = principal.get().getName();
    }

    if( ret == null || ret.length() == 0 ){
      ret = "unknown";
    }
    return ret;
  }

CognitoのidentityIdの文字列名に戻ってくるもの。このようなもの:

us-east-1:xxxxe650-53f4-4cba-b553-5dff42bexxxx

実際のユーザーログインをログに記録するか、少なくとも必要に応じて、identityIdをログインに変換する方法をいくつか用意します。

LookupDeveloperIdentity API呼び出しはこれに対処するための正しい方法のようですが、それを機能させることができません。

JavaとAWS Java SDK 2でこれを実行しようとしています:

  protected String loadUsername( String user ){
    String ret = "unknown:"+user;
    CognitoIdentityClient cognito = CognitoIdentityClient.create();

    LookupDeveloperIdentityRequest request = LookupDeveloperIdentityRequest.builder()
      .identityPoolId( identityPoolId )
      .identityId( user )
      .build();
    LookupDeveloperIdentityResponse response = cognito.lookupDeveloperIdentity( request );
    List<String> identifiers = response.developerUserIdentifierList();
    if( identifiers != null && identifiers.size() > 0 ){
      ret = identifiers.get( 0 );
    }

    return ret;    
  }

例外をスローします

software.amazon.awssdk.services.cognitoidentity.model.NotAuthorizedException:このIDにアクセスできません(サービス:CognitoIdentity、ステータスコード:400、リクエストID:64e36646-612b-4985-91d1-82aca770XXXX)

CLI経由でこれを実行しようとすると、同様の結果が生成されます。

aws cognito-identity lookup-developer-identity --identity-id us-east-1:xxxxe650-53f4-4cba-b553-5dff42bexxxx --identity-pool-id us-east-1:xxxx0aa1-89f9-4418-be04- 7e83c838xxxx --max-results = 10

LookupDeveloperIdentity操作を呼び出すときにエラーが発生しました(NotAuthorizedException):このIDへのアクセス権がありません

適切なIAMポリシーでこれを処理できることを確認しました。このポリシーを持たないロールでそれを実行すると、別のエラーが発生します

    {
        "Effect": "Allow",
        "Action": [
            "cognito-identity:LookupDeveloperIdentity"
        ],
        "Resource": [
            "arn:aws:cognito-identity:us-east-1:##########:identitypool/us-east-1:xxxx0aa1-89f9-4418-be04-7e83c838xxxx"
        ]
    }

したがって、質問は次のように要約されます。

  • これは、IDプールIDからユーザープールのユーザー名を取得する最良の方法ですか?
    • もしそうなら-私は間違って何をしていますか?
    • そうでない場合-これを行うより良い方法は何ですか?

大量の操作に推奨されるアプローチであるdocs.aws.amazon.com/cognitoidentity/latest/APIReference/…を試してください。 Are you sure you are using the credentials from the account which owns the identity pool you are requesting lookupDeveloperIdentity for?- forums.aws.amazon.com/thread.jspa?threadID=231354は、私にとっては、ユーザー権限ではなく、IAMロールの問題のように見えます。
Jan Garaj

私もそれを試しました、そして同じエラーメッセージを得ました。IDプールを所有するアカウントの資格情報を使用していると確信しています-プールの他の操作は正常に機能します。それはユーザー権限であるように思えます...奇妙です...もしそうなら、私はサーバーのユーザー権限を取得する方法を知りたいです。
囚人

回答:


6

代替アプローチ

ユーザーのユーザープールのユーザーIDを取得するには、ラムダで取得できます。

authProvider = event.requestContext.identity.cognitoAuthenticationProvider;

これにより、ユーザーのユーザープールユーザーIDを含む文字列が返され、次のようになります。

cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx,cognito-idp.us-east-1.amazonaws.com/us-east-1_aaaaaaaaa:CognitoSignIn:qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr

ここで、us-east-1_aaaaaaaaaはユーザープールIDで、qqqqqqqq-1111-2222-3333-rrrrrrrrrrrrはユーザープールユーザーIDです。次に、文字列を分割してユーザーIDを抽出できます。

これらの情報は、使用している認証プロバイダーによって異なることに注意してください。

次に、ユーザーIDではなくユーザー名が必要な場合は、その特定のユーザーIDの適切な詳細を取得することにより、ユーザープールから直接ユーザー名を抽出できます。

参照

https://serverless-stack.com/chapters/mapping-cognito-identity-id-and-user-pool-id.html


受け入れられましたが(まあまあですが、ボーナス担当者に感謝します)、そのページのドキュメントには「次のプロセスは文書化されていませんが」とありますが、これを行うための実際の文書化された方法があればよいのにと思います。
囚人
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.