好的,所以我终于想出了确保验证您的 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 函数的权限。
转到您的方法的“集成请求”。选中复选框:“使用调用方凭据调用”。
确保您的 CORS 已设置,然后重新部署您的 API 和 SDK。现在,您可以为您的 cognito 身份验证用户转到您的 IAM 角色,并添加一个策略,使该角色能够执行 Lambda 函数。