【问题标题】:AWS API Gateway - using Access Token with Cognito User Pool authorizer?AWS API Gateway - 将访问令牌与 Cognito 用户池授权方一起使用?
【发布时间】:2018-10-28 12:11:29
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用具有与 id 令牌相同的授权方的访问令牌,但需要在用户池和 APIG 中完成一些额外的设置。

    即使完成此额外设置,您也无法将内置授权测试功能与访问令牌一起使用,而只能使用 id 令牌。 AWS 提供的典型 80% 解决方案!

    要使用访问令牌,您需要在 App Integration -> Resource Servers 下的用户池中设置资源服务器,使用什么都没有关系,但我假设您使用 <site>.com 作为标识符,并且您有一个名为 @ 的范围987654325@.

    没有转到 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

    【讨论】:

    • 谢谢。我只是不明白为什么使用默认范围不起作用。如电子邮件、电话、个人资料等。即使我们想使用默认范围,我们也必须指定我们的资源服务器和范围。
    • 对上述答案的唯一补充是在App client settings 中为您的范围启用Allowed Custom Scopes
    • 是的 - 重新部署 api!另请参阅aws.amazon.com/premiumsupport/knowledge-center/…
    • 感谢您,AWS 及其怪癖只是一种痛苦。这为我节省了一天的工作量。
    • 我是否理解正确,在使用默认 Cognito 授权器时不可能有一个同时接受 access_tokenid_token 的端点?这不是 Cognito+API Gateway 的一大缺点吗?如果端点必须同时由登录用户 (id_token) 和外部作业 (acces_token) 使用怎么办?有没有人在不完全放弃使用id_tokens 的情况下找到解决方法?
    【解决方案2】:

    对于那些正在寻找答案但不使用 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/ 调试器中)。

    【讨论】:

    • 这接受 accessToken 和 idToken 吗?或者这只适用于 accessToken?
    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢,这似乎是如何工作的,但这不违反使用令牌的最佳实践吗?
    猜你喜欢
    • 2020-05-13
    • 2020-12-23
    • 2018-01-24
    • 2021-03-03
    • 2022-11-10
    • 2019-12-22
    • 2017-06-26
    • 2022-11-15
    • 2021-08-05
    相关资源
    最近更新 更多