标签: aws-userpools

将社交身份联合用户身份验证到AWS Userpool? - Android

我们使用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.

  1. 我们已经设置了具有应用程序客户端和用户池域的用户池.
  2. 将Facebook设置为社交身份提供商.
  3. 添加了android回调URL到手机.

第一种方法

我们研究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对应用程序进行身份验证并在应用程序中维护会话.

android facebook-login amazon-cognito aws-userpools

6
推荐指数
1
解决办法
461
查看次数

AWS CloudFormation 脚本失败 - Cognito 不允许使用您的电子邮件身份

我正在尝试构建一个 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

6
推荐指数
1
解决办法
1455
查看次数

AWS Cognito 中的用户名属性和别名属性有什么区别?

我正在为我的 AWS CloudFormation 堆栈定义一个用户池,但我对属性的概念感到困惑。身份池中的每个用户都有一个自定义的不可更改的用户名,他们可以使用该用户名及其密码登录。您还可以使用其他属性来登录:

  • “用户名属性:确定用户注册时是否可以将电子邮件地址或电话号码指定为用户名。可能的值:phone_number 或 email。”

  • “别名属性:默认情况下,用户使用用户名和密码登录。用户名是用户无法更改的固定值。如果将属性标记为别名,用户可以使用该属性代替用户名登录。电子邮件地址、电话号码和首选用户名属性可以标记为别名。例如,如果选择电子邮件和电话作为用户池的别名,则该用户池中的用户可以使用其用户名、电子邮件地址或电话号码登录,以及他们的密码。”

这两种属性听起来相同,但它们都可以在 AWS 控制台和 CloudFormation 文件中单独定义。我应该使用哪一个?两者真的没有区别吗?

amazon-web-services amazon-cognito aws-userpools

6
推荐指数
1
解决办法
6681
查看次数

如何在 AWS Cognito 中的 Migrate User Lambda 触发器中操作电子邮件地址

我想在通过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 …

amazon-cognito aws-lambda aws-userpools

6
推荐指数
0
解决办法
831
查看次数

复制现有 Cognito 用户池的最佳方法是什么

我需要重新创建一个新的用户池,其设置与另一个用户池完全相同,我想知道最好的方法是什么,或者这是否是我不知道的标准方法。(也许是比使用 AWS 控制台更快的方法)

我的猜测是,使用 AWS CLI :

有什么想法吗?

amazon-web-services aws-cli amazon-cognito aws-userpools

6
推荐指数
1
解决办法
3041
查看次数

Amazon Cognito:登录选项不可用。请尝试另一个

我使用 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) 中完成了正确的配置。任何指示都会有所帮助。

amazon-web-services saml-2.0 amazon-cognito aws-userpools

6
推荐指数
1
解决办法
2400
查看次数

aws身份池过滤器在多个条件下列出用户api

有没有办法在多个条件下过滤列表用户 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)

amazon-web-services amazon-cognito boto3 aws-userpools

5
推荐指数
1
解决办法
9443
查看次数

如何将 Cognito 身份 ID 附加到 AWS IoT 策略?

我正在尝试在 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 证书是否有任何问题?

\n

amazon-web-services amazon-cognito aws-iot aws-userpools aws-policies

5
推荐指数
1
解决办法
1812
查看次数

aws cognito get 用户中的分页

我正在 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)

java spring-boot amazon-cognito aws-userpools

5
推荐指数
0
解决办法
1320
查看次数

在 Android 上使用 Google 身份提供程序进行 Cognito 用户池身份验证

概括:

我找不到使用我的 Cognito 用户池对 Google 用户进行身份验证的 Android 代码。

细节:

这是我到目前为止所做的:

  1. 在该用户池中创建了 Cognito 用户池和用户客户端
  2. 在 Google Console 中创建了一个 Google Web App
  3. 在我的 Cognito 用户池中将 Google 配置为联合身份提供商(提供 Google 客户端 ID 和机密)
  4. 从 AWS 控制台尝试托管 UI 并验证我能够使用我的 Google 凭证登录,用户将在用户池中创建。

好的,下一步:在 Android 中实现登录流程。我想在我的 Android 应用程序中实现 Google 登录和用户名密码注册/登录。我能够在我的应用程序中成功实现用户名/密码注册和登录流程,方法如下:

  1. CognitoUserPool使用我的用户池 ID 和用户客户端 ID创建一个实例
  2. 我使用的方法signUpInBackgroundgetSessionInBackgroundCognitoUserPoolCognitoUser分别。

现在,我想启用 Google 登录。我找不到有关如何使用 CognitoUserPool 执行此操作的任何代码。我找到了使用 Cognito Identity Pool 执行此操作的代码示例。但是我还没有创建身份池,因为我可以在托管 UI 示例上使用 Google 登录,所以我很确定我不需要它。

问题:

  1. 我真的需要身份池才能在我的 Android 应用程序上启用 Google 登录吗?为什么?
  2. 如果没有,是否有任何代码示例显示如何使用 …

android amazon-web-services amazon-cognito google-signin aws-userpools

5
推荐指数
0
解决办法
306
查看次数