AWS Api Gateway Authorizer + Cognito 用户池不工作 "message": "Unauthorized"

Posted

技术标签:

【中文标题】AWS Api Gateway Authorizer + Cognito 用户池不工作 "message": "Unauthorized"【英文标题】:AWS Api Gateway Authorizer + Cognito User Pool Not Working "message": "Unauthorized"AWS Api Gateway Authorizer + Cognito 用户池不工作 "message": "Unauthorized" 【发布时间】:2018-03-02 20:52:13 【问题描述】:

我正在尝试将 aws api 网关授权器与 cognito 用户池一起使用。当我使用 aws api 网关控制台进行测试时,它工作正常。

但是当我尝试在 api 中启用授权时,它显示"message": "Unauthorized". 请查看下面的屏幕截图

API 网关控制台屏幕截图 - 这很好用

邮递员屏幕截图 - 不工作

有人可以帮忙吗。

仅供参考,我已按照此处提到的说明进行操作 http://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html

【问题讨论】:

只是username 而不是cognito:username?我没有使用那个确切的方法,但我不确定那部分是否正确。 cognito:username 是我获得成功授权的响应。即使我也遇到了相同类型的自定义授权问题。肯定在做一些愚蠢的事情,但无法弄清楚。如果有人可以提供帮助,那就太好了.. 对不起,我把它误认为是您的代码。邮递员说响应中有 12 个标头。可以发一下吗? 另外,您应该尝试使用 AWS 开发工具包和 Cognito 开发工具包中的代码发送请求,因为 Postman 请求中可能缺少一些请求标头。最后,查看请求中的标头(来自浏览器中的检查/网络)并确保您的 AWS 策略与这些标头完全匹配,否则您将遇到 CORS 问题。请参阅:docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/… - 特别是第 4 步 抱歉耽搁了,由于项目的紧迫性,到目前为止我已经创建了一个 lambda 函数并将其指向自定义授权方。我已经按照下面的链接在 lambda 中解码了 jwt(来自 cognito 的访问令牌)。这目前工作得很好。 aws.amazon.com/blogs/mobile/…会查看你的回复并告知结果 【参考方案1】:

在我的例子中,授权码应该是id_token。我错误地使用了access_token 来代替

【讨论】:

对我来说同样的问题,同样的解决方案。谢谢! 谢谢,我也花了 2 天时间。 很高兴我一收到问题就发现了这个。奇怪的是 access_token 不是那个。 老实说,这完全令人困惑。那么 access_token 到底有什么意义呢? oauth 范围甚至不是 id_token 的一部分,所以除非它再次获取 access_token,否则我不会得到它 这里的链接解释了 access 和 id 令牌的不同之处:docs.aws.amazon.com/cognito/latest/developerguide/… 我注意到的主要区别是 access_tokens 允许我们获取用户的用户组。【参考方案2】:

以下步骤为我解决了这个问题。简而言之,AWS API Gateway 中似乎存在错误。您可以通过重新部署 API 来修复它:

    将请求验证器从 NONE 更改为 Validate Body Actions -> 部署 API -> 选择您要将其部署到的阶段。 将请求验证器从 Validate Body 更改为 NONE 重做第 2 步。

【讨论】:

就我而言,只有第 2 步成功了【参考方案3】:

我尝试了 Mathias 的解决方案,但起初并没有奏效。奇怪的是,我可以在几个小时后回到它并再次尝试,这次在部署 API 之前对我的 API 网关进行了一些其他更改。这一次它奏效了,尽管我所做的其他更改都是肤浅的。

此外,通常情况下,AWS 文档是错误的,指出您应该使用 method.response.header.Authorization。这实际上只对使用自定义身份验证的 Lambda 有效。当您使用新的 Cognito 用户池授权器时,您确实应该只使用 Authorization

    使用Authorization 而不是method.response.header.Authorization 对 API Gateway 中的资源进行表面更改 部署您的 API 并稍等片刻

-- 编辑--

我刚刚将我的堆栈转换为 Cloudformation,发现如果您使用 Cloudformation 来部署授权者,您实际上需要为令牌源指定完整的 method.response.header.Authorization。事实上,如果您不使用该格式,堆栈部署将会失败。但是,一旦部署,如果您在控制台中查看 Authorizer,它将删除 method.response.header 部分。

【讨论】:

method.response.header.Authorization 是我案例的一个关键方面。感谢您分享详细信息!【参考方案4】:

我遇到了和你一样的问题,发现我输入了错误的令牌源。

<your API> -> Authorizers -> Token Source 中输入 API 网关必须在其中查找令牌的 HTTP 标头的名称。 (在你的情况下Authorization

保存它,不要忘记在测试之前进行部署。

【讨论】:

仅供参考,我已将授权作为令牌源并部署了 API,但仍然面临同样的问题。 你是如何进行像素化的?这是一个非常酷的效果,我想知道如何在我的演示文稿中使用它 如果我没记错的话,我把它复制到了 microsoft paint,选择了区域,使区域变得非常小,然后又恢复到原来的大小。【参考方案5】:

我也遇到了同样的问题,解决办法就是重新部署项目。

【讨论】:

是的,这令人难以置信地解决了这个问题。我错误地部署了一个错误的授权者,当我更改它时,它仍然存在错误,我删除了整个堆栈并重新部署并且它起作用了。 你是最棒的。在尝试了一切之后,这简单地解决了问题。【参考方案6】:

尝试以下 3 个步骤(不要忘记部署 API)并尝试使用 POST 人发送请求

    缓存

    方法请求的设置

    部署 API

【讨论】:

【参考方案7】:

如果您没有在 API 网关的方法执行块中检查 OAuth Scopes 的范围,则只会使用 id-token

一旦您对请求设置了 OAuth 范围限制,它将开始自动获取访问令牌。

【讨论】:

【参考方案8】:

将 Authorizer 中的 Token Source 更改为 Authorization 以外的其他内容(例如:授权),然后部署 API 并在 Postman 的标头中提供它对我有用。不管我们叫什么头,我猜它都会被API网关翻译和使用。

【讨论】:

【参考方案9】:

归功于 YouTube 上的 Srce Cde 频道https://www.youtube.com/watch?v=f8rbpHf9SiA,在端点设置上添加“openid”作为 OAuth 范围,使得 access_token 可用。

请记住,这会使 id_token 无法使用。对于那些寻找 id_token 和 access_token 之间区别的人,这里是链接:https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html

【讨论】:

【参考方案10】:

在我的例子中,在查看了来自 Amplify 的示例文档之后,我认为我需要在授权标头中使用“Bearer”添加 ID 令牌。删除“Bearer”解决了我的问题(实际上是检查令牌形状。)另外,检查您的 CORS 配置!

【讨论】:

以上是关于AWS Api Gateway Authorizer + Cognito 用户池不工作 "message": "Unauthorized"的主要内容,如果未能解决你的问题,请参考以下文章

响应未定义 - aws-api-gateway-client

AWS API Gateway:用户匿名无权执行 API

AWS API Gateway 默认响应和触发 AWS Lambda

是否可以使用 AWS API 为 Lambda 函数设置 AWS API Gateway 端点?

[AWS] WebSockets with API Gateway

Aws api gateway Domain name