【问题标题】:Assigning IAM to API gateway for sdk using cognito federated authentication使用 cognito 联合身份验证将 IAM 分配给 sdk 的 API 网关
【发布时间】:2017-05-19 05:14:18
【问题描述】:

我已经使用 Facebook 设置了我的 Federated Cognito 以获取 Cognito 凭据。我希望使用生成的适用于 Web、IOS 和 Android 的 SDK 来保护我的 API 网关资源,以便我可以通过生成的 SDK 部署我的后端。

如果我使用 SDK,是否需要设置 lambda 函数来进行凭据检查? 看来这不是正确的方法。

在 SDK 自述文件中,它说: "#使用 AWS IAM 进行授权 要使用 AWS 凭证初始化开发工具包,请使用以下代码。请注意,如果您使用凭据,所有对 API 的请求都将被签名。这意味着您必须为每个请求设置适当的 CORS accept-* 标头。”

但是,如果我使用的是 SDK,那么我为什么要设置任何请求标头,因为这些都包含在 SDK 中?我缺少什么?

此外,如果我在启动 sdk 时确实设置了 Cognito 凭据,并且我将 API Gateway 中的授权设置设置为“IAM”,那么我该如何为此资源设置策略,以便只有我的授权用户我的 Federated cognito 将被授权访问我的 API。

这似乎是一个非常简单的用例,我觉得尝试了解如何配置这些基本资源以确保只有我授权的认知角色才能访问 SDK。

与您将 IAM 策略直接附加到资源的其他 AWS 资源(如 S3 或 Lambda)一样,我预计 Api Gateway 的 IAM 策略也会出现这种情况。相反,我必须在别处编写策略......如果我将该 API 资源方法的授权设置为 IAM......

【问题讨论】:

    标签: amazon-web-services aws-api-gateway amazon-cognito amazon-iam


    【解决方案1】:

    好的,所以我终于想出了确保验证您的 SDK 以在浏览器中使用的步骤,到目前为止,我假设这也适用于您在 IOS 或 Android 中使用 SDK 时。我将再次发布如果不是这样的话。

    好的。因此,当您设置 Cognito 联合账户时,没有明确解释的第一部分是,在未经身份验证角色的 IAM 策略中,默认的“信任关系”(可以从角色页面或您的未经身份验证角色访问) IAM),不允许访问 Facebook 身份验证,正如有关使用 Federated Cognito 设置 Facebook(或其他身份验证器)的不同著作中所表达的那样。

    因此,您需要为未经身份验证的角色编辑“信任关系”政策:您需要替换以下部分的当前内容,但保留政策的其余部分:

    "ForAnyValue:StringLike": {
              "cognito-identity.amazonaws.com:amr": "graph.facebook.com"
            }
    

    您的信任关系现在应该如下所示:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "cognito-identity.amazonaws.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "cognito-identity.amazonaws.com:aud": "YOUR-AUD"
            },
            "ForAnyValue:StringLike": {
              "cognito-identity.amazonaws.com:amr": "graph.facebook.com"
            }
          }
        }
      ]
    }
    

    在您的 API 网关中,确保将您希望角色访问的所有资源设置为具有 IAM 策略身份验证:您可以通过选择所需方法的方法请求窗口来执行此操作。在授权设置下,您将授权设置为 AWS_IAM,然后保存。

    由于您在方法上设置了 IAM 授权,因此您还必须确保为该资源设置了 CORS。选择“操作”下拉菜单,然后选择启用 CORS 的选项。在此窗口中,只需选择您需要应用 CORS 的方法(根据您设置为具有 IAM 授权的方法)。

    完成后,您可以部署 API,并选择所需的 SDK。 现在,您必须为您的方法设置正确的凭据,以便您的 SDK 对象可以使用正确的凭据对您的请求进行签名。

    一个例子:

     var apigClient = apigClientFactory.newClient({
                        accessKey: AWS.config.credentials.accessKeyId,
                        secretKey: AWS.config.credentials.secretAccessKey,
                        sessionToken: AWS.config.credentials.sessionToken,
                        region: 'YOUR-REGION' 
                    });
    

    您可以通过 Facebook 的登录方法(或您为联合帐户设置的任何 OAuth 提供商)访问这些凭据:

       AWS.config.credentials = new AWS.CognitoIdentityCredentials({
                    IdentityPoolId: 'your-pool-id',
                    Logins: {
                        'graph.facebook.com': response.authResponse.accessToken
                    }
                });
    

    就我而言,我使用这种 FB 身份验证方法来访问 Facebook 令牌:

    FB.getLoginStatus(function (response) {
    });
    

    最后,您必须为您的 Cognito Authenticated 角色提供正确的 IAM 策略,以便能够通过 SDK 调用您的 API:您可以自定义以下策略,以限制您的 Authenicated Federated 角色对 API 网关的访问深度资源/方法:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "execute-api:Invoke"
          ],
          "Resource": "arn:aws:execute-api:*:*:*"
        }
      ]
    }
    

    附加此政策后,您的 SDK 将能够成功地向您的 API 发出请求。如果您删除该政策,您将无法访问。
    此外,如果您删除对信任策略的更改(如上所示),您也将无法获得 Cognito 身份凭证,并且这些凭证的对象将保持未定义。

    好的,我的第一篇 stackoverflow 帖子。希望它可以为其他人节省大量在 AWS 文档上奔波的时间。


    现在,如果您希望对谁在访问资源(例如,您用来访问后端资源的 Lambda 函数)进行细粒度控制,并希望确保您拥有正确的认知 ID 信息来控制如何您的 lambda 会对调用函数的人做出反应,您可以传递执行 Api Gateway 方法所需的 cognito 凭据。
    执行此操作的方法很简单,但需要注意的是,您必须确保 Cognito 的身份验证角色授予 Lambda 函数的权限。

    1. 转到您的方法的“集成请求”。选中复选框:“使用调用方凭据调用”。

    2. 确保您的 CORS 已设置,然后重新部署您的 API 和 SDK。现在,您可以为您的 cognito 身份验证用户转到您的 IAM 角色,并添加一个策略,使该角色能够执行 Lambda 函数。

    【讨论】:

      猜你喜欢
      • 2016-12-25
      • 2018-01-21
      • 1970-01-01
      • 2017-03-25
      • 2023-04-03
      • 2023-03-04
      • 2018-04-05
      • 1970-01-01
      • 2018-01-12
      相关资源
      最近更新 更多