【问题标题】:Get Cognito user pools groups data in Lambda function在 Lambda 函数中获取 Cognito 用户池组数据
【发布时间】:2018-11-22 14:23:27
【问题描述】:

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

{
    "role" : "$context.identity.role",
}

{
    "arn": $context.identity.userArn
}

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

但是,我将数据作为空字符串获取。请帮我解决这个问题。

谢谢...

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-api-gateway amazon-cognito


    【解决方案1】:

    这可以使用 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]
    

    您可以将其与用户池 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
      }
    

    见: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
      }
    

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

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

    - cognito-idp:ListUsers
    - cognito-idp:AdminListGroupsForUser
    

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

    【讨论】:

      【解决方案2】:

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

      注意这是通过在授权方响应中添加上下文

      {
        Version: "",
        Statement: ...,
        Context: {
           myProperty: "something"
        }
      }
      

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

      编辑: 刚刚注意到您可能正在使用 cognito 授权器而不是自定义授权器,在这种情况下,这可能会对您有所帮助

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

      你想通过

      获取用户信息
      $context.authorizer.claims.sub
      

      【讨论】:

      • 我可以使用 JWT 编码的{"Authorization" : "$input.params().header.get('Authorization')"} 获取数据。这里我的问题是使用令牌数据和组数据(如属于用户池授权中定义的管理员或访客)我可以对访问 lambda 函数中的 API 端点进行身份验证限制吗?
      • 是的,你可以,你只需要在你的 lambda 中设置它。您可以将您的用户数据提取到 cognito 并使用该信息来提供正确的授权方响应,就像这里 docs.aws.amazon.com/apigateway/latest/developerguide/…
      猜你喜欢
      • 1970-01-01
      • 2021-05-05
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2021-09-09
      • 2017-02-17
      相关资源
      最近更新 更多