使用OpenId提供程序和条件DynamoDb策略进行Cognito身份识别

问题描述 投票:0回答:1

我使用自定义开放id提供程序,aws接受我的令牌,我可以使用coginto身份池来限制对我的dynamodb数据库的访问。我的问题是当我使用coginito身份与dynamodb:LeadingKeys - > $ {cognito-identity.amazonaws.com:sub}时,它总是在我的userId之前添加aws-region:例如:eu-central-1:1234567

在我的数据库设计中,我只需要userId(没有区域)作为主要。有没有可能从sub中删除该区域。我已经尝试将条件更改为我的自定义openid提供程序(如所描述的文档) - 但这始终不起作用

我的政策:

- Effect: Allow
  Action: 
    - dynamodb:DescribeTable
    - dynamodb:Query
    - dynamodb:GetItem
    - dynamodb:PutItem
    - dynamodb:UpdateItem
    - dynamodb:DeleteItem
    - dynamodb:BatchWriteItem
  Resource:
    - arn:aws:dynamodb:eu-central-1:123:table/table
  Condition:
    ForAllValues:StringEquals:
      dynamodb:LeadingKeys: ${custom.open.id/openid:sub}

我的Javascript代码如下所示:

const Logins = {}
  Logins['custom.open.id'] = accessToken; // my own openId access JWT Token

  // Add the User's Id Token to the Cognito credentials login map.
  const credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: identityPoolId,
    Logins: Logins
  });

  return credentials.getPromise()
    .then( error => {
      if (error) {
        return Promise.reject(error)
      }

      if (credentials.needsRefresh() === true) {
        return credentials.refreshPromise()
      }
      return null;
    })
    .then(error => {
      if (error) {
         return Promise.reject(error)
      }

      console.log('Successfully logged!', credentials.data);

      const dynamoDb = new AWS.DynamoDB.DocumentClient({
        credentials: credentials,
        region: region,
      });

      const params = {
        TableName: "table",
        KeyConditionExpression: "#userId = :userId",
        ExpressionAttributeNames: {
          "#userId": "userId"
        },
        ExpressionAttributeValues: {
          ":userId": currentUserId
        }
      }

      return dynamoDb.query(params).promise();
    })
    .then(data => {
      console.log("DynamoDb", data)
    })

我的JWT Access令牌的内容是:

{
  "sub": "123",
  "nonce": "VRN3voQIhS6Nb6AzSsv907GxPnKc0szo",
  "sid": "4fd7fd36-5a36-40e6-b381-b004a52be473",
  "at_hash": "wF9BX32r6yQqvV5j0QGj8g",
  "s_hash": "NzqHNkNF7FfCJa1tKudjTg",
  "aud": "test_client",
  "exp": 1556560701,
  "iat": 1556557101,
  "iss": "https://custom.open.id/openid"
}
amazon-web-services amazon-dynamodb amazon-cognito amazon-iam
1个回答
0
投票

此IAM JSON中的Sub是身份ID。身份ID被定义为尝试通过Cognito身份池获取凭据的每个用户的唯一身份。

无法更改身份标识的模式,因为格式是由Cognito的体系结构预定义的。有关Cognito Identity Pool的角色和策略的更多详细信息,请参阅此official AWS Blog Post

© www.soinside.com 2019 - 2024. All rights reserved.