通过 javascript 和凭据提供商验证的 AWS API 网关
authenticated AWS API Gateway via javascript AND credentials provider
我的设置包括一个 AWS API 网关,带有 IAM 访问控制和用于登录的 AWS cognito。
我已经从 Android 应用程序访问 API,现在想构建一个网络应用程序 (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 中的相关代码片段:
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);
},
});
}
现在我想用这个:
this.apigClient = apigClientFactory.newClient({
accessKey: "anything",
secretAccessKey: "anything",
sessionToken: "nothing",
region: 'eu-central-1'
如何从我的 AWSCognito 中获取 accessKey、secretAccessKey 和 sessionToken?我找不到 so far...
的任何 API
Cognito 实际上由 3 种不同的服务组成:
- Cognito 您的用户池 - 您在此处集成的内容
- Cognito Sync - 用于同步用户的用户偏好数据
- Cognito 联合身份 - 用于将身份(FB、Google 或用户池)联合到您的帐户并生成凭据。
API 网关客户端期望的是来自 Cognito Federated Identity 的凭据。
请参阅 Cognito documentation 将您的用户池与 Cognito Federated Identity 集成。
谢谢鲍勃,为我指明了正确的方向!我现在已经弄清楚了,因此为了完整起见,这是我的问题的完整解决方案:
来自创建 apiClient 的服务:
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();
});
}
});
});
}
所以这里的关键见解是,
- 我向用户池进行身份验证(在我的问题中显示)
- 我将其与身份提供者一起使用来检索临时凭证 (getCredentials)
- 我使用 AWS.config.credentials 中的临时凭据来设置 apiClient
我希望这对其他人也有帮助。当然,我刚刚发布的代码可能需要进行一些重构,因此非常欢迎对此发表任何评论!
我的设置包括一个 AWS API 网关,带有 IAM 访问控制和用于登录的 AWS cognito。 我已经从 Android 应用程序访问 API,现在想构建一个网络应用程序 (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 中的相关代码片段:
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);
},
});
}
现在我想用这个:
this.apigClient = apigClientFactory.newClient({
accessKey: "anything",
secretAccessKey: "anything",
sessionToken: "nothing",
region: 'eu-central-1'
如何从我的 AWSCognito 中获取 accessKey、secretAccessKey 和 sessionToken?我找不到 so far...
的任何 APICognito 实际上由 3 种不同的服务组成:
- Cognito 您的用户池 - 您在此处集成的内容
- Cognito Sync - 用于同步用户的用户偏好数据
- Cognito 联合身份 - 用于将身份(FB、Google 或用户池)联合到您的帐户并生成凭据。
API 网关客户端期望的是来自 Cognito Federated Identity 的凭据。
请参阅 Cognito documentation 将您的用户池与 Cognito Federated Identity 集成。
谢谢鲍勃,为我指明了正确的方向!我现在已经弄清楚了,因此为了完整起见,这是我的问题的完整解决方案:
来自创建 apiClient 的服务:
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();
});
}
});
});
}
所以这里的关键见解是,
- 我向用户池进行身份验证(在我的问题中显示)
- 我将其与身份提供者一起使用来检索临时凭证 (getCredentials)
- 我使用 AWS.config.credentials 中的临时凭据来设置 apiClient
我希望这对其他人也有帮助。当然,我刚刚发布的代码可能需要进行一些重构,因此非常欢迎对此发表任何评论!