使用JWT和Auth0

时间:2016-05-18 14:48:58

标签: amazon-web-services jwt aws-api-gateway auth0

我在哪里

我目前正在为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?

3 个答案:

答案 0 :(得分:2)

我猜你为API网关端点启用了AWS_IAM身份验证。如果您不打算使用它,则需要禁用它。如果您计划在JWT之外使用AWS_IAM身份验证,则必须使用其他字段发送JWT令牌。

来自您关联的Auth0教程的part 5

  

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

答案 1 :(得分:1)

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

要执行API网关功能,您需要执行以下三项操作之一:

  1. auth0 example中所述,通过IAM / STS获取AWS凭据,并使用这些凭据对您的请求进行签名。
  2. Mark B's answer所述,请按照auth0教程的step 5中的说明操作,并停用AWS_IAM auth并在Lambda中进行验证。
  3. 切换到使用a custom authorizer直接在API网关层验证JWT。这将要求您使用Auth0提供的代码来验证令牌,然后构建您自己的授权程序结果。

答案 2 :(得分:-1)

(代表作者提问)

更新

Mark B和Bob Kinney都是正确的。我所做的(你可能也有)是在我在这个问题的顶部发布的各种Auth0链接中跳转并尝试使用他们的angular2-jwt库(使用AuthHttp组件)使教程适应Angular2,同时遵循以及使用AWS API Gateway设置Auth0的5个部分示例。 AuthHttp组件将自动将JWT Bearer令牌放入“Authentication”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/