Как получить атрибуты пользователя (имя пользователя, адрес электронной почты и т. Д.) С помощью идентификатора когнитивного идентификатора

У меня есть пул идентификаторов AWS Cognito, который настроен с использованием пула пользователей Cognito в качестве поставщика аутентификации.

Предположим, у меня есть идентификатор идентификатора в пуле идентификаторов Cognito (например, us-east-1: XXaXcXXa-XXXX-XXXX-XXX-XXXXXXXXXXXX), где этот идентификатор связан с пользователем в пуле пользователей Cognito.

Как я могу получить данные связанного пользователя (адрес электронной почты, телефон, имя пользователя) с помощью идентификатора личности?


person gehad    schedule 22.06.2016    source источник


Ответы (8)


Идентификационный токен, которым вы обмениваетесь со службой федеративной идентификации Cognito для получения идентификатора и учетных данных, уже имеет все атрибуты пользователя. Вам не потребуется лишний звонок в какую-либо службу.

введите описание изображения здесь

Это токен JWT, и вы можете использовать любую библиотеку на клиенте для декодирования значений. Вы можете прочитать это руководство для получения дополнительной информации о токенах, продаваемых пулами пользователей Cognito.

Кроме того, вы также можете использовать токен доступа для вызова GetUser API, который вернет всю информацию о пользователе.

