#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. Это оно.