Идентификация Cognito с провайдером OpenId и условной политикой DynamoDb - PullRequest
0 голосов
/ 29 апреля 2019

Я использую собственный провайдер открытого идентификатора, и я принимаю мои токены, и я могу использовать идентификаторы Coginto для ограничения доступа к моей базе данных DynamodB.Моя проблема заключается в том, что когда я использую идентификатор coginito с DynamodB: LeadingKeys -> $ {cognito-identity.amazonaws.com:sub} ', он всегда предшествует области aws перед моим userId: Пример: eu-central-1: 1234567

В моем дизайне базы данных мне нужен только идентификатор пользователя (без региона) в качестве основного.Есть ли возможность убрать регион из саб.Я уже пытался изменить Условие на мой пользовательский поставщик 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"
}

1 Ответ

0 голосов
/ 30 апреля 2019

Sub в этом IAM JSON является идентификатором.Идентификационный идентификатор определяется как уникальный идентификационный номер для каждого пользователя, пытающегося получить учетные данные через Cognito Identity Pool.

Нет способа изменить шаблон идентификатора, поскольку формат предопределен архитектурой Cognito.Дополнительную информацию о ролях и политиках Cognito Identity Pool можно найти в этом официальном блоге AWS .

...