我已经使用Facebook设置了我的Federated Cognito以获得Cognito凭据。我希望使用生成的web、IOS和Android SDK来保护我的API网关资源,这样我就可以通过生成的SDK部署我的后端。
如果我正在使用SDK,我是否需要为凭据检查设置lambda函数?这似乎不是正确的方法。
在SDK Readme中,它说:"#使用AWS IAM进行授权要使用AWS凭据初始化SDK,请使用以下代码。请注意,如果使用凭据,则对API的所有请求都将进行签名。这意味着您必须为每个请求设置合适的CORS accept-*标头。">
然而,如果我使用的是SDK,那么我为什么要设置任何请求头,因为这些都是在SDK中烘焙的?我错过了什么?
此外,如果我在启动sdk时设置了Cognito凭据,并且我将API网关中的授权设置设置为"IAM",那么我如何为此资源设置策略,以便只有我的Federated Cognito的授权用户才能被授权访问我的API。
这似乎是一个非常简单的用例,在试图了解如何配置这些基本资源以确保只有我的授权cognito角色才能访问SDK时,我感到非常吃力。
与其他将IAM策略直接附加到资源的AWS资源一样,如S3或Lambda,我预计Api Gateway的IAM策略也会如此。相反,我必须去其他地方写政策。。。。以及API网关资源正在检查哪个策略,如果我将API资源方法的授权设置为IAM。。。
好的,所以我终于找到了确保在浏览器中使用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策略身份验证:您可以通过选择所需方法的方法请求窗口来完成此操作。在授权设置下,将authorization设置为AWS_IAM,然后保存。
因为您在方法上设置了IAM授权,所以还必须确保为该资源设置了CORS。选择Actions(操作)下拉菜单,然后选择启用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:您可以自定义以下策略,以限制您的Authenited Federated角色对API网关资源/方法的访问深度:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": "arn:aws:execute-api:*:*:*"
}
]
}
一旦您附加此策略,您的SDK将能够成功地向您的API发出请求。如果删除该策略,您将没有访问权限
此外,如果删除对信任策略的更改(如上所示),您也将无法获得Cognito身份凭据,并且这些凭据的对象将保持未定义状态。
好的,这是我的第一篇stackoverflow帖子。希望它能为其他人节省大量的AWS文档。
现在,如果您希望对谁在访问资源(例如用于访问后端资源的Lambda函数)进行细粒度控制,并希望确保您有正确的cognito ID信息来控制Lambda对谁在调用该函数的反应,则可以传递执行Api-Gateway方法所需的cognido凭据
执行此操作的方法很简单,但是,一个问题是您必须确保Cognito的Authentication角色为Lambda函数授予权限。
转到方法的"集成请求"。选中框:"使用调用方凭据调用"。
确保您的CORS已设置,并重新部署API和SDK。现在,您可以转到您的认知身份验证用户的IAM角色,并添加一个策略,使该角色能够执行Lambda函数。