Amazon web services 使用cognito联邦身份验证将IAM分配给sdk的API网关

Amazon web services 使用cognito联邦身份验证将IAM分配给sdk的API网关,amazon-web-services,aws-api-gateway,amazon-cognito,amazon-iam,Amazon Web Services,Aws Api Gateway,Amazon Cognito,Amazon Iam,我已经使用Facebook设置了我的联合Cognito以获取Cognito凭据。我希望使用为web、IOS和Android生成的SDK来保护我的API网关资源,这样我就可以通过生成的SDK部署我的后端 如果我正在使用SDK,我是否需要为凭证检查设置lambda函数? 看来这不是正确的方法 在SDK自述中,它说: 使用AWS IAM进行授权 要使用AWS凭据初始化SDK,请使用以下代码。注意,如果使用凭据,则对API的所有请求都将进行签名。这意味着您必须为每个请求设置适当的CORS accept-

我已经使用Facebook设置了我的联合Cognito以获取Cognito凭据。我希望使用为web、IOS和Android生成的SDK来保护我的API网关资源,这样我就可以通过生成的SDK部署我的后端

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

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

但是,如果我正在使用SDK,那么为什么我要设置任何请求头,因为这些都是烘焙到SDK中的?我缺少了什么

此外,如果我在启动sdk时设置了Cognito凭据,并将API网关中的授权设置设置为“IAM”,那么我如何设置此资源的策略,以便只有我的联合Cognito的授权用户才有权访问我的API

这似乎是一个非常简单的用例,我觉得在理解如何配置这些基本资源以确保只有我授权的cognito角色才能访问SDK时遇到了巨大的麻烦


与其他AWS资源一样,您可以将IAM策略直接附加到资源,如S3或Lambda,我希望Api网关的IAM策略也是如此。相反,我必须去别处写政策。。。。如果我将API资源方法的授权设置为IAM…

好的,那么API网关解决方案将检查哪个策略,因此我最终确定了确保在浏览器中使用SDK身份验证的步骤,到目前为止,我假设在IOS或安卓中使用SDK时,这也适用。。如果不是这样的话,我会再发一次

嗯。因此,当您设置Cognito联合帐户时,第一个没有明确解释的部分是,在未经验证角色的IAM策略中,默认的“信任关系”不允许访问Facebook身份验证,该关系可以从角色页面或IAM中的未经验证角色访问,正如在关于使用联合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的选项。在此窗口中,只需根据您设置为具有IAM授权的方法选择需要应用CORS的方法

完成后,您可以部署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认证角色提供正确的IAM策略,以便能够通过SDK调用您的API:您可以自定义以下策略,以限制您的认证联合角色对API网关资源/方法的访问深度:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "execute-api:Invoke"
      ],
      "Resource": "arn:aws:execute-api:*:*:*"
    }
  ]
}
附加此策略后,SDK将能够成功向API发出请求。如果删除该策略,您将无法访问。 此外,如果您删除对信任策略的更改(如上所示),您也将无法获得Cognito标识凭据,并且这些凭据的对象将保持未定义状态

好的,我的第一篇文章。希望它能为其他人节省大量关于AWS文档的时间

现在,如果您希望对访问资源的人进行细粒度控制,例如,您用于访问后端资源的Lambda函数,并希望确保您拥有正确的cognito ID信息,以控制Lambda如何对调用该函数的人作出反应,您可以传递执行Api网关方法所需的cognito凭据。 你这样做的方式很简单,但是 e catch是您必须确保您的Cognito的身份验证角色授予Lambda函数的权限

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

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