Создайте нового пользователя с помощью AWS APIGateway, защищенного с помощью Cognito — как разрешить доступ пользователям до его создания?

#aws-api-gateway #amazon-cognito

Вопрос:

У меня есть API в шлюзе API AWS, защищенный AWS-Cognito. Чтобы использовать конечную точку, пользователь должен быть распознан Cognito, который вернет токен.

Вопрос здесь связан с процессом СОЗДАНИЯ ПОЛЬЗОВАТЕЛЯ. Чтобы использовать эту конечную точку, пользователь должен существовать в Cognito, затем получить токен и использовать его для подключения к конечной точке СОЗДАНИЯ ПОЛЬЗОВАТЕЛЯ. Но в момент создания пользователя в базе данных (api-конечная точка) пользователь не создан в Cognito и не имеет разрешения на получение доступа к API.

Итак, каким должен быть наилучший подход к этому процессу?

Ответ №1:

Вам не нужно всегда использовать авторизатор ТОКЕНОВ. Шлюз API позволяет настроить другой тип авторизатора: ЗАПРОС.

В этом случае все зависит от вас, как вы хотите определить, имеет ли кто-то (или нет) право совершать вызов вашей конечной точки API.

event Будет выглядеть примерно так (взято из документации AWS):

 {
  "type": "REQUEST",
  "methodArn": "arn:aws:execute-api:us-east-1:123456789012:abcdef123/test/GET/request",
  "resource": "/request",
  "path": "/request",
  "httpMethod": "GET",
  "headers": {
    "X-AMZ-Date": "20170718T062915Z",
    "Accept": "*/*",
    "HeaderAuth1": "headerValue1",
    "CloudFront-Viewer-Country": "US",
    "CloudFront-Forwarded-Proto": "https",
    "CloudFront-Is-Tablet-Viewer": "false",
    "CloudFront-Is-Mobile-Viewer": "false",
    "User-Agent": "..."
  },
  "queryStringParameters": {
    "QueryString1": "queryValue1"
  },
  "pathParameters": {},
  "stageVariables": {
    "StageVar1": "stageValue1"
  },
  "requestContext": {
    "path": "/request",
    "accountId": "123456789012",
    "resourceId": "05c7jb",
    "stage": "test",
    "requestId": "...",
    "identity": {
      "apiKey": "...",
      "sourceIp": "...",
      "clientCert": {
        "clientCertPem": "CERT_CONTENT",
        "subjectDN": "www.example.com",
        "issuerDN": "Example issuer",
        "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1",
        "validity": {
          "notBefore": "May 28 12:30:02 2019 GMT",
          "notAfter": "Aug  5 09:36:04 2021 GMT"
        }
      }
    },
    "resourcePath": "/request",
    "httpMethod": "GET",
    "apiId": "abcdef123"
  }
}
 

Затем вам нужно сообщить шлюзу API, что он может передать этот ответ через:

 {
    "principalId": "any-identifier-you-choose-like-uuid",
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "execute-api:Invoke",
                "Effect": "Allow",
                "Resource": "arn:aws:execute-api:eu-west-1:111111111111:abcdef/prod/GET/myresource"
        ]
    }
}
 

Также используется политика кэширования, но этого должно быть достаточно для начала.

Комментарии:

1. Дай мне знать, если я понял. Вы создали правило IAM, которое позволяет обычному пользователю, указанному в principalId , вызывать определенную конечную точку. Затем я должен использовать это конкретное правило, прикрепленное на веб-странице, которая создала пользователя и вызовет пользователя/ конечную точку POST. правильно ли это?

2. Здесь нет никакой роли IAM. Все, что вы возвращаете, — это программный документ. Основной идентификатор-это ваш собственный идентификатор. Это может быть идентификатор вашего пользователя в вашей собственной базе данных. Поэтому вы звоните в API-шлюз. Затем он вызывает вашего уполномоченного. Он отвечает этим документом политики, в котором говорится, что вы уполномочены вызывать указанную конечную точку API. Это оно.