【问题标题】:How can I use Cognito OAuth 2.0 to authenticate a API Gateway request without having an app client secret?如何在没有应用客户端密钥的情况下使用 Cognito OAuth 2.0 对 API 网关请求进行身份验证?
【发布时间】:2020-04-02 19:56:51
【问题描述】:

我正在使用 aws sdk 来管理我的应用程序的登录和注册,并且 sdk 要求我的应用程序客户端没有密钥。这是一个问题,因为我打算使用 Cognito 来验证 API 网关。我尝试在应用客户端设置上启用 OAuth 2.0 客户端凭据流,选择一个范围并将其提供给 API 方法,但是当我尝试保存应用客户端设置时,我得到:

“我们无法更新您的应用配置:如果客户端没有客户端密码,则无法选择 client_credentials 流。(服务:AWSCognitoIdentityProviderService;状态代码:400;错误代码:InvalidOAuthFlowException”

有没有更好的方法来使用 Cognito 配置 API Gateway?我做错了吗?

【问题讨论】:

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


    【解决方案1】:

    您需要使用密钥为您的 API 创建一个新的应用客户端。

    前端客户端 - 没有秘密的应用程序客户端 后端客户端 / api - 带有密钥的应用程序客户端

    客户端凭据通常是服务-服务身份验证的一种方法。您必须安全地存储秘密。因此在不安全的前端应用程序(例如 html 网站)中使用是不安全的。

    希望这会有所帮助。

    【讨论】:

    • 如果我使用不带密码的应用客户端登录并使用带密码的应用客户端来验证 API 调用,那将如何工作?我不需要获取应用程序客户端生成的访问令牌,其中包含要对 API 进行身份验证的秘密吗?
    • 抱歉,我回答了关于 client_credentials 如何工作的问题。要使 client_credentials 工作,您应该有一个秘密。但是您不能在 html 网站上使用秘密。这意味着您不能在前端使用 client_credentials 方法。
    • 对于 html 客户端,您应该有一个没有秘密并使用implicit grant 方法的客户端。当您将请求发送到 api 端点时,如果您的 api 方法正在针对任何自定义范围进行验证,请发送 access_token,否则发送 id_token
    • 你不需要使用client_credentials,除非你需要配置服务间授权,例如你需要从现有的api调用另一个api
    【解决方案2】:

    添加到 Arun 的答案中,API 不需要 Cognito OAuth 客户端条目,只需要验证收到的 Cognito 访问令牌。

    这通常是通过从 Cognito 下载 JWKS 密钥来完成的 - API Gateway 有一个自动执行此操作的设置。

    如果您在令牌验证后遇到识别用户的问题,我可以提供更多详细信息。

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 1970-01-01
      • 2018-03-31
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多