首页 文章

使用cognito联合身份验证将IAM分配给API网关以获取sdk

提问于
浏览
1

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

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

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

但是,如果我使用的是SDK,那么为什么我要设置任何请求标头,因为这些都是在SDK中加入的?我错过了什么?

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

这似乎是一个非常简单的用例,我尝试了解如何配置这些基本资源以确保只有我的授权cognito角色才能访问SDK,这让我感到非常震惊 .

与将IAM策略直接附加到资源(如S3或Lambda)的其他AWS资源一样,我预计Api网关的IAM策略也会出现这种情况 . 相反,我必须在其他地方编写策略....如果我将API资源方法的授权设置为IAM,那么API网关resoruce正在检查哪个策略...

1 回答

  • 1

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

    好 . 因此,在设置Cognito Federated帐户时未明确说明的第一部分是在未经身份验证的角色的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 Role对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函数权限 .

    • 转到您的方法的“集成请求” . 选中复选框:“调用来电者凭据” .

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

相关问题