iOS Swift, пул пользователей AWS Cognito, невозможно обновить токен доступа

Посмотрел похожие вопросы SO, которые не помогли мне решить проблему.

Я использую пулы пользователей AWS Cognito в нашем приложении для iOS. Мы можем успешно создать и войти в систему пользователя. Однако примерно через час токен доступа недоступен, как я понимаю из документации AWS Cognito, iOS SDK автоматически обновляется (также упоминается здесь) и получает токен, когда он недоступен, однако я не вижу такого поведения. В приведенном ниже коде показано, как я пытаюсь получить токен доступа.

Использование iOS SDK AWSCognitoIdentityProvider 2.6.7

Пожалуйста, посоветуйте, как я могу решить проблему.

let mySession = self.pool.currentUser()?.getSession()

guard let accessToken = mySession?.result?.accessToken?.tokenString as? String else {
  print("Unable to obtain access token")
  self.handleSignOut() // Signing out the user since there is no access token       
  return
}

person SpaceX    schedule 07.03.2018    source источник
comment
ты решил это?   -  person user3239711    schedule 10.04.2018
comment
нет .. обновлю, если я решу эту проблему   -  person SpaceX    schedule 24.04.2018
comment
Я тоже сталкиваюсь с этой же проблемой. Легко увидеть, когда он истечет, но почему нет никакой полезной документации о том, как обновить сеанс.   -  person John Riselvato    schedule 28.05.2018
comment
Удалось ли вам разрешить сеанс обновления с помощью Refresh Token для iOS. Я не могу найти соответствующую документацию о том, как мы можем обновить сеанс с помощью AWSCognitoIdentityProvider.   -  person Malik    schedule 18.09.2018


Ответы (2)


getSession() возвращает AWTask.

Вы должны получить доступ к tokenString в обратном вызове.

У меня работает следующий код:

self.pool.currentUser()?.getSession().continueWith { task in

    if task.error == nil {
        let session = task.result! as AWSCognitoIdentityUserSession
        guard let accessToken = session.idToken?.tokenString; as? String else {
           print("Unable to obtain access token")
           self.handleSignOut() // Signing out the user since there is no access token       
        }
    }
}
person Mago Solis    schedule 17.06.2018
comment
это аутентифицирует вас? - person John Riselvato; 26.07.2018
comment
После обновления токена с помощью метода getSession() метод не вызывается. Мне нужно перезапустить приложение, а затем оно получает ответ API. Есть ли способ продолжить после обновления токена и не нужно повторно запускать приложение? - person Gautam Sareriya; 02.05.2019

Вы не должны кэшировать session или tokenString. Если вы это сделаете, библиотека AWS не сможет выполнить код, чтобы узнать, когда истечет срок его действия, или обновить его, когда это произойдет. Из того, что я прочитал (и что мы сделали с SDK Cognito для Android и iOS), правильный способ — вызывать getSession() каждый раз, когда вам нужен токен. Под капотом библиотека AWS либо немедленно вернет вам кешированный сеанс, либо выполнит работу по обновлению сеанса (т. е. получит новый токен).

Если вы не вызываете getSession() из основного потока, вы можете просто заблокировать AWTask, возвращенный из getSession(). В противном случае это может быть нетривиально реализовать, потому что вы и AWTask будете завершены позже.

Вы можете проверить свойство expirationTime сеанса и использовать токен из него, если срок его действия не истек. Но вы все равно будете обрабатывать случай, когда срок действия сеанса истек, и библиотеке AWS необходимо выполнить асинхронную работу для обновления.

person kbyrd    schedule 15.05.2019