我正在尝试构建一个项目来帮助用户管理他们的 S3 账户。但是,为此,他们需要手动向我提供他们的访问密钥。不过这很复杂,我想让他们更容易。
有没有办法使用他们的登录信息来检索他们的访问密钥?
如果解决方案是PHP中的,我更喜欢,但这不是义务。
谢谢!
如果 S3 存储桶适用于您账户中的用户
如果您谈论的是与您计数的账户中的用户关联的访问密钥,请查看 AWS Identity and Access Management/ListAccessKeys。
IAM [ 身份和访问管理] 是一种 Web 服务,可实现 AWS 客户在其 AWS 下管理用户和用户权限 帐户
如果 S3 存储桶适用于您不拥有的账户
如果您谈论的是与其他人的 AWS 账户关联的访问密钥(以及根据您的评论是私有密钥),根据 AWS,您只能从 AWS 安全凭证页面上的访问密钥选项卡获取访问密钥。
这是完全有道理的,因为访问密钥是受保护的帐户机密。 提供用于检索机密的 API 是没有意义的。
此外,如果用户向您提供了他们的帐户凭据,那将是一个巨大的安全问题。 您可以启动所需的任何 AWS 资源,他们将承担责任。 即使他们 100% 信任您不这样做,如果您允许该登录数据被黑客入侵,黑客也可以这样做。 如果LinkedIn登录数据可以被黑客入侵,您也可能被黑客入侵。
给定用户名,您可以使用ListAccessKeys api列出用户的访问密钥。
但是你的问题似乎有一个问题。为了使用上述 api,您需要使用访问密钥 - 密钥对对请求进行签名。而且我认为您不会因为他们正在为其他工具构建工具,除非您的 aws 账户中的用户至少在 s3 和 IAM 上具有完全权限。
然后,这将允许您仅获取访问密钥而不是其机密。询问机密就像向某人询问密码一样,以便您可以代表他们做某事。因此,您无法通过任何 API 从 aws 获取密钥,获取密钥的唯一方法是用户将其提供给您。
我找到了一种让它工作的方法。基本上,我已经设置了一个Selenium Webdriver服务器并下载了所有必需的C#文件。然后我创建了这个小脚本:
static void Main(string[] args)
{
IWebDriver driver;
driver = new FirefoxDriver();
driver.Navigate().GoToUrl("https://aws-portal.amazon.com/gp/aws/securityCredentials");
driver.FindElement(By.Id("ap_email")).Clear();
driver.FindElement(By.Id("ap_email")).SendKeys("USER@EMAILACCOUNT.COM");
driver.FindElement(By.Id("ap_password")).Clear();
driver.FindElement(By.Id("ap_password")).SendKeys("HISPASSWORD");
driver.FindElement(By.Id("signInSubmit")).Click();
IList<IWebElement> keys = driver.FindElements(By.LinkText("Show"));
int nbElems = keys.Count;
System.Console.WriteLine(nbElems+" keys");
foreach (IWebElement k in keys)
{
String toparse = k.GetAttribute("href");
Regex regex = new Regex(@"'(?<key>.*)','(?<secret>.*)'");
GroupCollection groups = regex.Match(toparse).Groups;
System.Console.WriteLine(groups["key"] + " " + groups["secret"]);
}
driver.FindElement(By.LinkText("Sign Out")).Click();
driver.Quit();
}
现在我只需要找到一种方法将用户信息安全地发送到此脚本。
谢谢你们的帮助!