# machine-to-machine authorization

Amazon Cognito 是一项以开发人员为中心且注重安全性的客户身份与访问管理（CIAM）服务，能够简化在移动和 Web 应用程序中添加用户注册、登录和访问控制的流程。Cognito 是一项高可用性服务，支持多种使用场景，从管理用户身份验证和授权，到启用对您的 API 和工作负载的安全访问。它是一项托管服务，可以作为应用程序的身份提供商（IdP），能够扩展到数百万用户，提供高级安全功能，并支持与第三方 IdP 的身份联合。

Amazon Cognito 其中的一个功能就是支持 [OAuth 2.0 client credentials grants](https://datatracker.ietf.org/doc/html/rfc6749#section-1.3.4), 用于机器对机器（M2M）授权。随着您的 M2M 使用案例的扩展，拥有适当的监控、优化令牌发放以及了解安全最佳实践和注意事项变得非常重要。应用程序客户端在令牌仍然有效且未过期的情况下，本地缓存并重用访问令牌是一种最佳实践。您可以自定义发放的令牌的有效时长，因此确保该时间范围符合您的安全要求非常重要。如果在客户端级别无法缓存和重用访问令牌，或者无法强制执行，那么将您的机器对机器（M2M）使用案例与使用  [Amazon API Gateway](https://aws.amazon.com/api-gateway/)  的 REST API 代理集成结合起来，可以实现 [cache token responses](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-caching-tokens.html)。通过使用 API Gateway 缓存，您可以优化 M2M 授权中访问令牌的请求和响应。这减少了对 Cognito 获取访问令牌的冗余调用，从而提高了您的 M2M 使用案例的整体性能、可用性和安全性。

在本文中，我们探讨了如何监控、优化和保护 Amazon Cognito 机器对机器（M2M）授权的策略。首先，您将了解一些有效的监控技术，以便跟踪您的使用情况；然后，我们将深入探讨使用 API Gateway 和令牌缓存的优化策略；最后，我们将介绍安全最佳实践和注意事项，以增强您的 M2M 使用案例的安全性。让我们深入研究，发现如何充分利用您的 Amazon Cognito M2M 实施。

## Machine-to-machine authorization <a href="#machine-to-machine-authorization" id="machine-to-machine-authorization"></a>

Amazon Cognito 使用  [OAuth 2.0 client credentials grant](https://datatracker.ietf.org/doc/html/rfc6749#section-1.3.4) 来处理机器对机器（M2M）授权。Cognito 用户池可以发放客户端 ID 和客户端密钥，允许您的服务请求一个符合 JSON Web Token（JWT）标准的访问令牌，以访问受保护的资源。图 1 展示了应用程序客户端如何使用客户端凭证授权流程向 Amazon Cognito 请求访问令牌。

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2FNpjdRs0vb0MuVHuqaEMB%2Fimage.png?alt=media&#x26;token=f7a913e2-c701-4c21-b862-6fe164a16c23" alt=""><figcaption><p>Figure 1: Client credentials grant flow</p></figcaption></figure>

客户端凭证授权流程（图 1）包括以下步骤：

1. 应用程序客户端向 Amazon Cognito 用户池的 `/token` 端点发起 HTTP POST 请求（有关更多信息，请参阅《 [The token issuer endpoint](https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html)》），该请求提供一个包含客户端 ID 和客户端密钥的授权头，以及包含授权类型、客户端 ID 和作用域的请求参数。
2. 在验证请求后，Cognito 将返回一个符合 JSON Web Token（JWT）标准的访问令牌。
3. 客户端可以使用 Cognito 发放的访问令牌，向下游资源服务器发起后续请求。
4. 资源服务器从 Cognito 用户池获取 JSON Web Key Set（JWKS）。JWKS 包含用户池的公钥，应使用这些公钥来验证令牌签名。
5. 资源服务器使用公钥验证访问令牌的签名是否有效（证明令牌未被篡改）。资源服务器还需要验证令牌是否未过期，以及是否存在所需的声明和值，包括作用域。资源服务器应使用  [aws-jwt-verify library](https://github.com/awslabs/aws-jwt-verify) 来验证访问令牌是否有效。
6. 在验证访问令牌并授权应用程序客户端后，请求的资源将返回给应用程序客户端。

您可以在《 [How to use OAuth 2.0 in Amazon Cognito: Learn about the different OAuth 2.0 grants](https://aws.amazon.com/blogs/security/how-to-use-oauth-2-0-in-amazon-cognito-learn-about-the-different-oauth-2-0-grants/).》中了解 Amazon Cognito 支持的客户端凭证授权和其他认证流程的 OAuth 2.0 支持。

## 监控用量和成本 <a href="#monitoring-usage-and-costs" id="monitoring-usage-and-costs"></a>

M2M功能是收费的， [Amazon Cognito introduces tiered pricing for machine-to-machine (M2M) usage](https://aws.amazon.com/about-aws/whats-new/2024/05/amazon-cognito-tiered-pricing-m2m-usage/)

为了更好地了解您现有的 Amazon Cognito 使用情况，您可以使用成本和使用情况仪表板操作解决方案[Cost and Usage Dashboards Operations Solution (CUDOS)](https://catalog.us-east-1.prod.workshops.aws/workshops/86d8a62a-7714-40be-b0a2-98b6531388e5/en-US/dashboards/foundational/cudos-cid-kpi/#cudos-dashboard) 的安全性 [Security](https://cid.workshops.aws.dev/demo?dashboard=cudos\&sheet=security) 标签页。CUDOS 仪表板是 [Cloud Intelligence Dashboard](https://wellarchitectedlabs.com/cloud-intelligence-dashboards/) 的一部分，这是一个开源框架，为 AWS 客户提供组织级别的可操作见解和优化机会。如图 2 所示，CUDOS 仪表板的安全性标签页提供了可视化图表，显示了按使用类型划分的 Amazon Cognito 成本和支出，以及在豁免期结束后，按日粒度计算的 M2M 应用程序客户端和令牌请求的预计成本。这种按日细分的方式使您能够跟踪您的成本优化工作趋势

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2FXmQAIi7lE9l0VTA7qVEf%2Fimage.png?alt=media&#x26;token=c700718e-353d-422f-af82-3eb5c4dbde68" alt=""><figcaption><p>Figure 2: Example Amazon Cognito spend and projected cost with daily granularity</p></figcaption></figure>

也可以按照账户查看每月的费用情况，如图3所示：

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2FPboSpEGDiZd5hkLGYz0n%2Fimage.png?alt=media&#x26;token=3096b5d7-5c59-4634-9941-d4b3e95bcc1a" alt=""><figcaption></figcaption></figure>

您可以查看图4中显示的用户池的每个资源ID的使用情况和支出。这种资源级别的细粒度数据使您能够识别支出最高的用户池，并据此优先考虑使用和成本管理的工作。该仪表板的交互式演示是可用的。更多信息，请参阅[云智能仪表板](https://wellarchitectedlabs.com/cloud-intelligence-dashboards/)。

参考资料

AWS Blog - [How to monitor, optimize, and secure Amazon Cognito machine-to-machine authorization](https://aws.amazon.com/blogs/security/how-to-monitor-optimize-and-secure-amazon-cognito-machine-to-machine-authorization/)
