【发布时间】:2017-07-25 22:55:22
【问题描述】:
我想使用 Javascript API 调用 Lambda 函数。
我希望使用在浏览器上通过身份验证的用户的 cognito userpool 凭据调用它。
目标是 Lambda 函数将具有与 cognito 用户池中的用户相同级别的 S3 访问权限。
我该怎么做?
谢谢
【问题讨论】:
标签: javascript aws-lambda amazon-cognito
我想使用 Javascript API 调用 Lambda 函数。
我希望使用在浏览器上通过身份验证的用户的 cognito userpool 凭据调用它。
目标是 Lambda 函数将具有与 cognito 用户池中的用户相同级别的 S3 访问权限。
我该怎么做?
谢谢
【问题讨论】:
标签: javascript aws-lambda amazon-cognito
您可以通过将用户池令牌与 Cognito 联合身份联合来做到这一点,这将为您提供临时 AWS 凭证以调用 AWS Lambda 函数。您将需要创建一个身份池并创建一个具有 lambda:InvokeFunction 权限的角色。
另外请记住,如果您选择基于身份验证角色的解析,用户池的所有用户都将能够调用 lambda 函数,如果您想将其限制为用户子集,您可以使用用户池和令牌中的组或在联合身份中基于规则的映射来确定角色。
【讨论】:
您将需要这三个包:
<script src="js/aws-cognito-sdk.min.js"></script>
<script src="js/amazon-cognito-identity.min.js"></script>
<script src="js/aws-sdk.min.js"></script>
使用 Cognito 登录后,您可以像这样调用 Lambda 函数:
function invokeMyLambda()
{
if(!objCognitoUser) syncAwsFromCognito();
var lambda = new AWS.Lambda({region: 'us-east-1', apiVersion: '2015-03-31'});
// create JSON object for service call parameters
var pullParams = {
FunctionName : 'myLambFunctionName',
InvocationType : 'RequestResponse', // Event | RequestResponse | DryRun
LogType : 'None',
Payload : JSON.stringify({ "yourKeyName": "Key Value to pass to the function in Event Object"}),
};
// invoke Lambda function, passing JSON object
lambda.invoke(pullParams, function(err, data) {
if (err) {
console.log(err);
} else {
console.log(data);
alert("Success: " + JSON.stringify(data));
}
});
lambda = null;
}
function syncAwsFromCognito() {
// objCognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
if(!objCognitoUser) {
objCognitoUser = objUserPool.getCurrentUser();
}
if (objCognitoUser) {
objCognitoUser.getSession(function(err, result) {
if (result) {
if(AWS.config.credentials == null) // Refresh AWS Config credentials
AWS.config.credentials = new AWS.CognitoIdentityCredentials(jsonUserCreds);
AWS.config.credentials.params.Logins[strConfUserPoolID] = result.idToken.jwtToken;
}
});
//call refresh method in order to authenticate user and get new temp credentials
AWS.config.credentials.refresh( function (error) {
if (error) {
console.log('syncAwsFromCognito', error);
}
});
}
else
alert("Session expired. Login again");
}
您也可以在完成 Cognito 身份验证后直接从 Javascript 进行 S3 调用。我更喜欢将 REST API 与 API Gateway 一起使用,而不是从浏览器直接调用 Lambda 函数。那是因为 Lambda 函数调用依赖于 TokenID,即使您使用 Cognito SDK 注销也是如此。
【讨论】: