# APP认证系统：Amazon Cognito最佳实践

Amazon Cognito是APP的认证系统，你可以通过集成Amazon Cognito到你的APP中，从而快速实现APP的注册和登录功能。Amazon Cognito提供了一个可扩展到数百万用户的身份存储，支持社交平台的身份联合和企业身份联合，并提供先进的安全功能来保护您的消费者和业务。Amazon Cognito建立在开放的身份标准之上，支持各种合规法规，并与前端和后端开发资源整合。

想象一下，您正在创建一个访问 AWS 资源的移动APP，例如一个在移动设备上运行的游戏，并使用 Amazon S3 和 DynamoDB 存储玩家和得分信息。

在编写此类应用程序时，您会向 AWS 服务发出请求，这些请求必须使用 AWS 访问密钥签名。但是，我们强烈建议您不要在设备的应用程序中嵌入或分发长期 AWS 凭据，即使是做了加密存储也是如此。相反，在构建APP时，应使其在需要时，使用网络身份联合动态请求临时 AWS 安全凭据。提供的临时凭据映射到 AWS 角色，该角色只拥有执行移动应用程序所需任务的权限。

有了网络身份联合，你就不需要创建自定义登录代码或管理自己的用户身份。相反，您应用程序的用户可以使用知名的外部身份提供商（IdP）登录，如登录亚马逊、Facebook、谷歌或任何其他兼容 [OpenID Connect (OIDC) ](https://openid.net/developers/how-connect-works/)的 IdP。他们可以收到一个身份验证令牌，然后将该令牌交换为 AWS 中的临时安全凭证，该凭证映射到具有使用 AWS 账户中资源权限的 IAM 角色。使用 IdP 可以帮助您保证 AWS 账户的安全，因为您不必在应用程序中嵌入和分发长期安全凭证。

在大多数情况下，我们建议您使用 [Amazon Cognito](https://aws.amazon.com/cognito/)，因为它可以充当身份代理，为您完成大部分联合工作。有关详情，请参阅下一节 "[在移动应用程序中使用 Amazon Cognito](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc_cognito.html)"。

如果不使用 Amazon Cognito，则必须编写与 Facebook 等网络 IdP 交互的代码，然后调用 AssumeRoleWithWebIdentity API，将从这些 IdP 获取的身份验证令牌换成 AWS 临时安全凭证。如果您已经在现有应用程序中使用了这种方法，则可以继续使用。

* [Using Amazon Cognito for mobile apps](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc_cognito.html)
* [Using web identity federation API operations for mobile apps](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc_manual.html)
* [Identifying users with web identity federation](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc_user-id.html)
* [Additional resources for web identity federation](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc_resources.html)

## 1# 结合ALB认证用户

文档地址：<https://docs.aws.amazon.com/elasticloadbalancing/latest/application/listener-authenticate-users.html#cognito-requirements>

假设你开发了一个web应用，你的用户需要从公网访问，并且应用还未开发身份认证体系。此时，可以通过将应用部署在ALB后面，通过使用Amazon Cognito作为ALB的认证。以便您可以专注于应用程序的业务逻辑，而不是系统认证的开发。Amazon Cognito支持以下认证方式：

* <mark style="color:orange;">OpenID Connect（OIDC）的身份提供者（IdP）</mark>认证用户。
* 亚马逊Cognito支持的用户池，通过<mark style="color:orange;">亚马逊、Facebook或谷歌等社交IdP</mark>认证用户。
* <mark style="color:orange;">企业身份认证用户</mark>，使用SAML、LDAP或Microsoft AD，通过Amazon Cognito支持的用户池。

## 参考资料

\[blog] [Implement step-up authentication with Amazon Cognito, Part 1: Solution overview](https://aws.amazon.com/blogs/security/implement-step-up-authentication-with-amazon-cognito-part-1-solution-overview/)

\[blog] [Implement step-up authentication with Amazon Cognito, Part 2: Deploy and test the solution](https://aws.amazon.com/blogs/security/implement-step-up-authentication-with-amazon-cognito-part-2-deploy-and-test-the-solution/)

\[blog] [How to configure Duo multi-factor authentication with Amazon Cognito](https://aws.amazon.com/blogs/security/how-to-configure-duo-multi-factor-authentication-with-amazon-cognito/)

\[blog][Simplify web app authentication: A guide to AD FS federation with Amazon Cognito user pools](https://aws.amazon.com/blogs/security/simplify-web-app-authentication-a-guide-to-ad-fs-federation-with-amazon-cognito-user-pools/)

\[github] [How to implement Step-up Authentication using Amazon Cognito](https://github.com/aws-samples/step-up-auth)

\[github] [Amazon Cognito Passwordless Auth](https://github.com/aws-samples/amazon-cognito-passwordless-auth)
