如何使用 Cognito 身份 ID 获取用户属性(用户名、电子邮件等)
How to get user attributes (username, email, etc.) using cognito identity id
我将 AWS Cognito 身份池配置为使用 Cognito 用户池作为身份验证提供程序。
假设我在 Cognito 身份池中有一个身份的身份 ID(例如 us-east-1:XXaXcXXa-XXXX-XXXX-XXX-XXXXXXXXXXXX),其中这个身份有一个链接到 Cognito 用户池中用户的登录。
如何使用身份 ID 获取链接的用户详细信息(电子邮件、phone、用户名)?
您与 Cognito 联合身份服务交换以获取身份 ID 和凭据的 ID 令牌已具有所有用户属性。您不需要额外调用任何服务。
它是一个 JWT 令牌,您可以使用客户端上的任何库来解码这些值。您可以阅读 this guide 了解有关 Cognito 用户池出售的令牌的更多信息。
或者,您也可以使用访问令牌调用 GetUser API,这将 return 所有用户信息。
console.log('username is ' + cognitoUser.getUsername());
使用这段代码
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);
}
我遇到了类似的问题,经过太多的抓挠,我无法找到提取细节的确切方法。我的用例是在 android APP 中获取详细信息。
在查看了他们的 AWSMobile 客户端 API 代码之后。我在下面找到了,它正在为我工作。
Log.i(TAG, "User Details"+ AWSMobileClient.getInstance().getUserAttributes().toString());
建议 - 尝试使用 AWSMobileclient,以防您将其用于 Android 开发,因为这是推荐用于开发的新库。
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\""
这还需要用户池 ID,我怀疑您有。此外,我不知道这是如何实现的,也不知道它在过滤大量用户时的表现如何,但我认为自定义属性在过滤器中不可用,这暗示幕后有某种形式的索引。
使用 REST API
AccessToken
认为这可能对某些人非常有帮助,因为我花了很多时间试图弄清楚如何仅使用 accessToken
和 region
来获得 UserAttributes
(类似this 但使用 REST API(不使用 aws-sdk)
您可以使用此 HTTP 请求获得 UserAttributes
和 accessToken
。 ( 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": "xxxx@gmail.com"
}
],
"Username": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"
}
只是为此苦苦挣扎了一段时间,我使用 Java API 获取用户名的方式是:
identityManager.login(this, new DefaultSignInResultHandler() {
@Override
public void onSuccess(Activity activity, IdentityProvider identityProvider) {
...
String userName = ((CognitoUserPoolsSignInProvider) identityProvider).getCognitoUserPool().getCurrentUser().getUserId();
有一个我们可以初始化的侦听器,它将侦听我们身份验证状态的变化,并允许我们访问发生的身份验证事件的类型,并根据该数据更新应用程序状态。
有了 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);
}
});
对于那些正在寻找如何以编程方式在 Java 中获取电子邮件参数值的人
我假设您已经知道如何从池中获取所需/所有用户。
假设我有 ListUsersResult
与我的所有用户并说我想检查第一个用户的电子邮件值:
ListUsersResult allUsers = getAllUsers();
UserType userType = allUsers.getUsers().get(0);
首先我可以得到用户的所有属性:
List<AttributeType> attributes = userType.getAttributes();
然后循环查找我们感兴趣的属性(我们的案例 email
):
for (AttributeType att : attributes) {
if (att.getName().equals("email")) {
// do whatever you want
}
}
请记住,打印到控制台很可能无法工作,因为它是敏感数据。但是你可以这样比较:
att.getValue().equals("mymail@mail")
我将 AWS Cognito 身份池配置为使用 Cognito 用户池作为身份验证提供程序。
假设我在 Cognito 身份池中有一个身份的身份 ID(例如 us-east-1:XXaXcXXa-XXXX-XXXX-XXX-XXXXXXXXXXXX),其中这个身份有一个链接到 Cognito 用户池中用户的登录。
如何使用身份 ID 获取链接的用户详细信息(电子邮件、phone、用户名)?
您与 Cognito 联合身份服务交换以获取身份 ID 和凭据的 ID 令牌已具有所有用户属性。您不需要额外调用任何服务。
它是一个 JWT 令牌,您可以使用客户端上的任何库来解码这些值。您可以阅读 this guide 了解有关 Cognito 用户池出售的令牌的更多信息。
或者,您也可以使用访问令牌调用 GetUser API,这将 return 所有用户信息。
console.log('username is ' + cognitoUser.getUsername());
使用这段代码
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);
}
我遇到了类似的问题,经过太多的抓挠,我无法找到提取细节的确切方法。我的用例是在 android APP 中获取详细信息。 在查看了他们的 AWSMobile 客户端 API 代码之后。我在下面找到了,它正在为我工作。
Log.i(TAG, "User Details"+ AWSMobileClient.getInstance().getUserAttributes().toString());
建议 - 尝试使用 AWSMobileclient,以防您将其用于 Android 开发,因为这是推荐用于开发的新库。
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\""
这还需要用户池 ID,我怀疑您有。此外,我不知道这是如何实现的,也不知道它在过滤大量用户时的表现如何,但我认为自定义属性在过滤器中不可用,这暗示幕后有某种形式的索引。
使用 REST API
AccessToken
认为这可能对某些人非常有帮助,因为我花了很多时间试图弄清楚如何仅使用 accessToken
和 region
来获得 UserAttributes
(类似this 但使用 REST API(不使用 aws-sdk)
您可以使用此 HTTP 请求获得 UserAttributes
和 accessToken
。 ( 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": "xxxx@gmail.com"
}
],
"Username": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"
}
只是为此苦苦挣扎了一段时间,我使用 Java API 获取用户名的方式是:
identityManager.login(this, new DefaultSignInResultHandler() {
@Override
public void onSuccess(Activity activity, IdentityProvider identityProvider) {
...
String userName = ((CognitoUserPoolsSignInProvider) identityProvider).getCognitoUserPool().getCurrentUser().getUserId();
有一个我们可以初始化的侦听器,它将侦听我们身份验证状态的变化,并允许我们访问发生的身份验证事件的类型,并根据该数据更新应用程序状态。
有了 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);
}
});
对于那些正在寻找如何以编程方式在 Java 中获取电子邮件参数值的人
我假设您已经知道如何从池中获取所需/所有用户。
假设我有 ListUsersResult
与我的所有用户并说我想检查第一个用户的电子邮件值:
ListUsersResult allUsers = getAllUsers();
UserType userType = allUsers.getUsers().get(0);
首先我可以得到用户的所有属性:
List<AttributeType> attributes = userType.getAttributes();
然后循环查找我们感兴趣的属性(我们的案例 email
):
for (AttributeType att : attributes) {
if (att.getName().equals("email")) {
// do whatever you want
}
}
请记住,打印到控制台很可能无法工作,因为它是敏感数据。但是你可以这样比较:
att.getValue().equals("mymail@mail")