我想知道是否有人对如何解决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。
答案 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
用户使用用户名和密码登录后,必须生成访问令牌。您可以稍后验证该密钥。 此外,当用户被验证时,您可以使用STS生成凭证并传递该凭证。
对于API网关,请检查您是否可以在代码中创建API密钥并使用它。
答案 1 :(得分:0)
代码中缺少的步骤如下:
将您的请求传递给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网关访问令牌,但是我不确定这些令牌是否可以与身份绑定。