AWS Cognito不使用联合身份进行身份验证

时间:2017-02-01 18:17:00

标签: amazon-web-services authentication amazon-s3 aws-sdk amazon-cognito

我遇到了这个问题。我一直在尝试从Firebase验证Facebook登录用户,因此我可以允许将图像上传到S3存储桶。我已经倾注了文档,示例代码,博客条目等。但我不断收到以下错误:

Error: Not authorized to perform sts:AssumeRoleWithWebIdentity

这是我遵循的文档但没有成功: External Identity Providers » Facebook

我也多次阅读此博客文章Understanding Amazon Cognito Authentication,这句话似乎正在发生的事情:

  

如果您看到这种情况,请仔细检查您是否为身份池和身份验证类型使用了适当的角色。

我理解它在说什么,但我找不到解决方案。我不希望存储用户,我只想验证并获取临时凭据。这是我的代码,角色和政策文件。

的JavaScript

AWS.config.update({
  region: bucketRegion,
  credentials: new AWS.CognitoIdentityCredentials({
  IdentityPoolId: IdentityPoolId,
  Logins: {
      'graph.facebook.com': 'my-valid-auth-token-from-fb-after-login'
    }
  })
});

AWS.config.credentials.get(function(err) {
    // error here
}

经过身份验证的IAM角色政策 - 内联

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "myuserBucketActions",
        "Action": [
            "s3:GetBucketLocation",
            "s3:ListBucketMultipartUploads"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::bucket-name"
    },
    {
        "Sid": "myuserListBucket",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::bucket-name",
        "Condition": {
            "StringLike": {
                "s3:prefix": "folder-in-bucket/*"
            }
        }
    },
    {
        "Sid": "myuserObjectActions",
        "Action": [
            "s3:AbortMultipartUpload",
            "s3:GetObject",
            "s3:PutObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::bucket-name/folder-in-bucket/*"
    }
  ]
}

IAM角色政策的信任关系

{
  "Version": "2012-10-17",
  "Statement": [
{
  "Sid": "",
  "Effect": "Allow",
  "Principal": {
    "Federated": "graph.facebook.com"
  },
  "Action": "sts:AssumeRoleWithWebIdentity",
  "Condition": {
    "StringEquals": {
      "graph.facebook.com:appId": "FACEBOOK_APP_ID"
    }
   }
  }
 ]
}

我在信任关系和池中的身份验证提供程序中拥有正确的FB App ID。我还在我的池中的Authenticated角色下选择了上面的auth角色。我也不允许未经身份验证的身份。

老实说,我不知道出了什么问题。在这一点上,我在墙上扔意大利面,看看有什么棒。

快速提问:如果我无法使用此功能并与未经身份验证的用户一起使用,请切换到经过身份验证,可能会产生什么后果?

感谢你们给我的任何帮助!

1 个答案:

答案 0 :(得分:2)

似乎信任关系不允许您调用sts:AssumeRoleWithWebIdentity。

可以替换

吗?
"Condition": {
    "StringEquals": {
      "graph.facebook.com:appId": "FACEBOOK_APP_ID"
    }
   }
  }

由此

"ForAnyValue:StringLike": {
  "cognito-identity.amazonaws.com:amr": "graph.facebook.com"
}

同时替换

 "Principal": {
    "Federated": "graph.facebook.com"
  }

通过

"Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      }