Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сводка
В этом руководстве описано, как добавить проверку подлинности в проект быстрого запуска todolist в Android с помощью поддерживаемого поставщика удостоверений. Это руководство основано на руководстве начало работы с мобильными приложениями, которое необходимо выполнить сначала.
Регистрация приложения для проверки подлинности и настройка службы приложений Azure
Сначала необходимо зарегистрировать приложение на сайте поставщика удостоверений, а затем задать учетные данные, созданные поставщиком, в серверной части мобильных приложений.
Настройте предпочитаемого поставщика удостоверений, следуя инструкциям для конкретного поставщика:
Повторите предыдущие шаги для каждого поставщика, которого вы хотите поддерживать в приложении.
Добавьте своё приложение в список разрешённых URL-адресов для внешнего перенаправления
Для безопасной проверки подлинности необходимо определить новую схему URL-адресов для приложения. Это позволяет системе проверки подлинности перенаправляться обратно в приложение после завершения процесса проверки подлинности. В этом руководстве мы используем URL-схему название приложения на протяжении всего руководства. Однако вы можете использовать любую схему URL-адресов, выбранную вами. Оно должно быть уникальным для мобильного приложения. Чтобы включить перенаправление на стороне сервера, выполните следующие действия.
На портале Azureвыберите службу приложений.
Щёлкните пункт меню Аутентификация / Авторизация.
В разрешенных URL-адресов для внешних перенаправленийвведите
appname://easyauth.callback. Имя приложения в этой строке — это схема URL-адресов для мобильного приложения. Он должен соответствовать обычной спецификации URL-адреса для протокола (использовать только буквы и цифры и начинать с буквы). Следует заметить строку, которую вы выберете, так как вам потребуется настроить код мобильного приложения с помощью схемы URL-адресов в нескольких местах.Щелкните OK.
Нажмите кнопку Сохранить.
Ограничение разрешений для пользователей, прошедших проверку подлинности
По умолчанию API-интерфейсы в серверной части мобильных приложений можно вызывать анонимно. Затем необходимо ограничить доступ только к прошедшим проверку подлинности клиентам.
Node.js внутренний интерфейс (через портал Azure):
В параметрах мобильных приложений нажмите Easy Tables и выберите свою таблицу. Щелкните Изменить разрешения, выберите только проверенный доступ для всех разрешений, а затем нажмите Сохранить.
.NET бэкэнд (C#):
В проекте сервера перейдите к контроллерам>TodoItemController.cs. Добавьте атрибут
[Authorize]в класс TodoItemController, как показано ниже. Чтобы ограничить доступ только к определенным методам, этот атрибут также можно применить только к этим методам, а не к классу. Переопубликуйте серверный проект.[Authorize] public class TodoItemController : TableController<TodoItem>Node.js бекенд (через код Node.js):
Чтобы требовать проверку подлинности для доступа к таблицам, добавьте следующую строку в скрипт сервера Node.js:
table.access = 'authenticated';Дополнительные сведения см. в разделе Практическое руководство. Требование проверки подлинности для доступа к таблицам. Сведения о том, как скачать проект кода быстрого запуска с сайта, см. в статье Практическое руководство. Скачивание проекта кода внутреннего руководства Node.js с помощью Git.
В Android Studio откройте проект, который вы завершили с помощью руководства начало работы с мобильными приложениями. В меню Запуск щелкните Запустить приложениеи убедитесь, что необработанное исключение с кодом состояния 401 (неавторизовано) возникает после запуска приложения.
Это исключение происходит из-за того, что приложение пытается получить доступ к бэкенду в качестве неаутентифицированного пользователя, но теперь для таблицы TodoItem требуется аутентификация.
Затем вы обновите приложение для проверки подлинности пользователей перед запросом ресурсов из серверной части мобильных приложений.
Добавление проверки подлинности в приложение
Откройте проект в Android Studio.
В обозревателе проектов в Android Studio откройте файл
ToDoActivity.javaи добавьте следующие инструкции импорта:import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicBoolean; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import com.microsoft.windowsazure.mobileservices.authentication.MobileServiceAuthenticationProvider; import com.microsoft.windowsazure.mobileservices.authentication.MobileServiceUser;Добавьте следующий метод в класс ToDoActivity:
// You can choose any unique number here to differentiate auth providers from each other. Note this is the same code at login() and onActivityResult(). public static final int GOOGLE_LOGIN_REQUEST_CODE = 1; private void authenticate() { // Sign in using the Google provider. mClient.login(MobileServiceAuthenticationProvider.Google, "{url_scheme_of_your_app}", GOOGLE_LOGIN_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // When request completes if (resultCode == RESULT_OK) { // Check the request code matches the one we send in the login request if (requestCode == GOOGLE_LOGIN_REQUEST_CODE) { MobileServiceActivityResult result = mClient.onActivityResult(data); if (result.isLoggedIn()) { // sign-in succeeded createAndShowDialog(String.format("You are now signed in - %1$2s", mClient.getCurrentUser().getUserId()), "Success"); createTable(); } else { // sign-in failed, check the error message String errorMessage = result.getErrorMessage(); createAndShowDialog(errorMessage, "Error"); } } } }Этот код создает метод для обработки процесса проверки подлинности Google. В диалоговом окне отображается идентификатор прошедшего проверку подлинности пользователя. Вы можете продолжить только после успешного подтверждения подлинности.
Примечание.
Если вы используете поставщика идентификации, отличного от Google, измените значение, переданное методу входа , на одно из следующих значений: MicrosoftAccount, Facebook, Twitterили windowsazureactivedirectory.
В методе onCreate добавьте следующую строку кода после кода, создающего экземпляр объекта
MobileServiceClient.authenticate();Этот вызов запускает процесс проверки подлинности.
Переместите оставшийся код после
authenticate();в методе onCreate в новый метод createTable :private void createTable() { // Get the table instance to use. mToDoTable = mClient.getTable(ToDoItem.class); mTextNewToDo = (EditText) findViewById(R.id.textNewToDo); // Create an adapter to bind the items with the view. mAdapter = new ToDoItemAdapter(this, R.layout.row_list_to_do); ListView listViewToDo = (ListView) findViewById(R.id.listViewToDo); listViewToDo.setAdapter(mAdapter); // Load the items from Azure. refreshItemsFromTable(); }Чтобы убедиться, что перенаправление работает должным образом, добавьте следующий фрагмент кода
RedirectUrlActivityвAndroidManifest.xml:<activity android:name="com.microsoft.windowsazure.mobileservices.authentication.RedirectUrlActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="{url_scheme_of_your_app}" android:host="easyauth.callback"/> </intent-filter> </activity>Добавьте
redirectUriSchemeвbuild.gradleприложения Android.android { buildTypes { release { // ... manifestPlaceholders = ['redirectUriScheme': '{url_scheme_of_your_app}://easyauth.callback'] } debug { // ... manifestPlaceholders = ['redirectUriScheme': '{url_scheme_of_your_app}://easyauth.callback'] } } }Добавьте
com.android.support:customtabs:23.0.1в зависимости в разделеbuild.gradle:dependencies { // ... compile 'com.android.support:customtabs:23.0.1' }В меню Запуск щелкните Запустить приложение, чтобы открыть приложение и войти через выбранного поставщика удостоверений.
Предупреждение
Схема URL является чувствительна к регистру. Убедитесь, что все вхождения {url_scheme_of_you_app} используют один и тот же регистр.
При успешном входе приложение должно выполняться без ошибок, и вы сможете запросить серверную службу и внести обновления в данные.
Кэшировать токены аутентификации на клиенте
В предыдущем примере показан стандартный вход, который требует от клиента связаться с поставщиком удостоверений и серверной службой Azure при каждом запуске приложения. Этот метод неэффективн, и вы можете иметь проблемы, связанные с использованием, если многие клиенты пытаются запустить приложение одновременно. Лучший подход — кэшировать маркер авторизации, возвращаемый службой Azure, и прежде всего попытаться использовать его перед аутентификацией с использованием поставщика.
Примечание.
Маркер, выданный серверной службой Azure, можно кэшировать независимо от того, используется ли проверка подлинности, управляемой клиентом или службой. В этом руководстве используется аутентификация, управляемая сервисом.
Откройте файл ToDoActivity.java и добавьте следующие инструкции импорта:
import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor;Добавьте следующие члены в класс
ToDoActivity.public static final String SHAREDPREFFILE = "temp"; public static final String USERIDPREF = "uid"; public static final String TOKENPREF = "tkn";В файле ToDoActivity.java добавьте следующее определение для метода
cacheUserToken.private void cacheUserToken(MobileServiceUser user) { SharedPreferences prefs = getSharedPreferences(SHAREDPREFFILE, Context.MODE_PRIVATE); Editor editor = prefs.edit(); editor.putString(USERIDPREF, user.getUserId()); editor.putString(TOKENPREF, user.getAuthenticationToken()); editor.commit(); }Этот метод сохраняет идентификатор пользователя и маркер в файле предпочтений, помеченном как закрытый. Это должно защитить доступ к кэшу, чтобы другие приложения на устройстве не имели доступа к маркеру. Для настройки приложения используется песочница. Однако, если кто-то получает доступ к устройству, возможно, что он может получить доступ к кэшу маркеров с помощью других средств.
Примечание.
Вы можете дополнительно защитить маркер с помощью шифрования, если доступ маркера к данным считается очень конфиденциальным, и кто-то может получить доступ к устройству. Однако полностью безопасное решение выходит за рамки этого руководства и зависит от ваших требований к безопасности.
В файле ToDoActivity.java добавьте следующее определение для метода
loadUserTokenCache.private boolean loadUserTokenCache(MobileServiceClient client) { SharedPreferences prefs = getSharedPreferences(SHAREDPREFFILE, Context.MODE_PRIVATE); String userId = prefs.getString(USERIDPREF, null); if (userId == null) return false; String token = prefs.getString(TOKENPREF, null); if (token == null) return false; MobileServiceUser user = new MobileServiceUser(userId); user.setAuthenticationToken(token); client.setCurrentUser(user); return true; }В файле ToDoActivity.java замените методы
authenticateиonActivityResultследующими методами, которые используют кэш маркеров. Измените поставщика входа, если вы хотите использовать учетную запись, отличной от Google.private void authenticate() { // We first try to load a token cache if one exists. if (loadUserTokenCache(mClient)) { createTable(); } // If we failed to load a token cache, sign in and create a token cache else { // Sign in using the Google provider. mClient.login(MobileServiceAuthenticationProvider.Google, "{url_scheme_of_your_app}", GOOGLE_LOGIN_REQUEST_CODE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // When request completes if (resultCode == RESULT_OK) { // Check the request code matches the one we send in the sign-in request if (requestCode == GOOGLE_LOGIN_REQUEST_CODE) { MobileServiceActivityResult result = mClient.onActivityResult(data); if (result.isLoggedIn()) { // sign-in succeeded createAndShowDialog(String.format("You are now signed in - %1$2s", mClient.getCurrentUser().getUserId()), "Success"); cacheUserToken(mClient.getCurrentUser()); createTable(); } else { // sign-in failed, check the error message String errorMessage = result.getErrorMessage(); createAndShowDialog(errorMessage, "Error"); } } } }Создайте приложение и проверьте проверку подлинности с помощью допустимой учетной записи. Запустите его по крайней мере дважды. Во время первого запуска вы получите запрос на вход и создание кэша токенов. После этого каждый запуск пытается загрузить кэш маркеров для проверки подлинности. Вам не нужно входить в систему.
Дальнейшие действия
Теперь, когда вы выполнили это базовое руководство по проверке подлинности, рассмотрите возможность продолжения работы с одним из следующих руководств:
- Добавьте push-уведомления в ваше Android-приложение. Узнайте, как настроить серверную часть мобильных приложений для использования центров уведомлений Azure для отправки push-уведомлений.
- Включить автономную синхронизацию для приложения Android. Узнайте, как добавить автономную поддержку в приложение с помощью серверной части мобильных приложений. При автономной синхронизации пользователи могут взаимодействовать с мобильным приложением — просматривать, добавлять или изменять данные, даже если сетевое подключение отсутствует.