在 Lambda 函数中获取 Cognito 用户池组数据

Sai*_*que 5 amazon-web-services amazon-cognito aws-lambda aws-api-gateway

我在 AWS 中使用 Cognito 用户池进行身份验证。当授权用户访问 API 时,我想获取用户所在的 Cognito 用户池组。我尝试过很多方法,比如

{
    "role" : "$context.identity.role",
}
Run Code Online (Sandbox Code Playgroud)

{
    "arn": $context.identity.userArn
}
Run Code Online (Sandbox Code Playgroud)

(以上只是我试过的例子)

但是,我以空字符串的形式获取数据。请帮我解决这个问题。

谢谢...

小智 6

这可以使用 AWS 开发工具包中的 Cognito 身份服务提供商来实现。

您可以从 event.requestContext.identity.cognitoAuthenticationProvider 检索用户子(主题),如下所示:

let userSub = event.requestContext.identity.cognitoAuthenticationProvider.split('CognitoSignIn:')[1]
let UserPoolId = event.requestContext.identity.cognitoAuthenticationProvider.split(',')[0].split('/')[1]
Run Code Online (Sandbox Code Playgroud)

您可以将其与用户池 ID 一起使用,用户池 ID 也可以从 Cognito 身份服务提供商的 listUsers 函数中的上述值中提取,以检索用户用户名:

let userParams = {
    UserPoolId,
    Filter: 'sub=\"' + userSub + '\"',
    Limit: 1
  }

  try {
    const users = await cognitoISP.listUsers(userParams).promise()
    Username = users.Users[0].Username
  } catch (e) {
    // Handle your error
  }
Run Code Online (Sandbox Code Playgroud)

请参阅:https : //docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html#listUsers-property

然后,此用户名和用户池 ID 将与 Cognito 身份服务提供商的 adminListGroupsForUser 函数一起使用,以检索用户所属的组数组:

 try {
    let data = await cognitoISP.adminListGroupsForUser({
      UserPoolId,
      Username
    }).promise()
    groups = data.Groups
  } catch (e) {
    // Handle your error
  }
Run Code Online (Sandbox Code Playgroud)

请参阅:https : //docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html#adminListGroupsForUser-property

您的 lambda 函数需要能够访问您的 Cognito 用户池中的以下内容:

- cognito-idp:ListUsers
- cognito-idp:AdminListGroupsForUser
Run Code Online (Sandbox Code Playgroud)

请参阅:https : //docs.aws.amazon.com/cli/latest/reference/cognito-idp/index.html


deg*_*ege 1

如果您要在授权者中添加上下文,则可以通过以下方式在 lambda 中访问该上下文event.requestContext.authorizer

请注意,这是通过在授权者响应中添加上下文来实现的

{
  Version: "",
  Statement: ...,
  Context: {
     myProperty: "something"
  }
}
Run Code Online (Sandbox Code Playgroud)

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html

编辑:刚刚注意到您可能使用认知授权者而不是自定义授权者,在这种情况下这可能会帮助您

https://forums.aws.amazon.com/thread.jspa?threadID=238437

你想通过获取用户信息

$context.authorizer.claims.sub
Run Code Online (Sandbox Code Playgroud)