2017-02-01 2 views
4

У меня проблемы с авторизацией моего API на AWS для пула пользователей Cognito через HTTP-заголовки (без AWS API Gateway SDK).AWS API Gateway + Cognito User Pool Authorizer + Lambda - Какие HTTP-заголовки и разрешения необходимо установить?

Моя установка:

На AWS:

  • Отдыхают API реализован на AWS Lambda (развернутых через Serverless рамках),
  • экспонируется через API шлюза с помощью типа LAMBDA_PROXY (без ручного отображения)
  • Авторизация на шлюзе API через предоставленный «авторизованный пул пользователей Cognito» (нет опции «AWS_IAM», без специального кодированного авторизатора)
  • Тестирование API через Postman

На клиенте Ios

  • Регистрация Вход с помощью AWS Cognito (SDK и UI скопированной из AWS Mobile Hub генерируемой демонстрационный Xcode проект)/
  • Доступ к жесткому диску в остальном по API с помощью RestKit, не с использованием AWSAPIGateway SDK

Что работает:

Методы API должным образом развернуты без сервера.

Я могу вызвать публикацию (не настроенную на использование пула пользователей) через Postman.

Для частных методов API, я могу видеть Cognito пользователь пул Authorizer настроить в API консоли управления шлюзом, в том числе «Удостоверение маркеров источника» установлен в method.request.header.Authorization (по умолчанию), как описано here

КСН, Я могу правильно зарегистрироваться и войти в систему как пользователь. Я могу сбросить данные Credentials AWS на консоль, показывая AccessKey, SecretKey и SessionKey.

В iOS я могу запросить открытый API через RestKit.

Когда я пытаюсь вызвать частный метод API через Postman, я возвращаю ошибку HTTP 401 с телом {"message": "Unauthorized"}. (. Что ожидается, без установки каких-либо разрешений)

Что не удается:

Чтобы проверить авторизацию в Почтальон, я попытался

В результате всегда была ошибка 401.

Что мне нужно установить в качестве заголовков HTTP, чтобы разрешить вызовы в частный API? "Authorization" должен работать - возможно, мне не хватает прав на роль?

Как лучше отладить поток разрешений/авторизации?

+1

Вы упоминаете использование 'SessionKey'; заключается в том, что в отношении одного из идентификаторов идентификатора или «токена доступа»? в других терминах, насколько мне известно, это должен быть «токен веб-ключа JSON». по http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html –

+0

Спасибо, Питер, вы, кажется, правы, там используются два типа токенов, и для меня было непонятно, какой из них использовать. Если ожидается JWT, я не нашел никакой информации о том, как его получить (в Android SDK есть метод http://docs.aws.amazon.com/cognito/latest/developerguide/using-amazon- cognito-user-identity-pools-android-sdk.html, но не в SDK iOS http://docs.aws.amazon.com/cognito/latest/developerguide/using-amazon-cognito-user-identity-pools- ios-sdk.html) – thomers

+1

Я понимаю, что вы подписываете своего пользователя с помощью метода, подобного 'getSession (имя пользователя, пароль: пароль, validationData: nil, scopes: nil)', который должен возвращать объект 'session' типа' AWSCognitoIdentityUserSession'; токен доступен как 'session.accessToken? .tokenString' –

ответ

2

Это как получить сеанс:

AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:AWSCognitoUserPoolsSignInProvi‌​derKey]; 
AWSCognitoIdentityUser *user = [pool currentUser]; 
AWSTask<AWSCognitoIdentityUserSession *> *task = [user getSession]; 

Затем task.result.idToken.tokenString можно установить в качестве заголовка «авторизации», и она работает.

Спасибо Петру за отзыв!

1

Для прошивкой (по состоянию на 11 мая 2017)

let headerParameters = [ 
       "Content-Type": "application/json", 
       "Accept": "application/json", 
       "AccessKey" : awsCredentials.accessKey, 
       "SecretKey" : awsCredentials.secretKey, 
       "SessionKey" : awsCredentials.sessionKey, 
       "Authorization" : 
       AWSCognitoUserPoolsSignInProvider.sharedInstance().getUserPool().currentUser()?.getSession().result?.idToken?.tokenString 
      ] 

где awsCredentials вы можете получить при успешном входе в систему и хранить его где-нибудь в вашем собственном коде (AuthorizationService?). Я сохранил значение «Авторизация» так долго, чтобы разработчикам было легче узнать полное местоположение этого скрытого объекта. Вы должны хранить его в своем собственном классе AuthorizationService (или в качестве члена расширения для AwsCredentials?)

+0

Спасибо - это в основном то, что я описал ниже. Мне не нужно было устанавливать заголовки 'AccessKey',' SecretKey' и 'SessionKey', просто' Authorization' было достаточно. – thomers

0

Если вы используете Swift 3, вы можете получить токен идентичности по приведенному ниже коду.

 let pool = AWSCognitoUserPoolsSignInProvider.sharedInstance().getUserPool() 
     let currentUser = pool.currentUser() 
     let task = currentUser?.getSession() 
     let identityToken = task?.result?.idToken?.tokenString 
     print("identityToken: \(String(describing: identityToken))") 
Смежные вопросы