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

Posted

技术标签:

【中文标题】我如何从 AWS Cognito Api 获取机器对机器的令牌【英文标题】:How would I get Tokens from AWS Cognito Api for machine to machine 【发布时间】:2018-12-08 19:40:51 【问题描述】:

我正在尝试通过 Cognito API 获取令牌,但失败了。我已经阅读了他们的网站,但我很难通过他们模糊的例子。

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

通过查看文档,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 指出我需要获取一个身份验证码,它又回到了上一段我写的关于授权端点。

谢谢, 凯莉

【问题讨论】:

我现在正在与 aws 合作解决这个问题。它是一个总的痛苦和捕获 22 将报告回来 【参考方案1】:

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

要使这项工作正常运行,您需要在设置用户池之后为您的服务器到服务器连接添加一个应用客户端。在用户池中转到应用客户端

并添加一个应用程序客户端,例如“我的后端服务 1”

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

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

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

然后在“应用程序集成”下转到资源服务器并添加您要访问的资源服务器(应用程序客户端中定义的服务将是成功认证后要访问此资源服务器的服务器) 还要在此处添加一些范围,因为在 api 调用中将需要它(例如,weather.read 如占位符所示)

现在您已经完成了测试端点的所有设置,例如在邮递员中: 仔细检查标题,并确保在正文中设置了这些键: 对于 Authorization 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

【讨论】:

【参考方案2】:

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

【讨论】:

你能告诉具体是哪个API吗? 嗨@Deepthi,亚马逊在他们的 SDK 之间有大量的变化,比如 javascript、.NET、Java 等……这些 SDK 可以在这里找到:aws.amazon.com/tools。同样,他们的文档描述了取决于您选择的语言 SDK 的过程。这很容易实现。我想说最棘手的策略与 挑战 有关,例如,当您需要在身份验证期间响应强制密码更改时。希望这有助于指导您找到您选择的 SDK。 感谢@kellythedev 的回复。我最近发现没有 Java SDK 可以交换令牌的授权码。它仅适用于 androidios 和 javascript。 不,他们有一个。 docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/index.html 我的意思是,没有专门用于将代码交换为令牌的方法。当然还有SDK。抱歉不清楚。【参考方案3】:

这适用于托管 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 Api 获取机器对机器的令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在 API 网关上的 cognito 授权方保护的 lambda 函数中获取 AWS Cognito 用户数据

如何从 c# 中的 aws cognito 获取用户属性

如何从 AWS cognito 授权代码获取访问和刷新令牌

AWS Cognito - 如何从令牌对象获取用户组

如何在 Go 中验证来自 AWS Cognito 的 JWT 令牌?

使用 AWS Cognito 保护 REST API