Добавление проверки подлинности в приложение Android

Сводка

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

Регистрация приложения для аутентификации и настройка службы приложений Azure

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

  1. Настройте выбранный поставщик удостоверений, следуя соответствующим инструкциям:

  2. Повторите предыдущие шаги для каждого поставщика, поддержку которого вы хотите включить в свое приложение.

Добавление приложения в список разрешенных URL-адресов внешнего перенаправления

Для безопасной аутентификации требуется определить новую схему URL-адресов для своего приложения. Это позволяет системе аутентификации выполнять перенаправление обратно в приложение после завершения процесса аутентификации. В этом руководстве мы повсеместно используем схему URL-адресов appname. Тем не менее можно использовать любую схему URL-адресов на свой выбор. Она должна быть уникальной для мобильного приложения. Вот как можно включить перенаправление на стороне сервера.

  1. На портале Azure выберите свою службу приложений.

  2. Выберите пункт меню Аутентификация или авторизация.

  3. В поле Разрешенные URL-адреса внешнего перенаправления введите appname://easyauth.callback. appname в этой строке — это схема URL-адресов для вашего мобильного приложения. Она должна соответствовать обычной спецификации URL-адресов для протокола (можно использовать буквы и цифры, и адрес должен начинаться с буквы). Необходимо записать выбранную строку, так как потребуется в нескольких местах настроить код мобильного приложения с использованием схемы URL-адресов.

  4. Нажмите кнопку ОК.

  5. Выберите команду Сохранить.

Ограничение разрешений для пользователей, прошедших проверку подлинности

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

  • Серверная часть Node.js (через портал Azure):

    В параметрах мобильных приложений щелкните простые таблицы и выберите таблицу. Щелкните Изменить разрешения, выберите для всех разрешений параметр Authenticated access only (Доступ только с проверкой подлинности) и нажмите кнопку Сохранить.

  • Серверная часть .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 откройте проект, при выполнении заданий руководства Начало работы с мобильными службами. В меню Run (Запуск) щелкните Run app (Запустить приложение). Убедитесь, что после запуска приложения возникает необработанное исключение с кодом состояния "401 (Не авторизовано)".

    Это происходит, потому что приложение пытается получить доступ к серверной части как неаутентифицированный пользователь, а таблица TodoItem теперь требует проходить аутентификацию.

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

Добавление проверки подлинности в приложение

  1. Откройте проект в Android Studio.

  2. В Android Studio в обозревателе проектов откройте файл ToDoActivity.java и добавьте следующие операторы import:

    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;
    
  3. Добавьте следующий метод в класс 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, измените значение, переданное в методе login, на одно из следующих значений: MicrosoftAccount, Facebook, Twitter или windowsazureactivedirectory.

  4. Добавьте в метод onCreate следующую строку после кода, который формирует экземпляр объекта MobileServiceClient.

    authenticate();
    

    Этот вызов запускает процесс проверки подлинности.

  5. Переместите оставшийся код после 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();
    }
    
  6. Чтобы перенаправление работало правильно, добавьте в файл AndroidManifest.xml фрагмент кода RedirectUrlActivity.

    <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>
    
  7. Добавьте 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']
            }
        }
    }
    
  8. Добавьте com.android.support:customtabs:23.0.1 в зависимости в файле build.gradle.

    dependencies {
        // ...
        compile 'com.android.support:customtabs:23.0.1'
    }
    
  9. В меню Запуск щелкните Запуск приложения, чтобы запустить приложение и выполнить вход с помощью выбранного поставщика удостоверений.

Предупреждение

В упомянутой схеме URL-адресов учитывается регистр. Убедитесь, что во всех вхождениях {url_scheme_of_you_app} используется один и тот же регистр.

После входа мобильное приложение должно работать без ошибок, а у вас должна быть возможность отправлять запросы в серверную службу и обновлять данные.

Кэширование маркеров проверки подлинности на клиенте

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

Примечание

Можно кэшировать маркер, выданный серверной службой Azure, независимо от того, какую аутентификацию вы используете: управляемую клиентом или сервером. Этот учебник использует управляемую сервером проверку подлинности.

  1. Откройте файл ToDoActivity.java и добавьте следующую инструкцию import:

    import android.content.Context;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    
  2. Добавьте в класс ToDoActivity следующие методы.

    public static final String SHAREDPREFFILE = "temp";
    public static final String USERIDPREF = "uid";
    public static final String TOKENPREF = "tkn";
    
  3. В файле 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();
    }
    

    Этот метод хранит идентификатор пользователя и маркер в закрытом файле настроек. Это должно защитить доступ к кэш-памяти, так что другие приложения на устройстве не будут иметь доступа к маркеру, потому что настройки хранятся в изолированной среде приложения. Тем не менее если кто-либо получает доступ к устройству, не исключено, что он сможет получить доступ к кэш-памяти маркера с помощью других средств.

    Примечание

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

  4. В файле 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;
    }
    
  5. В файле 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");
                }
            }
        }
    }
    
  6. Соберите приложение и проверьте проверку подлинности, используя действующую учетную запись. Запустите его как минимум дважды. Во время первого запуска вы должны получить приглашение для входа и создать кэш маркера. После этого при каждом запуске предпринимается попытка загрузки кэша маркера для проверки подлинности. Приглашение для входа в систему не будет появляться.

Дальнейшие действия

Вы прошли этот учебник по обычной проверке подлинности и теперь можете перейти к одному из следующих учебников:

  • Добавление push-уведомлений в приложение Android. Узнайте, как добавить поддержку push-уведомлений в мобильное приложение и настроить в его серверной части использование центров уведомлений Azure для отправки push-уведомлений.
  • Включение автономной синхронизации для приложения Android. Узнайте, как добавить в приложение поддержку автономной работы с помощью серверной части мобильных приложений. При автономной синхронизации пользователи могут взаимодействовать с мобильным приложением — просмотр, добавление или изменение данных, даже если отсутствует сетевое подключение.