Amazon web services AWS Lambda-Can';t在lambda函数中获取Cognito用户数据

Amazon web services AWS Lambda-Can';t在lambda函数中获取Cognito用户数据,amazon-web-services,aws-api-gateway,amazon-cognito,Amazon Web Services,Aws Api Gateway,Amazon Cognito,我试图在lambda函数中获取Cognito用户数据。我试图使用身体映射模板将其传递给lambda { "cognito-authentication-provider" : "$context.identity.cognitoAuthenticationProvider", "cognito-authentication-type" : "$context.identity.cognitoAuthenticationType", "cognito-identity-id

我试图在lambda函数中获取Cognito用户数据。我试图使用
身体映射模板将其传递给lambda

{
    "cognito-authentication-provider" : "$context.identity.cognitoAuthenticationProvider",
    "cognito-authentication-type" : "$context.identity.cognitoAuthenticationType",
    "cognito-identity-id" : "$context.identity.cognitoIdentityId",
    "cognito-identity-pool-id" : "$context.identity.cognitoIdentityPoolId",
}
但是,在lambda函数中,数据是空的

'cognito-authentication-provider': '',
'cognito-authentication-type': '',
'cognito-identity-id': '',
'cognito-identity-pool-id': ''
请帮我解决这个问题

谢谢

编辑: 添加了Cognito身份验证
dev虚拟身份验证
as

您正在使用cognito标识池凭据引用API请求的上下文变量,当您使用cognito用户池授权器时,这些将不可用。


您正在使用cognito标识池凭据引用API请求的上下文变量,当您使用cognito用户池授权器时,这些将不可用。

以Dilip Kola的答案为基础。对于您使用的授权方法,您尝试访问的上下文变量似乎不存在

我能看到的将令牌信息获取到底层Lambda服务的唯一方法是向下传递整个令牌,并在Lambda中使用适合您所使用语言的库打开它

您可以通过向身体映射模板添加一行来传递标记

{"Authorization" : "$input.params().header.get('Authorization')"}
Cognito ID令牌是JWT(JSON Web令牌)的形式。
ISS
声明的格式为
https://cognito-idp.{region}.amazonaws.com/{userPoolId}

更新-包括有关用户组的信息

Cognito标识令牌不包含获得该令牌的用户的用户组

要限制特定用户组中的个人访问API,您必须使用Cognito联合身份将身份验证方法更改为AWS_IAM Authorizer


另一种方法是使用自定义属性,比如Cognito中的role,将某些用户标记为Admin、User等(因为这些可以在id令牌中传递),然后计算该自定义属性。如果你要走这条路,我会转向一个自定义的Lambda授权者身份验证方法。这样,您可以在验证令牌的同时检查自定义属性,因此如果用户没有正确的访问权限,请求永远不会到达后端。

以Dilip Kola的回答为基础。对于您使用的授权方法,您尝试访问的上下文变量似乎不存在

我能看到的将令牌信息获取到底层Lambda服务的唯一方法是向下传递整个令牌,并在Lambda中使用适合您所使用语言的库打开它

您可以通过向身体映射模板添加一行来传递标记

{"Authorization" : "$input.params().header.get('Authorization')"}
Cognito ID令牌是JWT(JSON Web令牌)的形式。
ISS
声明的格式为
https://cognito-idp.{region}.amazonaws.com/{userPoolId}

更新-包括有关用户组的信息

Cognito标识令牌不包含获得该令牌的用户的用户组

要限制特定用户组中的个人访问API,您必须使用Cognito联合身份将身份验证方法更改为AWS_IAM Authorizer


另一种方法是使用自定义属性,比如Cognito中的role,将某些用户标记为Admin、User等(因为这些可以在id令牌中传递),然后计算该自定义属性。如果你要走这条路,我会转向一个自定义的Lambda授权者身份验证方法。通过这种方式,您可以在验证令牌的同时检查自定义属性,因此如果用户没有正确的访问权限,请求永远不会到达后端。

您是否验证$context.identity.cognitoAuthenticationProvider是否确实包含您希望它包含的内容?@ThomasVdBerge,我想知道用户所在的cognito用户池组。@KMo是。我正在使用Cognito用户池授权程序。您是否验证$context.identity.cognitoAuthenticationProvider是否确实包含您希望它包含的内容?@ThomasVdBerge实际上,我想知道用户所在的Cognito用户池组。@KMo是的。我正在使用Cognito用户池授权者。我已经在
Cognito用户池授权者
中创建了组。我想获取特定人员的组数据。我已经在
cognito用户池授权器
中创建了组。我想获取特定人员的组数据。@K Mo谢谢。现在我可以通过令牌获取数据。我想问另一个问题,我想让像管理员这样的少数人从应用程序访问API端点。在用户池中,如果用户属于管理组,那么他可以访问API端点。怎么做?请帮帮我,我已经更新了答案。我希望这有帮助。@K Mo谢谢。你能为我提供资源(视频或文档)来遵循和实施同样的方法吗。我会对我很有帮助的。@K Mo谢谢。现在我可以通过令牌获取数据。我想问另一个问题,我想让像管理员这样的少数人从应用程序访问API端点。在用户池中,如果用户属于管理组,那么他可以访问API端点。怎么做?请帮帮我,我已经更新了答案。我希望这有帮助。@K Mo谢谢。你能为我提供资源(视频或文档)来遵循和实施同样的方法吗。我会对我很有帮助的。