person Chetan Mehta    schedule 22.06.2016
comment
Я даю пользователю доступ к одной лямбда-функции. При вызове я могу получить context.identity.cognito_identity_id. Вот почему я хочу получать информацию о пользователе с помощью идентификатора Identity_id. Есть ли способ получить токен JWT? Могу ли я безопасно передать его лямбда-функции в полезной нагрузке? - person gehad; 23.06.2016
comment
да. См. этот пост для получения инструкций о том, как это сделать. - person Chetan Mehta; 23.06.2016
comment
Я пробовал GetUser API, но это дает мне An error occurred (InvalidParameterException) when calling the GetUser operation: 1 validation error detected: Value at 'accessToken' failed to satisfy constraint: Member must satisfy regular expression pattern: [A-Za-z0-9-_=.]+ - person gehad; 16.07.2016
comment
API @gehad GetUser нужен токен доступа, а не idtoken, может быть, это резон. - person Ivan Borshchov; 20.03.2017
comment
@ChetanMehta Об атрибутах в токене идентификатора - я не могу получить настраиваемые атрибуты - он не включен в утверждения токена = ( - person Ivan Borshchov; 20.03.2017
comment
Найденное решение для настраиваемых атрибутов нужно пометить их как читаемые в настройках приложения, и тогда они будут помещены в утверждения. - person Ivan Borshchov; 20.03.2017
comment
Расскажите подробнее о том, как получить токен JWT с использованием идентификатора. - person Ildar; 09.09.2017
comment
У меня есть токен доступа от моего навыка alexa от пользователя, связанного с когнитивным доступом. Как именно мы используем его против GetUser API, чтобы получить информацию о пользователе когнитивно? Я вижу API, но на какую конечную точку я нацелен? - person fivedogit; 12.10.2019
comment
Нашел: ПОЛУЧИТЬ https: // ‹your-user-pool-domain› / oauth2 / userInfo Авторизация: Bearer ‹access_token› - person fivedogit; 12.10.2019

Использование REST API

AccessToken

Думал, что это может быть очень полезно для кого-то, так как я потратил много времени, пытаясь выяснить, как получить UserAttributes только с accessToken и region (аналогично this, но с REST API (без использования aws-sdk)

Вы можете получить UserAttributes с accessToken, используя этот HTTP-запрос. (GetUser)

Method: POST
Endpoint: https://cognito-idp.{REGION}.amazonaws.com/
Content-Type: application/x-amz-json-1.1
Content-Length: 1162 // Access Token bytes length
X-Amz-Target: AWSCognitoIdentityProviderService.GetUser
Body: {"AccessToken":"ACCESS_TOKEN"}

И если accessToken действителен, вы должны получить пример ответа, подобный следующему

{
    "UserAttributes": [
        {
            "Name": "sub",
            "Value": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"
        },
        {
            "Name": "email_verified",
            "Value": "true"
        },
        {
            "Name": "name",
            "Value": "Jason"
        },
        {
            "Name": "phone_number_verified",
            "Value": "true"
        },
        {
            "Name": "phone_number",
            "Value": "+xxxxxxxxxxx"
        },
        {
            "Name": "email",
            "Value": "[email protected]"
        }
    ],
    "Username": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"
}
person junwen-k    schedule 04.11.2019
comment
Не могу выразить, насколько это было полезно для меня! - person Aditya; 12.07.2020
comment
Спасибо! Это круче, чем долбаный документ AWS! Но когда я стреляю в https://cognito-idp.{REGION}.amazonaws.com/ со всеми параметрами, это дает мне "__type": "SerializationException", разве нам не нужно отправлять POST на нашу собственную конечную точку URL? где именно мы получаем URL-адрес сервера, он не указан ни в одном документе !! - person Zennichimaro; 17.09.2020
comment
К сожалению, он действительно работает с этим целевым URL, просто AccessToken должен быть указан в теле, а не в заголовке, я давал его как auth-header ... Большое спасибо! Хотя это похоже на взлом, потому что пользователь get в aws-lib глючит, мне это спасло! - person Zennichimaro; 17.09.2020
comment
Хотя это лучше, чем документы Amazon .. но я все еще получаю эту ошибку - токен доступа не имеет требуемых областей - person Kunal Valecha; 13.12.2020
comment
@KunalValecha Убедитесь, что вы используете токен доступа, но не идентификатор или токен обновления. Я подозреваю, что область действия вашего токена может быть чем-то другим. Вы можете перейти в раздел отладчика jwt, чтобы проверить свой токен. Обратите внимание, что токены - это учетные данные. - person junwen-k; 14.12.2020
comment
Я собирался обработать запрос, но понял, что все, что мне нужно, уже находится в переменной события, полученной Lambda stackoverflow.com/ questions / 65545529 / - person Rub; 03.01.2021
comment
@KunalValecha У меня была такая же проблема, и мне нужно было добавить область aws.cognito.signin.user.admin, чтобы она работала. См. Этот ответ для получения информации: stackoverflow.com/a/53151260/522859 - person Chris Owens; 06.07.2021

В AWS cognito-idp list-users есть опция фильтра, которая позволяет фильтровать по атрибуту. «sub» - это атрибут, который соответствует идентификатору личности, который вы описываете.

например в командной строке:

aws cognito-idp list-users --user-pool-id us-east-1_abcdFghjI --filter "sub=\":XXaXcXXa-XXXX-XXXX-XXX-XXXXXXXXXXXX\""

Для этого также требуется идентификатор пула пользователя, который, как я подозреваю, у вас есть. Кроме того, я понятия не имею, как это реализовано или как это работает при фильтрации большого количества пользователей, но я воспринимаю настраиваемые атрибуты, которые нельзя использовать в фильтрах, как намек на то, что за занавеской существует какая-то форма индексации.

person Robert Perry    schedule 30.03.2019
comment
«sub» больше не соответствует идентификатору личности. У обоих одинаковый формат, но значения разные. - person Sussch; 15.02.2021

Я столкнулся с аналогичной проблемой, и после того, как я слишком много царапал, я не смог найти точный способ вытащить детали. Мой вариант использования заключался в том, чтобы получить подробную информацию в приложении для Android. После изучения их кода API клиента AWSMobile. Я нашел ниже, и он работает у меня.

Log.i (TAG, "Сведения о пользователе" + AWSMobileClient.getInstance (). getUserAttributes (). toString ());

Рекомендация. Попробуйте использовать AWSMobileclient, если вы используете его для разработки под Android, поскольку это новая библиотека, рекомендованная для разработки.

person Static Main    schedule 19.12.2018

Я просто боролся с этим некоторое время, и способ, которым я получил имя пользователя, используя Java API:

identityManager.login(this, new DefaultSignInResultHandler() {
        @Override
        public void onSuccess(Activity activity, IdentityProvider identityProvider) {
            ...               
            String userName = ((CognitoUserPoolsSignInProvider) identityProvider).getCognitoUserPool().getCurrentUser().getUserId();
person Florin D    schedule 31.12.2019
comment
Это отлично подходит для получения идентификатора. Но можно ли использовать getCurrentUser () для поиска атрибута электронной почты вместо идентификатора? - person DaWiseguy; 31.12.2020

Существует слушатель, который мы можем инициализировать, который будет отслеживать изменения в нашем состоянии аутентификации и позволит нам иметь доступ к типу события аутентификации, которое произошло, и обновлять состояние приложения на основе этих данных.

С Amplify модуль Hub позволяет нам делать это красиво с легкостью:

import { Hub } from 'aws-amplify';

Hub.listen('auth', (data) => {
    const {payload} = data;
    if (payload.event === 'signOut') {
       console.log('signOut');
    } else if (payload.event === 'signIn') {
       console.log('A new auth event has happened: ', data.payload.data.username + ' has ' + data.payload.event);
    }
});

введите описание изображения здесь

person sytolk    schedule 31.03.2021

Используйте этот фрагмент кода

       GetDetailsHandler detailsHandler = new GetDetailsHandler() {
     @Override
     public void onSuccess(CognitoUserDetails cognitoUserDetails) {
        CognitoUserAttributes cognitoUserAttributes=cognitoUserDetails.getAttributes();
        stringStringHashMap=new HashMap<>();
        stringStringHashMap =cognitoUserAttributes.getAttributes();
         userNumber=stringStringHashMap.get("phone_number");
        e1.setText(userNumber);

        Log.d("Response"," Inside DEATILS HANDLER");
        // Store details in the AppHandler
        AppHelper.setUserDetails(cognitoUserDetails);
        // Trusted devices?
        handleTrustedDevice();
       // e1.setText(input.getText().toString());
         }

         @Override
          public void onFailure(Exception exception) {
        closeWaitDialog();
        showDialogMessage("Could not fetch user details!", AppHelper.formatException(exception), true);
        }
       };
     private void getDetails() {
    AppHelper.getPool().getUser(username).getDetailsInBackground(detailsHandler);
      }  
person Hitech Lab    schedule 01.08.2018
comment
Вы не можете просто вставить необъяснимый код на неуказанный язык и ожидать, что это будет полезно. - person The Unknown Dev; 13.04.2019

person    schedule
comment
Хотели бы вы дополнить свой ответ, состоящий только из кода, некоторым объяснением того, как он решит проблему OP? - person Yunnosch; 17.12.2017