如何从 lambda 访问 cognito 联合身份中的身份数据集

Posted

技术标签:

【中文标题】如何从 lambda 访问 cognito 联合身份中的身份数据集【英文标题】:How to access dataset of an identity in cognito federated identities from lambda 【发布时间】:2017-10-24 12:58:55 【问题描述】:

让我从我想要实现的目标的总体描述开始。我正在使用 Lambda、Cognito(联合身份)、API Gateway 等构建无服务器 API。我使用 aws_iam 作为 API Gateway 中的授权方。在某些端点中,我需要访问例如用户电子邮件或用户名或其他任何内容,以便我可以在响应中将其发回(还有未提出请求的用户的数据)。我想我正在寻找对身份池的某种“管理员”访问权限,以便我可以根据 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 的角色中。

【问题讨论】:

【参考方案1】:

首先,您需要 Lambda 函数知道调用者的 Cognito 身份。 API Gateway 中的request context 包含 Cognito id,您可以将其放入发送到 Lambda 函数的负载中,或者使用 Lambda 代理集成并自动包含它。

在 Lambda 中拥有 Cognito id 后,您可以使用它从 Cognito Sync 检索关联的数据集。您可以使用 AmazonCognitoReadOnly 之类的 IAM 策略授予您的 Lambda 函数在 Cognito Sync 上调用 ListRecords API 的权限(允许您访问数据集)。

【讨论】:

谢谢,我已经编辑了这个问题。似乎仍然有问题,但我无法弄清楚它到底是什么。错误中提到的那些凭据是什么?我在哪里可以买到?

以上是关于如何从 lambda 访问 cognito 联合身份中的身份数据集的主要内容,如果未能解决你的问题,请参考以下文章

带有 Cognito 的 AWS Lambda API 网关 - 如何使用 IdentityId 访问和更新 UserPool 属性?

使用带或不带 cognito 的 aws api 网关的联合身份的轻量级 rbac

在 AWS Cognito 和 Lambda 中获取 Facebook 访问令牌

Amazon Cognito - 联合身份的 OAuth 登录

通过 Lambda 到 GetObject 的 Cognito 身份验证角色 - 调用 GetObject 操作时发生错误 (AccessDenied):访问被拒绝

具有 Cognito 联合身份的 AWS AppSync IAM 授权