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

H O*_*H O 6 oauth oauth-2.0 amazon-cognito aws-api-gateway aws-cognito

我正在配置具有各种前端(移动和Web应用程序)和单个API后端的应用程序,由Lambda提供支持并通过AWS API Gateway访问.

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

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

当我打的Cognito /oauth2/authorize终点获得接入码,然后使用该代码打/oauth2/token终点,我得到3个令牌-一个访问令牌,一个ID令牌和刷新令牌.到目前为止一切顺利,因为我应该拥有我需要的东西.

这是我碰到的困难-使用API网关Cognito用户池授权者控制台上的测试功能,我可以在ID令牌粘贴,并将其传递(屏幕令牌解码).但是当我粘贴Access Token时,我得到了401 - unauthorized.

在我Cognito的设置,我已经启用了Authorization Code Grant止流,与emailopenid范围(这似乎是Cognito让我得到试图保存而不至少这些打勾错误的最小值).

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

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

Rav*_*car 17

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

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

要使用访问令牌,您需要在其下的用户池中设置资源服务器App Integration -> Resource Servers并不重要,但我假设您使用<site>.com标识符,并且您有一个调用范围api.

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

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

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

  • 上述答案的唯一补充是在“应用程序客户端设置”中为您的范围启用“允许的自定义范围”。 (4认同)
  • 是的 - 重新部署 api!另请参阅 https://aws.amazon.com/premiumsupport/knowledge-center/cognito-custom-scopes-api-gateway/ (2认同)
  • 我是否正确理解,在使用默认的 Cognito Authorizer 时,不可能有一个同时接受“access_token”和“id_token”的端点?这难道不是Cognito+API Gateway的一个巨大缺点吗?如果端点必须由登录用户 (`id_token`) 和外部作业 (`acces_token`) 同时使用怎么办?有没有人找到解决这个问题的方法而不完全放弃使用“id_tokens”? (2认同)
  • @cahen,我们做了类似的事情,最终使用不同的授权者创建了多个垃圾端点,然后在实际端点上创建了一个自定义授权者,该自定义授权者根据令牌委托给了垃圾端点。我记得当时觉得这很愚蠢。 (2认同)

Mal*_*dov 11

对于那些寻找答案但不使用 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
Run Code Online (Sandbox Code Playgroud)

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

  • 这接受 accessToken 也接受 idToken 吗?或者这只适用于 accessToken? (2认同)