AWS:具有开发人员身份验证身份的Secure API Gateway

时间:2017-03-14 17:37:53

标签: amazon-web-services lambda aws-api-gateway amazon-cognito

我想知道是否有人对如何解决API Gateway / Lambda上的以下问题有一个好主意 - API的消费者只需要一个令牌,它将通过附加到API网关的Cognito授权者授权它们,API必须照顾好一切,然后回复一个令牌。

因此,用户向我的登录Lambda发送他们的用户名和密码,以便根据我执行以下操作的文档(为简洁起见,我将错误处理切掉):

    const cognitoidentity = new AWS.CognitoIdentity({ region: 'eu-west-1' })
    const userId = authenticationService.authorise(username, password)
    const params = {
        IdentityPoolId: 'eu-west-1:my-identity-pool-id',
        Logins: {
            'myapp.mydomain.com': userId,
        },
    }
    cognitoidentity.getOpenIdTokenForDeveloperIdentity(params, (err, data) => {

  // Now I have an OpenId token and an identity Id


})

最初我以为我应该调用GetCredentialsForIdentity,但这并没有给我返回访问令牌,我是在这里找到正确的路线还是我错过了什么?

更新:要明确,我不希望消费者必须实施AWS客户端软件,基本上我希望他们只需添加一个标题即可让他们像传统的api。

2 个答案:

答案 0 :(得分:0)

根据评论更新: 检查此代码

 var data = {
        UserPoolId : '...', // Your user pool id here
        ClientId : '...' // Your client id here
    };
    var userPool = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(data);
    var cognitoUser = userPool.getCurrentUser();

    if (cognitoUser != null) {
        cognitoUser.getSession(function(err, session) {
            if (err) {
               alert(err);
                return;
            }
            console.log('session validity: ' + session.isValid());

            AWS.config.credentials = new AWS.CognitoIdentityCredentials({
                IdentityPoolId : '...' // your identity pool id here
                Logins : {
                    // Change the key below according to the specific region your user pool is in.
                    'cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>' : session.getIdToken().getJwtToken()
                }
            });

            // Instantiate aws sdk service objects now that the credentials have been updated.
            // example: var s3 = new AWS.S3();

        });
    }

session.getAccessToken().getJwtToken()会为您提供accessstoken

此链接http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html可能会对您有所帮助。

用户使用用户名和密码登录后,必须生成访问令牌。您可以稍后验证该密钥。 此外,当用户被验证时,您可以使用STS生成凭证并传递该凭证。

对于API网关,请检查您是否可以在代码中创建API密钥并使用它。

答案 1 :(得分:0)

代码中缺少的步骤如下:

  • 致电AWS STS以获取临时访问令牌
  • 签署临时访问令牌
  • 返回此签名值,并将其与其他标头一起传递给最终请求。

将您的请求传递给API端点的实际标头类似于:

{
   'Authorization': 'algo Credentials=<creds>, SIgnedHeaders=host;x-amz-date, Signature=<sig>',
   'x-amz-date': '<some date>',
}

实际上创建这些标题可能会有些麻烦。痛苦的描述可以在这里找到:https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html

我在后端使用python,我只是使用AWS签名库为我完成了签名。

https://gist.github.com/rcadena/e071c26d9e4126af42eb29182ca5acb1

说了这么多,我不确定是否建议使用这种为外部客户提供签名的完整方法。仅举一个困难:如果必须将主体传递给最终端点请求,则必须从后端获取全新的签名,因为签名将主体用作其摘要的一部分。您不能只重用Authorization标头。

我接下来要研究的可能是通过编程方式在后端制作API网关访问令牌,但是我不确定这些令牌是否可以与身份绑定。