我在哪里
我目前正在为AWS API网关设置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网关的状态403响应,指示Cloudfront IncompleteSignatureException;"身份验证标头缺少等号"
身份验证头是
Authentication: Bearer edJ0e...[I've truncated for brevity]
AWS是否期望使用不同类型的使用键值对的身份验证?如何告诉AWS API网关它应该寻找JWT?
我猜您已经为API网关端点启用了AWS_IAM
身份验证。如果您不打算使用它,则需要禁用它。如果您计划在JWT之外使用AWS_IAM
身份验证,则必须使用其他字段发送JWT令牌。
从您链接的Auth0教程的第5部分:
最后一步是从浏览器将JWT传递给方法客户标准方法使用
Authorization
标头作为承载令牌,如果关闭IAM,则可以使用此方法授权,并且仅依赖OpenID令牌进行授权(您还需要将Authorization标头映射到事件中传递给AWS Lambda函数的数据)。如果您正在使用IAM,那么AWS API网关使用Authorization
标头来包含消息的签名,您将通过将JWT插入此标头。您可以添加自定义JWT的头,或将其放入消息正文中。如果你选择使用自定义标头,还需要为POST方法的集成请求
根据错误消息,听起来您已经为AWS_IAM身份验证配置了API。这需要使用AWS Signature Version 4对您的请求进行签名。
为了执行API网关功能,您需要做3件事中的1件:
- 如auth0示例中所述,通过IAM/STS获取AWS凭据,并使用这些凭据对您的请求进行签名
- 如Mark B的回答中所述,按照auth0教程第5步中的说明,禁用AWS_IAM auth,并在Lambda中进行验证
- 切换为使用自定义授权器直接在API网关层验证JWT。这将需要您使用Auth0提供的代码来验证令牌,然后构建自己的authorizer结果
(代表问题作者发布)。
更新
马克B和鲍勃·金尼都是对的。我所做的(你可能也有)是跳到我在这个问题顶部发布的各种Auth0链接中,并尝试使用他们的angular2-jwt库(带有AuthHttp组件)将教程改编为angular2,同时遵循他们使用AWS API网关设置Auth0的5部分示例。AuthHttp组件将自动将JWT承载令牌放入"验证"HTTP标头中,该标头与IAM授权保护的AWS API网关调用不兼容。正如这些绅士向我展示的那样,这将在教程的第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/