AWS API Gateway - 使用具有Cognito用户池授权程序的访问令牌?

时间:2018-05-18 06:06:24

标签: oauth oauth-2.0 aws-api-gateway amazon-cognito aws-cognito

我正在配置一个应用程序,其中包含各种前端(移动和Web应用程序)和单个API后端,由Lambda提供支持并通过AWS API Gateway进行访问。

由于我计划使用Cognito对用户进行身份验证和授权,因此我在API网关上设置了Cognito用户池授权程序和几种API方法。

使用这样的架构,我的应用程序(例如iOS或Vue.js应用程序)从OAuth角度来看是客户端应用程序,而我的API网关后端是资源服务器。基于this Auth0 forum post,我似乎应该在我的客户端应用程序中使用ID令牌,并传递访问令牌以授权我的API网关资源。

当我点击Cognito /oauth2/authorize端点获取访问代码并使用该代码命中/oauth2/token端点时,我获得3个令牌 - 访问令牌,ID令牌和刷新令牌。到目前为止一切顺利,因为我应该得到我需要的东西。

这是我遇到困难的地方 - 使用API​​网关Cognito用户池授权控制台上的测试功能,我可以粘贴ID令牌并传递(在屏幕上解码令牌)。但是当我粘贴访问令牌时,我得到401 - unauthorized

在我的Cognito设置中,我仅启用了Authorization Code Grant流,emailopenid范围(这似乎是Cognito允许的最小值,因为我在尝试保存时遇到错误没有至少这些勾选的。)

我是否需要添加一些特定的范围才能让API Gateway使用访问代码授权请求?如果是,那么这些配置在哪里?

或者我错过了什么? API网关是否仅允许ID令牌与Cognito用户池授权程序一起使用?

3 个答案:

答案 0 :(得分:10)

您可以使用具有适用于ID令牌的相同授权程序的访问令牌,但在用户池和APIG中还有一些其他设置。

即使完成此额外设置,您也无法使用内置授权程序测试功能和访问令牌,只能使用ID令牌。来自AWS的典型80%解决方案!

要使用访问令牌,您需要在App Integration -> Resource Servers下的用户池中设置资源服务器,这与您使用的内容无关,但我假设您使用<site>.com作为标识符并且您拥有一个名为api的范围。

不要转到APIG中的方法并为方法输入Method Request。假设已经使用id标记测试了授权者,您可以将<site>.com/api添加到Settings -> OAuth Scopes部分。

只需添加OAuth范围,即可确保令牌现在必须是访问令牌,并且不再接受ID令牌。

详情请参阅:https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-enable-cognito-user-pool.html

答案 1 :(得分:0)

是的,API Gateway只会使用idToken进行授权。

用户输入正确的凭据后,身份提供商提供访问代码,授权用户输入正确的凭据,并且此访问代码由 客户端只是为了从给定用户的/oauth2/token端点获取idToken和refreshToken。所有进一步的调用只会在Authorization标头中使用idToken。

即使访问代码在您检索用户令牌后过期。

答案 2 :(得分:0)

对于那些寻找答案但不使用OAuth并使用无服务器框架进行部署的人:

让APGW接受accessToken的工作对我来说是如下修改我的serverless.yml文件:

functions:
  my-function:
    handler: path to source file
    events:
      - http:
          path: my-function
          method: post
          cors: true
          authorizer:
            type: COGNITO_USER_POOLS
            scopes:
              - YOUR SCOPE HERE <- THIS IS THE TRICK
            authorizerId:
              Ref: ApiGatewayAuthorizer

可以通过读取accessToken的内容(通过将令牌粘贴到https://jwt.io/调试器中)来找到范围的值。