0

我想问一下“AWS 获取联邦令牌”。

我想要做的是使用 getFederationToken 授权的人只能访问他/她命名的 AWS S3 文件夹,如 [bob] 或 [alice] 等。

这是我所做的。

使用 getFederationToken 为 aws:userid 制作临时凭证

    AWS.config.update({
      accessKeyId: [Removed],
      secreteAccessKey: [Removed],
      region: [Removed]
    });

    var params = {
      Name : 'bob',
      Policy : "{\"Version\": \"2012-10-17\",\"Statement\": [{\"Effect\": \"Allow\", \"Action\": [\"s3:ListBucket\"],\"Resource\": [\"arn:aws:s3:::mybucket\"]}, {\"Effect\": \"Allow\", \"Action\": [\"s3:PutObject\", \"s3:GetObject\"],\"Resource\": [\"arn:aws:s3:::mybucket/${aws:userid}/*\"]}]}",
      DurationSeconds: "129600"
    }

    var sts = new AWS.STS({apiVersion: '2011-06-15'});

    sts.getFederationToken(params, function(err, data) {
      if(err) 
        console.log(err, err.stack);
      else
        console.log(data);
    });

但我不知道 ${aws:userid} 会调用什么。AWS用户指南说当委托人是联合用户时将调用[account:caller-specified-name]......但是,我检查了它是否是[AWS account ID (12-digit number):bob]。它不是..

如果你有什么要告诉我的,请告诉我。谢谢你。

4

2 回答 2

0

我找到了一个甚至不完美的解决方案。

[account:caller-specified-name] 作为 [123456789012:bob] 仅使用s3 policy正常工作,而不是 JS 代码参数。

于 2017-01-02T05:17:46.937 回答
0

我一直在寻找同一个问题的答案。经过反复试验,我找到了解决方案:

您可以使用

"arn:aws:s3:::mybucket/${aws:userid}/*\"

但是文件夹名称必须是 mybucket/[accountId]:bob

但是,根据执行此代码的位置,您可能不希望将您的帐户 ID 用作 URL 或文件夹名称的一部分。

无论如何,您都在通过整个策略,您可以简单地更改上面的代码以接受名称:

const tempAccountName = 'bob'; // passed as parameter I presume?

AWS.config.update({
  accessKeyId: [Removed],
  secreteAccessKey: [Removed],
  region: [Removed]
});

var params = {
  Name : tempAccountName,
  Policy : `{\"Version\": \"2012-10-17\",\"Statement\": [{\"Effect\": \"Allow\", \"Action\": [\"s3:ListBucket\"],\"Resource\": [\"arn:aws:s3:::mybucket\"]}, {\"Effect\": \"Allow\", \"Action\": [\"s3:PutObject\", \"s3:GetObject\"],\"Resource\": [\"arn:aws:s3:::mybucket/${tempAccountName}/*\"]}]}`,
  DurationSeconds: "129600"
}

var sts = new AWS.STS({apiVersion: '2011-06-15'});

sts.getFederationToken(params, function(err, data) {
  if(err) 
    console.log(err, err.stack);
  else
    console.log(data);
});
于 2022-02-19T16:13:55.260 回答