Авторизация является основой основ практически для всех современных мобильных приложений, но получить права на неё достаточно сложно. В прошлом использование известных автору методов стало плохой практикой, хоть и позволяло быстро загружать приложения в магазины приложений. Самым распространенным из замеченных подходом при авторизации мобильных приложений с помощью Azure было применение волшебной строки:
1 | user = await client.LoginAsync(MobileServiceAuthenticationProvider.Facebook); |
Несмотря на то, что данный подход — самый простой способ авторизации пользователей, вскоре становится понятно, что в нем есть ограничения, что делает его неподходящим для выпускаемых приложений. Этот подход хорош тем, что он кроссплатформенен и не нужно лезть из кожи вон для конфигурации. Можно авторизовать приложение за пару минут с помощью одной строки кода. Главное ограничение данного подхода — невозможность авторизации приложения в различных вариантах backend’а. Это означает, что нельзя протестировать приложение в промежуточной версии backend’а, возможно это сделать только в среде выпуска приложения. Чтобы избежать этого, необходимо оптимизировать авторизацию приложения с помощью нативного SDK поставщика авторизации, и далее передать токен доступа в backend, чтоб пройти верификацию в нем.
Зачем использовать нативные SDK?
Нативные SDK раскрывают огромное количество функций для приложения. Рассмотрим Facebook компонент для iOS. Он позволяет быстро авторизовать пользователя переключением на нативное приложение в iOS 9 или предыдущих версиях. IOS 10 уже использует SafariViewController, позволяющий использовать файлы cookies, чтобы найти существующий токен пользователя. Также можно запросить больше сведений о пользователе, чтобы создать собственный объект пользователя для использовании в приложении, такого как список друзей или интересов.
Регистрация для авторизации через Facebook
Прежде чем станет возможным настроить приложение для доступа к авторизации пользователей через социальную сеть, нужно зарегистрироваться у поставщика авторизации. При использовании Facebook нужно перейти на страницу разработчиков этой соцсети и создать новое приложение Facebook. Создав новое приложение, разработчик получает уникальный App ID. Далее необходимо проверить работоспособность URL адреса. Если используется служба приложений Azure, то URL адрес будет выглядеть следующим образом:
1 | https://[AppServiceApplicationURL]/.auth/login/facebook/callback |
Начало работы
Как вариант можно использовать Facebook SDK для iOS, доступный для загрузки с NuGet. Это Xamarin. Привязка iOS к официальному SDK обеспечена Facebook, что позволяет применять все возможности Objective-C и Swift.
Конфигурация приложения
Для работы с Facebook SDK для iOS нужно обновить класс AppDelegate, чтобы включить некоторые опции конфигурации для Facebook. Далее необходимо предоставить уникальные AppId и App Name и убедиться, что обеспечены следующие пространства имен:
1 2 | using Facebook.CoreKit; using Facebook.LoginKit; |
Когда пространства имен обозначены, необходимо ввести учетные данные в SDK.
1 2 3 | Profile.EnableUpdatesOnAccessTokenChange(true); Settings.AppID = Helpers.Keys.FacebookAppId; Settings.DisplayName = "Bait News"; |
Далее нужно скорректировать класс Keys с помощью FacebookAppId.
1 | public const string FacebookAppId = "[YourUniqueAppID]" |
Info.plist
Если планируется поддержка iOS 9 или последующих версий, необходимо убедиться, что серверы Facebook внесены в белый список. Такая необходимость возникла из-за того, что в iOS 9 введена технология App Transport Security, обязующая все приложения использовать технологию HTTPS для надежного соединения, чтобы повысить безопасность и приватность. Для того, чтобы внести серверы Facebook в белый список, необходимо отредактировать файл приложения Info.plist, добавив следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>facebook.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> </dict> <key>fbcdn.net</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> </dict> <key>akamaihd.net</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> </dict> </dict> </dict> |
При авторизации переключение приложений также вызывает необходимость редактирования файла Info.plist. Нужно добавить Facebook строки по порядку для метода CanOpenUrl.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <key>LSApplicationQueriesSchemes</key> <array> <string>fbapi</string> <string>fbapi20130214</string> <string>fbapi20130410</string> <string>fbapi20130702</string> <string>fbapi20131010</string> <string>fbapi20131219</string> <string>fbapi20140410</string> <string>fbapi20140116</string> <string>fbapi20150313</string> <string>fbapi20150629</string> <string>fbauth</string> <string>fbauth2</string> <string>fb-messenger-api20140430</string> </array> |
Авторизация с помощью Facebook
Итак, проект сконфигурирован для использования авторизации через Facebook. Далее нужно запустить авторизацию пользователей в SDK. На страничке Bait News автор взял кнопку контроля Facebook Login, которая запускает лог в процессе.
Для того, чтобы Storyboard хорошо смотрелся во время дизайна пользовательского интерфейса, автор разместил временную кнопку. Во время выполнения она будет скрыта и заменится пользовательскими элементами управления Facebook. Сделано это в методе ViewDidLoad в SignIn ViewController.
1 2 3 4 5 6 7 8 9 10 11 12 13 | var profile = Profile.CurrentProfile; if (profile == null) { loginView = new LoginButton(btnAuth.Frame) { LoginBehavior = LoginBehavior.Native }; loginView.Completed += async (sender, e) => { await LoginView_Completed(sender, e); }; btnAuth.Hidden = true; Add(loginView); } |
Завершение авторизации
1 2 3 4 5 6 7 8 | async Task LoginView_Completed(object sender, LoginButtonCompletedEventArgs e) { var accessToken = AccessToken.CurrentAccessToken.TokenString; //Create access token for user var accessToken = new JObject(); accessToken["access_token"] = tokenString; //Send the token to Azure App Service to auth with backend return await EasyMobileServiceClient.Current.MobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook, accessToken); } |
Авторизовав пользователя с помощью Facebook, можно передать токен доступа Facebook в службу приложений Azure, чтобы авторизация прошла также через backend приложения. Во время этого происходит возврат к MobileServiceUser, где содержится новый токен, уникальный для backend’а службы приложений. Стоит отметить, что данный токен не тот же токен Facebook, что был передан.
Заключение
Где это достижимо, разработчики пытаются избежать в приложениях поддержки авторизации. Если возможно переложить эту работу на доверенную третью сторону, такую как Microsoft, Facebook или Google, это нужно сделать. С помощью третьих сторон можно использовать SDK, которые предоставляют гораздо больший функционал чем просто авторизация. SDK позволяют обновлять токены безопасности или обеспечить нативный пользовательский интерфейс для распространенных ситуаций вроде обмена контентом.
Если есть заинтересованность в более глубоком изучении метода авторизации с помощью Azure, настоятельно рекомендуется к прочтению электронная книга Эдриана Холла (Adrian Hall). В ней есть подробное руководство по авторизации с помощью всех поставщиков авторизации через социальные сети, а также по методу Active Directory.
Автор: Mike James
Источник: Официальный блог Xamarin
Написать ответ