Как обрабатывать просроченные токены авторизации в Xamarin MobileServiceClient? - PullRequest
0 голосов
/ 06 июня 2018

Я использую аутентификацию клиентского потока в Xamarin.Forms и пытаюсь выяснить, как обрабатывать истечение срока действия токена аутентификации.

Мой код:

При первом входе в систему пользовательвходит в систему с помощью собственного SDK Facebook, и я передаю access_token MobileServiceClient для возврата аутентифицированного пользователя.

var user = await client.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token).ConfigureAwait(false);

Затем я сохраняю UserId и MobileServiceAuthenticationToken пользователя в локальных настройках (используяXam.Plugins.Settings плагин).В следующий раз, когда пользователь откроет приложение, я установлю пользователя из настроек и пропущу ручной вход:

if (!string.IsNullOrWhiteSpace(Settings.AuthToken) && !string.IsNullOrWhiteSpace(Settings.UserId))
{
    client.CurrentUser = new MobileServiceUser(Settings.UserId);
    client.CurrentUser.MobileServiceAuthenticationToken = Settings.AuthToken;
}

Мой вопрос:

Это прекрасно работает.Тем не менее, я знаю, что у MobileServiceAuthenticationToken есть срок действия.Что произойдет в моем приложении, когда истечет срок годности?Как обновить токен, не требуя повторного входа пользователя в Facebook?Я пробовал метод RefreshUserAsync() MobileServiceClient, но получаю следующее исключение:

Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException: Обновить не удалось с ошибкой 400 Bad Request.Поставщик удостоверений не поддерживает обновление, или пользователь не вошел в систему с достаточным разрешением.

Есть ли способ проверить это?(поскольку срок действия токена 3 месяца.) Спасибо за помощь!

1 Ответ

0 голосов
/ 12 июня 2018

Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException: Обновить не удалось с ошибкой 400 Bad Request.Поставщик удостоверений не поддерживает обновление, или пользователь не вошел в систему с достаточными разрешениями.

Поскольку вы используете аутентификацию клиентского потока, вы не можете использовать RefreshUserAsync() для обновления MobileServiceAuthenticationToken,Ваш мобильный бэкэнд не кэширует связанные access_token и refresh_token для обновления токена аутентификации.

Есть ли способ проверить это?(поскольку срок действия токена 3 месяца.) Спасибо за помощь!

AFAIK, срок действия MobileServiceAuthenticationToken по умолчанию равен одному часу, вы можете использовать https://jwt.io/ для декодированиясвой токен и проверьте свойство exp, затем используйте https://www.epochconverter.com/ для преобразования вашей временной метки в человеческую дату.

По вашему требованию вы можете следить за блогом Адриана Холла о Caching Tokens и обратитесь к IsTokenExpired методу для декодирования вашего аутентификационного токена и отметьте exp, а затем вручную обновите аутентификационный токен.

Насколько я понимаю, есть два подхода для достижения вашей цели:

Вам необходимо кэшировать facebook access_token на стороне вашего мобильного клиента, после того как вы вручную проверили идентификационный токен и обнаружили, что он истек, вы можете вручную выполнить следующий код для обновления токена и явно обновить локальный кеш.

var user = await client.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token).ConfigureAwait(false);

Примечание: Ваш фейсбук access_token имеет дату окончания срока действия, поэтому, если ваш access_token exпосле этого, вам нужно снова заставить пользователя войти в Facebook, прежде чем получить новый аутентификационный токен.

Или вы можете создать свою пользовательскую конечную точку для обновления аутентификационного токена и явно задать длительный срок жизни для нового аутентификационного токена, подробноможет последовать аналогичная проблема . Примечание: Для обработки истечения срока действия на стороне клиента необходимо обновить токен до истечения срока действия вашего локального аутентификационного токена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...