通过javascript和凭据提供程序验证AWS API网关

时间:2016-09-21 10:53:46

标签: javascript amazon-web-services aws-sdk aws-api-gateway

我的设置包含一个带有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

2 个答案:

答案 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. 我对用户池进行了身份验证(显示在我的问题中)
  2. 我使用身份提供程序来检索临时凭证(getCredentials)
  3. 我使用AWS.config.credentials中的临时凭证来设置apigClient
  4. 我希望这对其他人也有帮助。当然,我刚刚发布的代码可能会使用一些重构,因此对此非常欢迎!

答案 1 :(得分:1)

Cognito实际上由3种不同的服务组成:

  • Cognito Your User Pools - 您在此集成的内容
  • Cognito Sync - 用于同步用户的用户偏好数据
  • Cognito Federated Identity - 用于将身份(FB,Google或用户池)联合到您的帐户并生成凭据。

API Gateway客户端期望的是来自Cognito Federated Identity的凭据。

请参阅Cognito documentation以将您的用户池与Cognito Federated Identity集成。