我使用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 回答
好的,所以我终于想出了确保你的SDK在浏览器中使用的验证步骤,我到目前为止假设当你在IOS或Android中使用SDK时这也适用 . 如果不是,我会再次发布不是这样的 .
好 . 因此,在设置Cognito Federated帐户时未明确说明的第一部分是在未经身份验证的角色的IAM策略中,默认的“信任关系”(可以从“角色”页面或“未经身份验证的角色”访问) IAM),不允许访问Facebook身份验证,正如关于使用Federated Cognito设置Facebook(或其他身份验证器)的不同着作中所表达的那样 .
因此,您需要编辑未经身份验证的角色的“信任关系”策略:您需要替换以下部分当前的内容,但是,保留其余的策略:
您的信任关系现在应如下所示:
在API网关中,确保将角色要访问的所有资源设置为具有IAM策略身份验证:通过选择所需方法的方法请求窗口来执行此操作 . 在授权设置下,将授权设置为AWS_IAM,然后保存 .
由于您已在方法上设置了IAM授权,因此还必须确保为该资源设置了CORS . 选择“操作”下拉菜单,然后选择启用CORS的选项 . 在此窗口中,只需选择需要CORS应用的方法(根据您设置的IAM授权方法) .
完成此操作后,您可以部署API,并选择所需的SDK . 现在,您必须为方法设置正确的凭据,以便SDK对象可以使用正确的凭据对您的请求进行签名 .
一个例子:
您可以从Facebook的登录方法(或您为联合帐户设置的OAuth提供商)访问这些凭据:
就我而言,我使用这种FB身份验证方法来访问Facebook令牌:
最后,您必须为Cognito Authenticated角色提供正确的IAM策略,以便能够通过SDK调用您的API:您可以自定义以下策略,以限制Authenicated Federated Role对API网关资源/方法的访问深度:
一旦您附加此政策,您的SDK就能够成功向您的API发出请求 . 如果删除该策略,则无权访问 .
此外,如果删除信任策略的更改(如上所示),您也将无法获得Cognito身份凭证,并且这些凭据的对象将保持未定义 .
好的,我的第一个stackoverflow帖子 . 希望它能在AWS文档中为其他人节省大量时间 .
现在,如果您希望对谁正在访问资源(例如您用来访问后端资源的Lambda函数)进行细粒度控制,并希望确保您拥有正确的认知ID信息来控制lambda的反应方式对于谁正在调用该函数,您可以传递执行Api Gateway方法所需的Cognito凭据 .
你这样做很简单,但是,唯一的问题是您必须确保Cognito的身份验证角色授予Lambda函数权限 .
转到您的方法的“集成请求” . 选中复选框:“调用来电者凭据” .
确保您的CORS已设置,并重新部署您的API和SDK . 现在,您可以转到您的Cognito身份验证用户的IAM角色,并添加一个策略,使该角色能够执行Lambda函数 .