如何从 lambda 访问认知联合身份中的身份数据集
How to access dataset of an identity in cognito federated identities from lambda
让我从总体描述我要实现的目标开始。我正在使用 Lambda、Cognito(联合身份)、API 网关等构建无服务器 API。我在 API 网关中使用 aws_iam 作为授权方。在某些端点中,我需要访问例如用户电子邮件或用户名或其他任何内容,以便我可以在响应中将其发回(还有未发出请求的用户的数据)。我想我正在寻找对身份池的某种 "admin" 访问权限,以便我可以根据 cognitoIdentityId 检索数据。
现在,就我而言,此数据存储在 Cognito 的数据集中。问题是,我如何从我的 Lambda 函数 (node.js) 访问这些数据?这是一个好方法吗?我应该使用其他东西而不是数据集吗?某处有工作示例吗?
如有必要,我很乐意提供更多详细信息。
谢谢
编辑#1:
这是我的 lambda 函数的代码:
module.exports.getDataSet = (event, context, callback) => {
console.log("event: " + JSON.stringify(event));
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: IDENTITY_POOL_ID
});
try {
AWS.config.credentials.get(function() {
var client = new AWS.CognitoSync();
var params = {
DatasetName: 'userinfo',
IdentityId: event.requestContext.identity.cognitoIdentityId,
IdentityPoolId: IDENTITY_POOL_ID
};
client.listRecords(params, function (err, data) {
if (err) {
console.log(JSON.stringify(err));
} else {
console.log(data);
}
});
});
} catch (ex) {
callback(ex);
}
};
这就是我在调用 listRecords
时在 err
中得到的结果:
{
"message": "Missing credentials in config",
"code": "CredentialsError",
"time": "2017-05-26T08:42:39.298Z",
"requestId": "46712a9b-41ef-11e7-9e3c-074afafb3349",
"statusCode": 400,
"retryable": false,
"retryDelay": 21.688148977111666,
"originalError": {
"message": "Could not load credentials from CognitoIdentityCredentials",
"code": "CredentialsError",
"time": "2017-05-26T08:42:39.298Z",
"requestId": "46712a9b-41ef-11e7-9e3c-074afafb3349",
"statusCode": 400,
"retryable": false,
"retryDelay": 21.688148977111666,
"originalError": {
"message": "Unauthenticated access is not supported for this identity pool.",
"code": "NotAuthorizedException",
"time": "2017-05-26T08:42:39.298Z",
"requestId": "46712a9b-41ef-11e7-9e3c-074afafb3349",
"statusCode": 400,
"retryable": false,
"retryDelay": 21.688148977111666
}
}
}
编辑#2:
通过移除解决
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: IDENTITY_POOL_ID
});
从代码中添加 AmazonCognitoReadOnly
策略到调用 lambda 的角色。
首先,您需要 Lambda 函数知道调用者的 Cognito 身份。 API 网关中的 request context 包括 Cognito id,您可以将其放入发送到 Lambda 函数的负载中,或者使用 Lambda 代理集成并自动包含它。
在 Lambda 中拥有 Cognito ID 后,您可以使用它从 Cognito Sync 检索关联的数据集。您可以使用像 AmazonCognitoReadOnly 这样的 IAM 策略来授予 Lambda 函数在 Cognito Sync 上调用 ListRecords API 的权限(这使您可以访问数据集)。
让我从总体描述我要实现的目标开始。我正在使用 Lambda、Cognito(联合身份)、API 网关等构建无服务器 API。我在 API 网关中使用 aws_iam 作为授权方。在某些端点中,我需要访问例如用户电子邮件或用户名或其他任何内容,以便我可以在响应中将其发回(还有未发出请求的用户的数据)。我想我正在寻找对身份池的某种 "admin" 访问权限,以便我可以根据 cognitoIdentityId 检索数据。
现在,就我而言,此数据存储在 Cognito 的数据集中。问题是,我如何从我的 Lambda 函数 (node.js) 访问这些数据?这是一个好方法吗?我应该使用其他东西而不是数据集吗?某处有工作示例吗?
如有必要,我很乐意提供更多详细信息。
谢谢
编辑#1:
这是我的 lambda 函数的代码:
module.exports.getDataSet = (event, context, callback) => {
console.log("event: " + JSON.stringify(event));
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: IDENTITY_POOL_ID
});
try {
AWS.config.credentials.get(function() {
var client = new AWS.CognitoSync();
var params = {
DatasetName: 'userinfo',
IdentityId: event.requestContext.identity.cognitoIdentityId,
IdentityPoolId: IDENTITY_POOL_ID
};
client.listRecords(params, function (err, data) {
if (err) {
console.log(JSON.stringify(err));
} else {
console.log(data);
}
});
});
} catch (ex) {
callback(ex);
}
};
这就是我在调用 listRecords
时在 err
中得到的结果:
{
"message": "Missing credentials in config",
"code": "CredentialsError",
"time": "2017-05-26T08:42:39.298Z",
"requestId": "46712a9b-41ef-11e7-9e3c-074afafb3349",
"statusCode": 400,
"retryable": false,
"retryDelay": 21.688148977111666,
"originalError": {
"message": "Could not load credentials from CognitoIdentityCredentials",
"code": "CredentialsError",
"time": "2017-05-26T08:42:39.298Z",
"requestId": "46712a9b-41ef-11e7-9e3c-074afafb3349",
"statusCode": 400,
"retryable": false,
"retryDelay": 21.688148977111666,
"originalError": {
"message": "Unauthenticated access is not supported for this identity pool.",
"code": "NotAuthorizedException",
"time": "2017-05-26T08:42:39.298Z",
"requestId": "46712a9b-41ef-11e7-9e3c-074afafb3349",
"statusCode": 400,
"retryable": false,
"retryDelay": 21.688148977111666
}
}
}
编辑#2:
通过移除解决
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: IDENTITY_POOL_ID
});
从代码中添加 AmazonCognitoReadOnly
策略到调用 lambda 的角色。
首先,您需要 Lambda 函数知道调用者的 Cognito 身份。 API 网关中的 request context 包括 Cognito id,您可以将其放入发送到 Lambda 函数的负载中,或者使用 Lambda 代理集成并自动包含它。
在 Lambda 中拥有 Cognito ID 后,您可以使用它从 Cognito Sync 检索关联的数据集。您可以使用像 AmazonCognitoReadOnly 这样的 IAM 策略来授予 Lambda 函数在 Cognito Sync 上调用 ListRecords API 的权限(这使您可以访问数据集)。