AWS API Gateway 身份验证错误 IncompleteSignatureException 使用带有 Auth0 的 JWT

Posted

技术标签:

【中文标题】AWS API Gateway 身份验证错误 IncompleteSignatureException 使用带有 Auth0 的 JWT【英文标题】:AWS API Gateway authentication error IncompleteSignatureException using JWT with Auth0 【发布时间】:2016-09-15 03:31:09 【问题描述】:

我在哪里

我目前正在为 AWS API Gateway 设置 Auth0 委托身份验证。我遵循了以下文档和教程,但我有一个应用程序而不是他们的示例应用程序:

https://auth0.com/docs/quickstart/spa/angular2/aws

https://auth0.com/blog/2015/11/10/introducing-angular2-jwt-a-library-for-angular2-authentication/

https://auth0.com/docs/client-platforms/angular2

https://auth0.com/docs/integrations/aws-api-gateway/part-2

什么工作

从我的 Angular2 应用程序进行的 Auth0 登录工作正常,我正在获取令牌。 当我调用 AWS API 网关时,Auth0 的 AuthHttp 组件将持有者令牌附加到 Authenticate 标头。

什么不工作

来自 AWS API Gateway 的状态 403 响应,指示 Cloudfront IncompleteSignatureException; “身份验证标头缺少等号”。

认证头是

Authentication: Bearer edJ0e...[I've truncated for brevity]

AWS 是否可以期待使用键值对的不同类型的身份验证?如何告诉 AWS API Gateway 它应该在寻找 JWT?

【问题讨论】:

【参考方案1】:

我猜您已经为您的 API Gateway 端点启用了AWS_IAM 身份验证。如果您不打算使用它,则需要禁用它。如果您计划在 JWT 之外使用 AWS_IAM 身份验证,那么您必须使用不同的字段发送 JWT 令牌。

来自您链接的 Auth0 教程的 part 5:

最后一步是将 JWT 从浏览器传递给方法 客户。标准方法是使用 Authorization 标头作为 不记名令牌,如果您关闭 IAM,您可以使用此方法 授权并仅依靠 OpenID 令牌进行授权 (您还需要将 Authorization 标头映射到事件中 传递给 AWS Lambda 函数的数据)。如果您使用的是 IAM,那么 AWS API Gateway 使用 Authorization 标头来包含 消息的签名,您将通过以下方式破坏身份验证 将 JWT 插入此标头。您可以添加自定义 JWT 的标头,或将其放入消息的正文中。如果你 选择使用自定义标头,您还需要为 POST方法的集成请求

【讨论】:

【参考方案2】:

根据错误消息,您似乎已经为 AWS_IAM 身份验证配置了 API。这需要使用AWS Signature Version 4 签署您的请求。

为了执行 API 网关功能,您需要做 3 件事中的 1 件事:

    通过 IAM/STS 获取 AWS 凭证,如 auth0 example 中所述,并使用这些凭证签署您的请求。 如 Mark B's answer 中所述,按照 auth0 教程的 step 5 中的说明,禁用 AWS_IAM 身份验证并在您的 Lambda 中进行验证。 改用a custom authorizer直接在API网关层验证JWT。这将要求您使用 Auth0 提供的代码来验证令牌,然后构建您自己的授权结果。

【讨论】:

【参考方案3】:

(代表问题作者发布).

更新

Mark B 和 Bob Kinney 都是正确的。我所做的(你可能也有)是在我在这个问题顶部发布的各种 Auth0 链接中跳来跳去,并尝试使用他们的 angular2-jwt 库(带有 AuthHttp 组件)来使教程适应 Angular2,同时遵循以及他们使用 AWS API Gateway 设置 Auth0 的 5 部分示例。 AuthHttp 组件将自动将 JWT Bearer 令牌放入“身份验证”HTTP 标头中,这与由 IAM 授权保护的 AWS API Gateway 调用不兼容。正如这些男士向我展示的那样,本教程的第 5 部分对此进行了解释。如果您只完成了第 4 部分并且它无法正常工作,希望这能像我一样回答您的问题。

更新 2

已更新 Auth0 Angular2 教程以反映 Angular2 rc 1。https://auth0.com/blog/2015/05/14/creating-your-first-real-world-angular-2-app-from-authentication-to-calling-an-api-and-everything-in-between/

【讨论】:

以上是关于AWS API Gateway 身份验证错误 IncompleteSignatureException 使用带有 Auth0 的 JWT的主要内容,如果未能解决你的问题,请参考以下文章

AWS Cognito 和 AWS API Gateway 中的用户管理和基于令牌的身份验证

CloudFront 后面的 API Gateway 不支持 AWS_IAM 身份验证吗?

如何使用 AWS API Gateway 设置 OAuth2 身份验证提供程序?

如何在 AWS API Gateway 中调试“缺少身份验证令牌”?

AWS API Gateway 身份验证(Cognito 与自定义授权者)

如何针对我的 AWS Api Gateway 对后端服务进行身份验证