我如何从 AWS Cognito Api 获取机器到机器的令牌

How would I get Tokens from AWS Cognito Api for machine to machine

我试图通过 Cognito API 获取令牌,但失败了。我已经通读了他们的网站,但我很难理解他们含糊不清的例子。

我的目标是在 api 上进行第 3 部分服务 运行 监控测试,这需要它进行身份验证并获取身份令牌和访问令牌。我正在使用 Cognito 的 yes/no 部分,它们是用户池(最简单的一组)。

通过查看文档,https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-reference.html,我不太了解流程。

如果我检查授权端点,它将使用 http GET 方法访问 UI 供个人手动输入信息。 (文档:https://docs.aws.amazon.com/cognito/latest/developerguide/authorization-endpoint.html

查看令牌端点,似乎我可以进行机器对机器操作,但它开始变得奇怪,因为文档 https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html 指出我需要获取身份验证代码,这又回到了我写的关于授权端点的上一段。

谢谢, 凯利

这适用于托管 UI。我验证了并且有效。

1) 当我使用用户名和密码验证 google 或 Cognito 时,我被重定向到我的网页。注意我使用 response_type=code 而不是 response_type=token

https://test.auth.us-east-1.amazoncognito.com/login?response_type=code&client_id=3e0\j9m&redirect_uri=http://localhost:4200

2) 这是重定向后的 url:

   http://localhost:4200/?code=66dbcb-4ab1-a3c9-]cb7091

3) 这是 curl 但只需在您的 js 代码中执行此操作,但您首先发出请求以获取 id_oken、access_token 和刷新令牌

curl -H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code&client_id=3e0duagpcsh2ga6ddn&redirect_uri=http://localhost:4200" \
-X POST https://test.auth.us-east-1.amazoncognito.com/oauth2/token

4) 当令牌即将过期时,您可以调用下面的代码。您将获得新的 id_token 和 access_token,但不会获得刷新令牌。

curl -H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=refresh_token&client_id=3e0duagpcsh2dnne5r8j9m&refresh_token=eyJjdHkiOiJKV1QiLCJlbmMiOiJBMjU2R....
-X POST https://test.auth.us-east-1.amazoncognito.com/oauth2/token

我发现真正做到这一点的唯一方法是使用 AWS Cognito SDK 创建 API。我查看了 ETL 策略的详细信息,SDK 是最简单的解决方案。

回答有点晚,但最近有同样的问题。实际上有一些文档可用于此用例,但可能不完整。所以我们正在寻找的是: https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html

要实现此功能,您需要在设置用户池后为您的服务器到服务器连接添加一个应用程序客户端。在用户池中转到应用客户端

并添加一个应用程序客户端,例如“myBackendService1”

您可以为每个用户池添加多个应用程序客户端,因此您可能已经为 SPA 前端添加了另一个应用程序客户端,或者您想为不同的后端服务添加多个。

现在,应用程序客户端设置中的重要部分是启用了“生成客户端密码”——之后您无法更改它!

接下来您需要设置您的域,您可以在其中从 aws 文档中描述的端点获取令牌:

然后在“App集成”下的资源服务器中添加你要访问的资源服务器(App Client中定义的服务将是授权成功后要访问该资源服务器的服务器) 还要在此处添加一些范围,因为 api 调用中需要它(例如占位符中显示的 weather.read)

现在您已完成所有设置以测试您的端点,例如在邮递员中: 仔细检查 Header 并确保在 Body 中设置了这些键: 对于授权 Header 键,确保 Base64Encode(client_id:client_secret).

然后你应该得到这样的回复

您现在可以在您的资源服务器中验证此令牌,例如这里:How to verify JWT from AWS Cognito in the API backend? 或在这里: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html