Я пытаюсь создать кнопку в приложении, которая автоматически регистрирует пользователя в консоли AWS в браузере. Когда пользователь нажимает кнопку, он должен подготовить токен и составить URL-адрес, а затем открыть этот URL-адрес в новом окне, в результате чего происходит вход в систему, в результате чего пользователь находится в консоли AWS.
I'mс помощью API-интерфейса Javascript AWS для этого (https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/top-level-namespace.html).
В частности, я выполняю шаги «GetFederationToken», описанные здесь: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html
И здесь используется пример кода: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/STS.html#getFederationToken-property
Я использую пользователя IAM для запроса токена на первом шаге. У этого пользователя есть политика AdministratorAccess, и я могу успешно вызвать API-вызов getFederatedToken. Я получаю ожидаемый токен, секретный ключ и ключи доступа.
Затем я составляю URL:
AWS.config.update({
accessKeyId: "ACCESS",
secretAccessKey: "SECRET",
"region": "us-east-1",
accountID: "123456789"
});
var sts = new AWS.STS();
var params = {
Name: 'user',
DurationSeconds: 900,
Policy: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListAllMyBuckets\",\"Resource\":\"*\"}]}"
};
var console_url = "https://console.aws.amazon.com/"
var signin_url = "https://signin.aws.amazon.com/federation"
var issuer_url = "https://myCompanyURL.com/"
sts.getFederationToken(params, function(err, data) {
if (err) {
console.log(err, err.stack); // an error occurred
}
else{
//Construct the session token
var sessionTokenJSON = {
sessionID : data.Credentials.AccessKeyId,
sessionKey : data.Credentials.SecretAccessKey,
sessionToken : data.Credentials.SessionToken
};
var sessionTokenString = JSON.stringify(sessionTokenJSON);
var encodedSessionToken = encodeURIComponent(sessionTokenString);
console.log(sessionTokenString);
//Get the SignIn Token
var signInURL = signin_url+"?Action=getSigninToken&Session="+encodedSessionToken;
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", signInURL, false );
xmlHttp.send( null );
var result = xmlHttp.responseText;
result = JSON.parse(result);
//Get the login URL
var encodedIssuer = encodeURIComponent(issuer_url);
var encodedDestination = encodeURIComponent(console_url);
var loginURL = signin_url+"?Action=login&Destination="+encodedDestination+"&SigninToken="+result.SigninToken;
console.log(loginURL)
//Open the URl
window.open(loginURL);
}
});
Я подтвердил, что доступ, секрет и идентификатор учетной записи, которую я использую, действительны и соответствуют пользователю IAM, которого я хочу использовать.
Я попытался использовать как console_url, приведенный выше, так и тот, который показан в моем разделе управления учетными записями AWS. Приведенный выше URL вызывает ошибку, подробно описанную ниже, журнал консоли IAM. из моего раздела управления учетной записью AWS возвращает 404.
isser_url и console_url - это правильно отформатированные URL-адреса https. Они закодированы в URI, как описано в инструкциях, и мой результирующий URL выглядит структурно так же, как в примере на сайте, указанном выше.
Новое окно открывается, когда я вызываю вызов window.open (), но явсегда получайте эту страницу ответа:
Amazon Web Services Sign In
Some of your credentials are missing. Please contact your administrator.
Я в растерянности из-за шагов, которые я, возможно, пропустил, или предварительных условий, которые я мог пропустить, любые предложения будут с благодарностью.