Поделиться через


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

Сводка

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

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

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

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

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

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

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

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

  2. Щёлкните пункт меню Аутентификация / Авторизация.

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

  4. Щелкните OK.

  5. Нажмите кнопку Сохранить.

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

По умолчанию 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 требуется аутентификация.

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

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

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

  2. В обозревателе проектов в 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;
    
  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, измените значение, переданное методу входа , на одно из следующих значений: 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. Чтобы убедиться, что перенаправление работает должным образом, добавьте следующий фрагмент кода 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>
    
  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 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-приложение. Узнайте, как настроить серверную часть мобильных приложений для использования центров уведомлений Azure для отправки push-уведомлений.
  • Включить автономную синхронизацию для приложения Android. Узнайте, как добавить автономную поддержку в приложение с помощью серверной части мобильных приложений. При автономной синхронизации пользователи могут взаимодействовать с мобильным приложением — просматривать, добавлять или изменять данные, даже если сетевое подключение отсутствует.