Я создал приложение с одним представлением в Xcode, и затем я последовал руководству AWS Amplify iOS SDK, чтобы вставить аутентификацию с использованием моего существующего пула пользователей Cognito. Работает красиво.
Затем с помощью AWS Amplify я добавил REST API, чтобы мое приложение iOS для доступа к уже существующей таблице DynamoDB через API-шлюз, созданный Amplify, и лямбда-функцию. Однако мне пришлось все переподключить, чтобы использовать уже существующий пул пользователей Cognito, потому что Amplify CLI неожиданно создал новый пул пользователей, связанный с созданным им REST API.
Я получаю следующую ошибку при попытке вызвать свой API, и что бы я ни делал, я не могу ее устранить:
Optional("{\"message\":\"Authorization header requires \'Credential\' parameter.
Authorization header requires \'Signature\' parameter. Authorization header requires
\'SignedHeaders\' parameter.
Authorization=abJarWQiOiJyR0NiTHFsbVwvbWdGeXgzcVA1YmNRaV...
403
ОБНОВЛЕНИЕ 5. Для получения дополнительных сведений см. мой Amplify выпуск SDK AWS для iOS. :)
ОБНОВЛЕНИЕ 4. Это обновление имеет приоритет над моими предыдущими обновлениями, поскольку теперь оно, похоже, устраняет указанную выше ошибку, предполагающую, что я неправильно вызываю свой REST API через аутентифицированного пользователя Cognito моего приложения iOS. Я заметил, что Amplify создал пул пользователей с двумя клиентами приложений, один для доступа в Интернет, а другой - для мобильного доступа. В моем ранее существовавшем пуле пользователей был только один клиент приложения, предназначенный для доступа в Интернет. Итак, я создал новый клиент приложения для мобильного доступа с секретом клиента приложения.
К сожалению, я получаю ту же самую ошибку. Так что мне интересно, нужно ли что-то еще перенастроить; или, возможно, у меня проблема с токеном. Как я уже упоминал в комментарии ниже, возможно, мне не следует использовать токен OIDC, как указано в руководстве по REST API? Может быть, мне следует использовать учетные данные AWS? КОНЕЦ ОБНОВЛЕНИЯ 4
В моем API есть один ресурс /items
, а у меня есть ANY
и OPTIONS
методы. Метод ANY
не имеет параметров строки запроса URL, указанных для запроса метода. Но для тела запроса RequestSchema
указан тип application/json
.
Моя функция вызова API - это точно та , указанная в AWS Amplify iOS SDK для REST API (я выполнил их инструкции по вызову конечной точки шлюза API с помощью авторизатора пользовательских пулов Cognito), за исключением того, что я изменил httpMethodName
с POST
на GET
, потому что POST вызывал сбой. Вот как это выглядит:
func doInvokeAPI(token:String) {
// change the method name, or path or the query string parameters here as desired
let httpMethodName = "GET"
// the guid is the partition key for the DynamoDB table
let URLString = "/items/178dc797-4e3d-5bc4-815f-a280536fcd3a"
//let queryStringParameters = ["key1":"{value1}"]
let headerParameters = [
"Content-Type": "application/json",
"Accept": "application/json",
"Authorization": token
]
//let httpBody = "{ \n " +
// "\"key1\":\"value1\", \n " +
// "\"key2\":\"value2\", \n " +
// "\"key3\":\"value3\"\n}"
// Construct the request object
let apiRequest = AWSAPIGatewayRequest(httpMethod: httpMethodName,
urlString: URLString,
queryParameters: nil,
headerParameters: headerParameters,
httpBody: nil)
...
...
invocationClient.invoke(apiRequest).continueWith { (task: AWSTask) -> Any? in
if let error = task.error {
print("Error occurred: \(error)")
// Handle error here
return nil
}
// Handle successful result here
let result = task.result!
let responseString = String(data: result.responseData!, encoding: .utf8)
print(responseString as Any)
print(result.statusCode)
return nil
}
}
Приведенная выше ошибка печатается этим print(responseString)
.
Моя таблица DynamoDB ожидает: ключ раздела userId
. Управляющая строка.
Я почти уверен, что все, что я хочу передать API, - это один userId
, чтобы API мог получить все связанные с ним элементы. Мой ключ сортировки не нужен.
Есть ли проблема с тем, как я выполняю этот GET-запрос через API-интерфейс API Gateway REST?
ОБНОВЛЕНИЕ 1. С моей лямбда-функцией связаны два файла JavaScript: index.js
и app.js
, созданные Amplify.
index.js
очень короткий:
const awsServerlessExpress = require('aws-serverless-express');
const app = require('./app');
const server = awsServerlessExpress.createServer(app);
exports.handler = (event, context) => {
console.log(`EVENT: ${JSON.stringify(event)}`);
awsServerlessExpress.proxy(server, event, context);
};
И app.js
состоит в некоторой настройке (первый снимок экрана), а затем в серии методов для get
, put
, post
, delete
. Я просто привожу два скриншота для get
методов - темы этого вопроса).
ОБНОВЛЕНИЕ 2 Вот что я вижу, когда нажимаю на запрос интеграции для ANY
метода моего API. Обратите внимание, что у меня нет раскрывающегося списка для шаблона сопоставления.
ОБНОВЛЕНИЕ 3 Но у меня есть Prod
этап, созданный Amplify. Но я все еще нигде не вижу шаблона отображения.
AWS_IAM
. Я уверен, что должно бытьCOGNITO_USER_POOLS
. Похоже, мне нужно создать нового авторизатора для этого API. Я попробую. - person motivus   schedule 12.02.2019