Получение имени пользователя пула пользователей Cognito из идентификатора пула идентификации Cognito

10

Я использую AWS Congito User Pools для управления учетными записями с помощью Cognito Identity Pool, в котором этот пул пользователей используется в качестве поставщика удостоверений. Я использую это для управления доступом к API через API-шлюз, который отправляет запросы в Lambda. Моя лямбда реализована на Java 8 с использованием Micronaut. Все это работает нормально.

В Lambda, я получаю название от 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. Что-то вроде этого:

мы-восток-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: у вас нет доступа к этому идентификатору (служба: CognitoIdentity, код статуса: 400, идентификатор запроса: 64e36646-612b-4985-91d1-82aca770XXXX)

Попытка сделать это через CLI приводит к похожему результату:

aws cognito-identity поиск-удостоверение разработчика -identity-id us-east-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx - id-ID-идентификатора us-east-1: xxxx0aa1-89f9-4418-be04- 7e83c838xxxx - max-results = 10

Произошла ошибка (NotAuthorizedException) при вызове операции LookupDeveloperIdentity: у вас нет доступа к этому идентификатору

Я убедился, что политика IAM должна быть в состоянии справиться с этим, и когда я пробую ее с ролью, у которой нет этой политики, я получаю другую ошибку

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

Таким образом, вопросы сводятся к:

  • Это лучший способ получить имя пользователя из пула идентификаторов?
    • Если это так - что я делаю неправильно?
    • Если это не так - что может быть лучше?
пленный
источник
Не могли бы вы попробовать 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.
Ян Гарадж
Я тоже это попробовал и получил то же сообщение об ошибке. Я уверен, что я использую учетные данные из учетной записи, которая владеет пулом идентификации - другие операции в пуле работают нормально. Это разрешение пользователя кажется ... странным ... но если это так, я бы хотел знать, как получить разрешение пользователя для сервера.
Заключенный

Ответы:

6

Альтернативный подход

Чтобы получить идентификатор пользователя из пула пользователей, вы можете получить его в своей лямбде:

authProvider = event.requestContext.identity.cognitoAuthenticationProvider;

Это вернет строку, которая будет включать в себя идентификатор пользователя User Pool, и будет выглядеть примерно так:

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 - идентификатор пула пользователей, а qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr - идентификатор пользователя пула пользователей. Затем вы можете разделить строку и извлечь идентификатор пользователя.

Обратите внимание, что эта информация будет отличаться в зависимости от того, какой провайдер аутентификации вы используете.

Затем, если вам нужно имя пользователя вместо идентификатора пользователя, вы можете извлечь его непосредственно из пула пользователей, получив соответствующие сведения для этого конкретного идентификатора пользователя.

Ссылка

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

Ксантос Симеу
источник
Принято (с опозданием, но рад, что вы получили бонусного представителя), даже если в документации на этой странице написано: «Хотя описанный ниже процесс не задокументирован» Хотелось бы, чтобы был действительно задокументированный способ сделать это.
Заключенный