4

我正在使用AWS Lambda,Cognito和API Gateway(与Serverless编排)为我的Web应用程序构建API。AWS Lambda - Cognito Identity ID使用相同的登录名更改

用户认证使用Cognito,然后使一个认证请求到API(图案从Serverless Stack教程,其中I抓住他们Cognito ID复制:

event.requestContext.identity.cognitoIdentityId

然后我抢相关联的用户记录与cognitoIdentityId执行基于角色/权限的逻辑并返回相关数据

我一直在遇到的麻烦是,当不同的人(我正在使用其他开发者,目前)使用相同的凭据登录,但是fr om不同的计算机(以及在某些情况下的国家),cognitoIdentityId与他们的请求发送完全不同 - 为同一用户userPool用户记录!

注:我不任何 “联合身份”(即,脸谱等)整合。这是简单的旧电子邮件登录。每个人都使用相同的信用卡,但有些人的请求来自不同的Cognito ID。

这是非常有问题的,因为我没有看到另一种方式来唯一标识与Cognito记录关联的数据库中的用户记录。

问题:我缺少的东西?有一个更好的方法吗?这是预期的行为?


的API是目前实际上插入数据库。由于我们的数据结构仍然不稳定,应用程序远离现场,因此我创建了一个API,它像数据库一样集成了数据库并返回数据,但该数据只存储在JSON文件中。我会重现下面的一些相关代码,以防万一它是相关的。

一个例子拉姆达,用于获取当前用户:

export function getSelf(event, context, callback) { 
    const { cognitoID } = parser(event); 

    const requester = cognitoID && users.find(u => u.cognitoID === cognitoID); 

    try { 
    if (requester) { 
     return callback(null, success(prep(requester, 0))); 
    } else { 
     return authError(callback, `No user found with ID: ${cognitoID}`); 
    } 
    } catch (error) { 
    return uncaughtError(callback, error); 
    } 
} 

那解析器的东西往上顶只是一个实用程序来得到我想要的ID。

相关的用户记录可能是这样的:

{ 
    cognitoID: 'us-west-2:605249a8-8fc1-40ed-bf89-23bc74ecc232', 
    id: 'some-slug', 
    email: '[email protected]', 
    firstName: 'John', 
    lastName: 'Jacob Jingleheimer Schmidt', 
    headshot: 'http://fillmurray.com/g/300/300', 
    role: 'admin' 
    }, 
+1

你能否让我的身份池ID,用户池ID,用户名和其他开发商收到的身份ID? –

+0

@RachitDhall - PMing似乎不是SO上的功能! https://meta.stackexchange.com/questions/431/any-way-to-send-a-personal-message-to-another-user - 我没有看到您的个人资料上的联系信息。如果您通过redshiftdigitalcom.com的sasha给我发电子邮件,我可以回复信息。谢谢! – Sasha

回答

0

Cognito用户池是用来验证用户身份并为您提供JWT令牌。当您想访问任何AWS服务时,您需要AWS凭证(访问密钥和密钥)。这是您应该使用联合身份验证的地方。您从Cognito用户池获得的令牌应与Federated Identities进行交换,以获取AWS凭证以访问其他AWS服务。无服务器堆栈也包含在detail中。

现在,由于您尚未将用户池添加为身份池中的身份验证提供程序,我的观察结果是您从联合身份验证中获取了未经身份验证的身份(您可以从Amazon Cognito控制台确认这一点),这就是为什么它对于每个团队成员而言都不相同。您应该将用户池作为身份验证提供程序添加到身份池中,并按照documentation提供登录映射中所需的信息。

相关问题