我的设置包含一个带有IAM访问控制的AWS API网关和用于登录的AWS cognito。 我已经从Android应用程序访问API,现在想要构建一个Web应用程序(angular2)来做同样的事情。 在Android上,我使用AWSCognitoCredentialsProvider为API SDK提供所需的凭据。 (http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-generate-sdk.html)
不幸的是我无法知道如何使用javascript SDK如何做到这一点?
我使用cognito登录并获取会话ID,访问令牌等没有问题。但是,API SDK要求我提供accessKey和secretKey。
以下是生成的API SDK中的相关代码段:
obj.set({
scaleY: obj.height / (obj.getBoundingRect().height),
scaleX: obj.width / (obj.getBoundingRect().width),
});
换句话说,我有这个部分工作(从一些示例代码):
var authType = 'NONE';
if (sigV4ClientConfig.accessKey !== undefined && sigV4ClientConfig.accessKey !== '' && sigV4ClientConfig.secretKey !== undefined && sigV4ClientConfig.secretKey !== '') {
authType = 'AWS_IAM';
}
现在我想用这个:
static authenticate(username:string, password:string, callback:CognitoCallback) {
AWSCognito.config.update({accessKeyId: 'anything', secretAccessKey: 'anything'})
let authenticationData = {
Username: username,
Password: password,
};
let authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);
let userData = {
Username: username,
Pool: CognitoUtil.getUserPool()
};
console.log("Authenticating the user");
let cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
console.log(AWS.config);
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: function (result) {
callback.cognitoCallback(null, result);
},
onFailure: function (err) {
callback.cognitoCallback(err.message, null);
},
});
}
如何从AWSCognito中获取accessKey,secretAccessKey和sessionToken?我无法找到so far...
的任何API答案 0 :(得分:2)
感谢Bob,指出我正确的方向!我现在想出来了,因此为了完整起见,这里是我问题的完整解决方案:
从创建apigClient的服务:
return CognitoUtil.getCredentials()
.then(() =>
this.apigClient = apigClientFactory.newClient({
accessKey: AWS.config.credentials.accessKeyId,
secretKey: AWS.config.credentials.secretAccessKey,
sessionToken: AWS.config.credentials.sessionToken,
region: 'eu-central-1'}));
getCredentials()方法,它是获取所需临时凭证的关键:
public static getCredentials():Promise{
return new Promise((resolve, reject) => {
CognitoUtil.getIdToken({
callback() {
},
callbackWithParam(idTokenJwt:any) {
let url = 'cognito-idp.' + CognitoUtil._REGION.toLowerCase() + '.amazonaws.com/' + CognitoUtil._USER_POOL_ID;
let logins = {};
logins[url] = idTokenJwt;
let params = {
IdentityPoolId: CognitoUtil._IDENTITY_POOL_ID, /* required */
Logins: logins
};
AWS.config.region = CognitoUtil._REGION;
AWS.config.credentials = new AWS.CognitoIdentityCredentials(params);
AWS.config.credentials.refresh(result => {
console.log(AWS.config.credentials);
resolve();
});
}
});
});
}
所以这里的关键洞察力是
我希望这对其他人也有帮助。当然,我刚刚发布的代码可能会使用一些重构,因此对此非常欢迎!
答案 1 :(得分:1)
Cognito实际上由3种不同的服务组成:
API Gateway客户端期望的是来自Cognito Federated Identity的凭据。
请参阅Cognito documentation以将您的用户池与Cognito Federated Identity集成。