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

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

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

Попытка сделать это через интерфейс командной строки дает аналогичный результат:

aws когнитивно-идентификационный поиск-идентификатор-разработчика --identity-id us-east-1:xxxxe650-53f4-4cba-b553-5dff42bexxxx --identity-pool-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"
        ]
    }

Итак, вопросы сводятся к следующему:

  • Это лучший способ получить имя пользователя пула пользователей из идентификатора пула идентификаторов?
    • Если это так - что я делаю не так?
    • Если нет - что лучше сделать?

1 ответ

Решение

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

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

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

Другие вопросы по тегам