Отримання імені користувача пулу когніто від ідентифікатора пулу ідентичності когніто


10

Я використовую пули користувачів AWS Congito для управління обліковими записами з пулом Cognito Identity, який має цей пул користувачів як постачальник ідентичності. Я використовую це для контролю доступу до 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;
  }

Що повертається у назві рядка Id Cognito identId. Щось на зразок цього:

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

Я хотів би або ввійти в систему фактичного входу користувача, або принаймні мати якийсь спосіб перетворити identId у логін при необхідності.

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 когніто-ідентичність пошуку-ідентичність розробника --identity-id us-east-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx --identity-pool-id us-east-1: xxxx0aa1-89f9-4418-be04- 7e83c838xxxx - max-результати = 10

Під час виклику операції LookupDeveloperIdentity виникла помилка (NotAuthorizedException): у вас немає доступу до цієї ідентичності

Я переконався, що створена політика 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

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

Щоб отримати ідентифікатор користувача Pool User ID, ви можете отримати його у лямбда:

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-rrrrrrrrrrrrr - це ідентифікатор користувача пулу користувачів. Потім можна розділити рядок і витягнути ідентифікатор користувача.

Зауважте, що ця інформація буде різною залежно від постачальника аутентифікації, якого ви використовуєте.

Тоді якщо вам потрібне ім'я користувача замість ідентифікатора користувача, ви можете отримати його безпосередньо з пулу користувачів, отримавши відповідні дані для цього конкретного ідентифікатора користувача.

Довідково

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


Прийнято (із запізненням, але радий, що ви отримали бонусний представник), навіть у документації на цій сторінці написано: "Хоча процес нижче не зафіксований", хотілося б, щоб це було фактично задокументовано.
В’язень
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.