Я создал приложение Single View в Xcode , а затем следовал руководству по AWS Amplify iOS SDK, чтобы вставить аутентификацию с использованием моего существующего пула пользователей Cognito.Работал прекрасно.
Затем, используя AWS Amplify, я добавил REST API , чтобы позволить моему приложению iOS получить доступ к существующей таблице DynamoDB через сгенерированный Amplify API Gateway и функцию Lambda,Однако мне пришлось все заново подключить, чтобы использовать мой ранее существующий пул пользователей 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 Для получения дополнительной информации, пожалуйста, см. мой Усиление AWSВыпуск iOS SDK .:)
ОБНОВЛЕНИЕ 4 Это обновление имеет приоритет перед моими более ранними обновлениями, потому что теперь кажется ясным - как показывает ошибка выше - что я неправильно вызываю мой REST API через аутентифицированного пользователя Cognitoмоего приложения для iOS.Я заметил, что Amplify создал пул пользователей с двумя клиентами приложения, один для веб-доступа и один для мобильного доступа.У моего ранее существующего пула пользователей был только один клиент приложения, настроенный для веб-доступа.Поэтому я создал новый клиент приложения для мобильного доступа с секретом приложения клиента.
К сожалению, я получаю точно такую же ошибку.Так что мне интересно, нужно ли что-то еще перемонтировать;или, возможно, у меня есть проблема с токеном.Как я уже упоминал в комментарии ниже, возможно, мне не следует использовать токен OIDC, как указано в руководстве по REST API?Может мне стоит использовать AWS Credentials ? END UPDATE 4
Мой API имеет один ресурс /items
, и у меня есть метод ANY
и OPTIONS
.Метод ANY
не имеет параметров строки запроса URL-адреса, указанных для запроса метода.Но для тела запроса указано RequestSchema
типа application/json
.
Моя функция вызова API в точности соответствует , указанному в AWS Amplify iOS SDK для REST API (Iследовал их инструкциям по вызову моей конечной точки API Gateway с помощью авторизатора Cognito User Pools), за исключением того, что я изменил 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
.Строка Guid.
Я почти уверен, что все, что я хочу передать API - это один userId
, чтобы API мог получить все элементы, связанные с ним.Нет необходимости в моем ключе сортировки.
Есть ли проблема с тем, как я делаю этот запрос GET через API-интерфейс REST API шлюза?
ОБНОВЛЕНИЕ 1 Существует два JavaScriptфайлы, связанные с моей функцией Lambda: 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.Но я все еще не вижу шаблона отображения нигде в поле зрения.