我们使用com.amazonaws:aws-android-sdk-cognitoidentityprovider:2.6.8SDK进行基于用户名和密码的登录和注册流程.继这里提到的方法https://docs.aws.amazon.com/cognito/latest/developerguide/tutorial-integrating-user-pools-android.html.注册和登录过程正在按要求运行.
对于Facebook和Google通过联合进行身份验证,我们不希望为此目的使用托管UI,也不希望使用联合身份.我们曾跟随这个链接https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-identity-federation.html.
第一种方法
我们研究CognitoSyncDemo示例应用程序,它使用联合身份,因此我们不得不丢弃它.我们只是在userpool中使用联合.
第二种方法
我们使用了webview并加载了以下网址.URL将我直接带到Facebook,经过身份验证后,它会将我返回到重定向URL,其中包含access_token,auth_type,expires in和id_token.但没有刷新令牌.网址https://yourdomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?redirect_uri=redirect_app_path&response_type=code&client_id="client_id"&identity_provider=Facebook
但使用这种方法存在问题.我无法找到一种方法将访问令牌推送到管理用户会话的SDK中的cognitoUserSession.因此,每次我注册Facebook(使用webview)时,SDK中都没有会话维护.因此,我被重定向到登录视图.如何确保Facebook用户通过cognitoidentityprovider进行身份验证和签名?获取access_token和id_token时如何在SDK中创建用户会话?
第三种方法
我们尝试使用Cognito Auth Demo https://github.com/awslabs/aws-sdk-android-samples/tree/master/AmazonCognitoAuthDemo.为此,我们必须添加另一个库com.amazonaws:aws-android-sdk-cognitoauth.点击登录后,它曾经带我们去托管-ui.在查看类似的IOS项目之后,我们在android库项目中进行了调整(com.amazonaws:用于android的aws-android-sdk-cognitoauth).我们在URI中添加了identity_provider以进行登录.然后我们将我们直接带到Chrome选项卡上的Facebook.验证后,它在我们的应用程序中设置会话.但它有自己的身份验证对象,即AuthSession,但之前我们使用CogintoUserSession进行正常注册.AuthSession没有用户属性,也不提供任何获取用户详细信息或身份验证处理程序.如果我们使用这种方法,那么如何将AuthSession与CognitoUserSession链接并管理应用程序中的用户会话?
摘要
简而言之,我们已经厌倦了AWS样本,它将我们带到了基于Web的托管UI.我们需要使用联合身份识别提供商通过Facebook对用户池进行身份验证.我们需要在Cognito SDK中维护会话,而不会影响我们基于用户名和密码的登录流程.我们希望在按钮点击时直接在我们的应用程序中打开Facebook或在webview上打开Facebook,仅使用Cognito SDK对应用程序进行身份验证并在应用程序中维护会话.
我正在尝试构建一个 CloudFormation 脚本,该脚本设置 Cognito 用户池并将其配置为使用自定义电子邮件在注册过程中向用户发送他们的验证代码(即来自:noreply@mydomain.com)。
执行我的 AWS CloudFormation 脚本时出现此错误:
"ResourceStatusReason": "Cognito is not allowed to use your email identity (Service: AWSCognitoIdentityProvider; Status Code: 400; Error Code: InvalidEmailRoleAccessPolicyException;
Run Code Online (Sandbox Code Playgroud)
我附上了 Cognito 使用我的 SES 电子邮件身份的政策,例如 noreply@mydomain.com。在运行 CloudFormation 脚本之前,我已在 SES 中手动设置并验证了此电子邮件身份。
这是我的 CloudFormation 策略配置,允许 Cognito 代表我发送电子邮件,例如来自 noreply@mydomain.com:
CognitoSESPolicy:
Type: AWS::IAM::ManagedPolicy
Description: "Allow Cognito the send email on behalf of email identity (e.g. noreply@example.org)"
Properties:
PolicyDocument:
Version: 2012-10-17
Statement:
- Sid: "ucstmnt0001"
Effect: "Allow"
Action:
- "ses:SendEmail"
- "ses:SendRawEmail"
Resource: !FindInMap [ environment, !Ref "Environment", …Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-cloudformation amazon-cognito aws-userpools
我正在为我的 AWS CloudFormation 堆栈定义一个用户池,但我对属性的概念感到困惑。身份池中的每个用户都有一个自定义的不可更改的用户名,他们可以使用该用户名及其密码登录。您还可以使用其他属性来登录:
“用户名属性:确定用户注册时是否可以将电子邮件地址或电话号码指定为用户名。可能的值:phone_number 或 email。”
“别名属性:默认情况下,用户使用用户名和密码登录。用户名是用户无法更改的固定值。如果将属性标记为别名,用户可以使用该属性代替用户名登录。电子邮件地址、电话号码和首选用户名属性可以标记为别名。例如,如果选择电子邮件和电话作为用户池的别名,则该用户池中的用户可以使用其用户名、电子邮件地址或电话号码登录,以及他们的密码。”
这两种属性听起来相同,但它们都可以在 AWS 控制台和 CloudFormation 文件中单独定义。我应该使用哪一个?两者真的没有区别吗?
我想在通过Amazon Cognito 中的迁移用户 Lambda 触发器将用户从一个用户池迁移到另一个用户池时修改电子邮件地址。
在本文的帮助下,我无需操作电子邮件地址即可运行用户迁移。lambda 函数在 Node.js 12.x 环境中运行,源用户池和目标用户池都配置为使用电子邮件作为唯一的用户名属性:

我的迁移用户响应参数如下:
{
userAttributes: {
email: 'foo@bar.com', // --> the manipulated email address
email_verified: 'true'
},
finalUserStatus: 'CONFIRMED',
messageAction: 'SUPPRESS'
}
Run Code Online (Sandbox Code Playgroud)
这会导致“用户电子邮件应该为空或与用户名相同,因为用户名属性是电子邮件。” 尝试迁移(即登录)时出现错误消息。因此,我按照此消息添加了被操纵的电子邮件地址作为用户名:
{
userAttributes: {
email: 'foo@bar.com',
email_verified: 'true',
username: 'foo@bar.com'
},
...
}
Run Code Online (Sandbox Code Playgroud)
现在会导致“用户名无效或缺少电子邮件/电话号码/首选用户名属性”错误消息。根据本文档,这是预期的行为:
如果选择电子邮件作为别名,则用户名无法与有效的电子邮件格式匹配。
由于我不知道如何解决这个问题,所以我尝试了一下并更改了用户池配置,以便使用用户名和电子邮件地址进行注册:

由于上面提到的第一个响应参数现在会导致“用户名不能是电子邮件格式,因为用户池是为电子邮件别名配置的”。错误消息,我将用户名设置为源用户之一(通过AdminGetUser API 检索):
{
userAttributes: {
email: 'foo@bar.com',
email_verified: 'true',
username: user.username
},
...
}
Run Code Online (Sandbox Code Playgroud)
这再次导致“用户名无效或缺少电子邮件/电话号码/首选用户名属性”错误消息。
我已经考虑过在另一个(后续)Lambda …
我需要重新创建一个新的用户池,其设置与另一个用户池完全相同,我想知道最好的方法是什么,或者这是否是我不知道的标准方法。(也许是比使用 AWS 控制台更快的方法)
我的猜测是,使用 AWS CLI :
有什么想法吗?
我使用 AWS Cognito 设置了一个用户池,并向其中添加了 SAML 身份提供商。我还将用户直接添加到用户池中。
按照此处的文档进行操作后,我尝试通过 SP 发起的 SSO 登录。Cognito 将我重定向到已配置的 SAML IdP,系统提示我输入凭据。我进行身份验证,并且 SAML 响应被发布回 Cognito SAML ACS 端点(即 )https://<cognito auth domain>/saml2/idpresponse)。此时,Cognito 将我重定向到错误页面 ( /error?null),其中包含我在主题中提到的这个毫无帮助的错误。
我已经搜索过任何人面临的类似问题,但还没有找到任何东西(有人遇到过类似的错误,但在 AWS amplify 的上下文中,而不是在使用 SAML 时)
不知道如何调试这个;我相信我已经在 Cognito 以及 SAML IdP (Okta) 中完成了正确的配置。任何指示都会有所帮助。
有没有办法在多个条件下过滤列表用户 api 的结果。我想从列表中获取具有用户名的所有用户的列表
import boto3
client = boto3.client('cognito-idp')
client.list_users(UserPoolId='us-east-1_123456789', AttributesToGet=['email'], Filter="username =\"user_name_1\"")
Run Code Online (Sandbox Code Playgroud)
上面的代码只返回我一个用户名。现在,如果我想获取多个用户名的相同信息,我似乎找不到方法来做到这一点。
前任:
import boto3
usernames=['user_id1','user_id2']
client = boto3.client('cognito-idp')
client.list_users(UserPoolId='us-east-1_123456789', AttributesToGet=['email'], Filter="username =usernames")
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 AWS IoT 和我的 React JS 应用程序之间建立连接。
\n\n我遵循了本教程(https://medium.com/serverlessguru/serverless-real-time-reactjs-app-aws-iot-mqtt-17d023954045),但我不清楚如何将 Cognito 身份 ID 附加到AWS IoT 政策。
\n\n在我的所有调查过程中,我发现此过程必须通过命令行完成。
\n\n在上面的文章中,这些过程是通过以下命令行完成的:
\n\n\xe2\x80\xa2 请注意,此命令中必须考虑 \xe2\x80\x9cidentity_pool_id\xe2\x80\x9d。
\n\n\n\n在aws文档(https://aws-amplify.github.io/docs/js/pubsub)中,它说在命令行中写入\xe2\x80\x9cidentity_id\xe2\x80\x9d:
\n\n\n\n当我在命令行中使用 \xe2\x80\x9cidentity_pool_id\xe2\x80\x9d 并尝试从 AWS IoT 发布消息时,出现以下错误:
\n\n\n\n当我在命令行中使用 \xe2\x80\x9cidentity_id\xe2\x80\x9d 时,我可以成功执行 AWS IoT 和前端之间的通信:
\n\n\n\n问题是 \xe2\x80\x9cidentity_id\xe2\x80\x9d 对于每个用户来说都是不同的代码。考虑到我的应用程序中将有很多用户,我不知道如何执行此任务。
\n\n\xe2\x80\xa2 我是否正在执行正确的过程来考虑 \xe2\x80\x9cidentity_id\xe2\x80\x9d 而不是 \xe2\x80\x9cidentity_pool_id\xe2\x80\x9d?
\n\n\xe2\x80\xa2 如果是,每次有新用户在我的应用程序中登录时,如何自动将 Cognito ID 附加到 AWS IoT 策略?
\n\n\xe2\x80\xa2 在 AWS IoT 策略中附加数千个 Cognito 证书是否有任何问题?
\namazon-web-services amazon-cognito aws-iot aws-userpools aws-policies
我正在 AWS Cognito 中使用用户池来创建用户以及为我的 java spring-boot 应用程序的用户进行身份验证和授权,并且我已经编写了代码来从 Cognito 获取用户并且它工作正常,但我想以分页方式获取用户,并且Cognito 也提供了相同的功能,但问题是它不提供像每个 listuserrequest 那样的来回分页如果有更多用户,我将获得页面令牌,如果收到页面令牌 null 意味着它是最后一个用户块,但考虑有 10 个用户我的池中的用户,我在每次调用中设置了限制,2个用户,理想情况下它分成5页来解决我的问题是,如果我已经获取了第3页并再次想要或获取第2页的用户我怎样才能实现这一点,如果有人知道如何实现这一点,请帮忙
private List<UserDto> getAllUserPagination() {
final ListUsersRequest listUsersRequest = new ListUsersRequest()
.withUserPoolId(awsConfig.getPoolId())
.withLimit(2);
ListUsersResult listUsersResult = cognitoClient.listUsers(listUsersRequest);
final List<UserDto> users = listUsersResult.getUsers().stream()
.map(UserMapper::toUserModel)
.collect(Collectors.toList());
do {
System.out.println(listUsersResult.getPaginationToken());
listUsersRequest.setPaginationToken(listUsersResult.getPaginationToken());
listUsersResult = cognitoClient.listUsers(listUsersRequest);
users.addAll(listUsersResult.getUsers().stream()
.map(UserMapper::toUserModel)
.collect(Collectors.toList()));
System.out.println(users.toString());
} while ((Objects.nonNull(listUsersResult.getPaginationToken())));
return users;
}
Run Code Online (Sandbox Code Playgroud) 我找不到使用我的 Cognito 用户池对 Google 用户进行身份验证的 Android 代码。
这是我到目前为止所做的:
好的,下一步:在 Android 中实现登录流程。我想在我的 Android 应用程序中实现 Google 登录和用户名密码注册/登录。我能够在我的应用程序中成功实现用户名/密码注册和登录流程,方法如下:
CognitoUserPool使用我的用户池 ID 和用户客户端 ID创建一个实例signUpInBackground和getSessionInBackground的CognitoUserPool和CognitoUser分别。现在,我想启用 Google 登录。我找不到有关如何使用 CognitoUserPool 执行此操作的任何代码。我找到了使用 Cognito Identity Pool 执行此操作的代码示例。但是我还没有创建身份池,因为我可以在托管 UI 示例上使用 Google 登录,所以我很确定我不需要它。
问题:
android amazon-web-services amazon-cognito google-signin aws-userpools
amazon-cognito ×10
aws-userpools ×10
android ×2
aws-cli ×1
aws-iot ×1
aws-lambda ×1
aws-policies ×1
boto3 ×1
java ×1
saml-2.0 ×1
spring-boot ×1