Статьи

Учебник. Создание приложения Android с безопасной аутентификацией пользователя

Управление идентификацией здания, включая аутентификацию и авторизацию? Попробуйте Stormpath! Наш REST API и надежная поддержка Java SDK могут устранить риск для безопасности и могут быть реализованы за считанные минуты. Зарегистрируйтесь и никогда больше не создавайте аутентификацию!

В этом руководстве мы создадим простое приложение для Android, в котором будут храниться сгенерированные пользователем заметки удаленно, с аутентификацией пользователя, управляемой Stormpath и новым Android SDK .

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

демонстрация

Почему Stormpath для приложений Android?

Stormpath — это служба аутентификации, которая надежно хранит ваши учетные записи и личную информацию о пользователях. Плюс, это бесплатно для небольших проектов!

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

Используя Stormpath, пользователи входят в систему с использованием протокола OAuth2 с подписанными токенами JSON .

network_service_diagram

С Stormpath вам не нужно быть экспертом в криптографии, чтобы создать надежную переднюю дверь для вашего приложения. В контексте данного руководства «Пользователь» — это мобильное приложение на стороне клиента, а «Приложение» — сервер, размещенный на Heroku .

Использование библиотеки Stormpath для Android упрощает правильную реализацию аутентификации пользователя, в отличие от затрат времени и усилий на внедрение безопасных методов аутентификации в ваше следующее мобильное приложение!

Библиотека Stormpath Android также может быть использована для создания более сложных сценариев аутентификации, таких как многопользовательский режим и единый вход .

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

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

ХОРОШО! Давайте что-то строить!

Давайте создадим простое приложение для создания заметок в Android. К концу этого урока у вас будет приложение, которое позволит вам зарегистрироваться и войти в систему как пользователь, сохранить заметку и получить эту заметку с вашего сервера. Буквально синхронизируйте данные заметок с облачным бэкэндом!

Это руководство предназначено для приложений Android, написанных на Java и Android SDK . Если у вас недостаточно возможностей для написания кода, который работает на 2300 различных устройствах, есть также руководство по iOS, написанное на Swift> 🙂

Настройка нашего проекта Android

В этом руководстве мы выполнили всю бэкэнд-работу за вас, а сервер API размещен по адресу https://stormpathnotes.herokuapp.com.

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

Чтобы интегрироваться с существующим бэкэндом ( вместо нашего примера ), потратьте некоторое время на изучение наших языковых обучающих программ по серверной части . Или — просто застрели эту ссылку на свою бэкэнд-команду

Используемая нами служба бэкэнд-API предоставляет две защищенные конечные точки для вашего приложения Android:

  • GET /notes — возвращает заметки для аутентифицированного пользователя в форме объекта JSON.
  • POST /notes — принимает объект JSON с примечаниями и сохраняет его для аутентифицированного пользователя.

Объект JSON всегда имеет вид:

1
{"notes": "The notes the user saved"}

Если вам интересно, мы использовали следующие инструменты для создания бэкэнда для Stormpath Notes:

  • Express — платформа Node.js, которая упрощает создание служб API.
  • Express-Stormpath — предоставляет настраиваемый API REST для наших мобильных клиентов в Express.
  • Stormpath — позволяет нам хранить и аутентифицировать пользователей, не создавая для этого собственного бэкэнда.
  • Heroku — размещает код для заметок Stormpath онлайн.

Установка Stormpath

1
git clone https://github.com/stormpath/stormpath-android-notes-example.git

Если вы хотите увидеть готовую версию проекта, проверьте готовую ветку .

Создайте приложение Android «Заметки»

Откройте проект с помощью Android Studio, и он должен быть настроен для компиляции.

Зависимость Gradle для включения Stormpath SDK:

1
compile 'com.stormpath.sdk:stormpath-sdk-android:1.1.3'

В классе Application ( NotesApp.java ) добавьте следующее в метод onCreate :

1
2
3
4
5
// Initialize Stormpath
StormpathConfiguration stormpathConfiguration = new StormpathConfiguration.Builder()
    .baseUrl(baseUrl)
    .build();
Stormpath.init(this, stormpathConfiguration);

При желании для отладочной информации добавьте этот метод перед StormpathConfiguration метода StormpathConfiguration .

1
2
3
4
// We only want to show the logs in debug builds, for easier debugging.
if (BuildConfig.DEBUG) {
    Stormpath.setLogLevel(StormpathLogger.VERBOSE);
}

Вход в систему и регистрация пользователей

Этот проект включает в себя классы Java для предварительно созданного входа в Stormpath. Эти файлы также включены в библиотеку Stormpath SDK-UI как настраиваемый интерфейс входа в систему, который отличается от классов SDK. Если вам нужен собственный пользовательский интерфейс, сетевой метод Stormpath.login можно использовать без элементов управления представлением.

Эти классы SDK-UI проходят проверку подлинности с помощью Stormpath SDK на сервере, на котором работают зависимости Stormpath.

StormpathLoginActivity можно запустить с:

1
startActivity(new Intent(this, StormpathLoginActivity.class));

В NotesActivity.java есть несколько случаев, когда нужно StormpathLoginActivity .

В методе onResume мы можем проверить, есть ли пользователь, вошедший в систему, захватив профиль пользователя. Если его нет, покажите логин, в противном случае получите заметку.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Stormpath.getUserProfile(new StormpathCallback<UserProfile>() {
    @Override
    public void onSuccess(UserProfile userProfile) {
        getNotes();
    }
  
    @Override
    public void onFailure(StormpathError error) {
        // Show login view
        startActivity(new Intent(context, StormpathLoginActivity.class));
    }
});```
  
**NOTE**: Stormpath access tokens are automatically created for users who sign into your application, and are stored securely on your Android device using [SharedPreferences](http://developer.android.com/reference/android/content/SharedPreferences.html).
  
For our custom endpoints `/notes`, we are using the [OkHttp3](https://square.github.io/okhttp/3.x/okhttp/okhttp3/package-summary.html) library.
  
So let's initialize the OkHttp3 objects in the `NotesActivity.java`'s `onCreate()` method.
  
```java
// Initialize OkHttp library.
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
    @Override
    public void log(String message) {
        Stormpath.logger().d(message);
    }
});
  
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
this.okHttpClient = new OkHttpClient.Builder()
        .addNetworkInterceptor(httpLoggingInterceptor)
        .build();

Посмотрите на закрытые методы getNotes() и saveNote() для примеров подготовки метода OkHttp3.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void saveNote() {
    RequestBody requestBody = new FormBody.Builder()
            .add("notes", mNote.getText().toString())
            .build();
  
    Request request = new Request.Builder()
            .url(NotesApp.baseUrl + "notes")
            .headers(buildStandardHeaders((Stormpath.accessToken())))
            .post(requestBody)
            .build();
  
    okHttpClient.newCall(request).enqueue(new Callback() {
        @Override public
        void onFailure(Call call, IOException e) {
        }
  
        @Override public void onResponse(Call call, Response response)
                throws IOException {
            Intent intent = new Intent(ACTION_POST_NOTES);
            LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
        }
    });
}
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private void getNotes() {
    Request request = new Request.Builder()
            .url(NotesApp.baseUrl + "notes")
            .headers(buildStandardHeaders(Stormpath.accessToken()))
            .get()
            .build();
  
    okHttpClient.newCall(request).enqueue(new Callback() {
        @Override public
        void onFailure(Call call, IOException e) {
        }
  
        @Override public void onResponse(Call call, Response response)
                throws IOException {
            JSONObject mNotes;
  
            try {
                mNotes = new JSONObject(response.body().string());
                String noteCloud = mNotes.getString("notes");
  
                // You can also include some extra data.
                Intent intent = new Intent(ACTION_GET_NOTES);
                intent.putExtra("notes", noteCloud);
  
                LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
            } catch (JSONException e) {
            }
        }
    });
}

Оба эти метода требуют, чтобы объект Headers был должным образом подготовлен для аутентификации. buildStandardHeaders() сделает это за вас:

01
02
03
04
05
06
07
08
09
10
private Headers buildStandardHeaders(String accessToken) {
    Headers.Builder builder = new Headers.Builder();
    builder.add("Accept", "application/json");
  
    if (StringUtils.isNotBlank(accessToken)) {
        builder.add("Authorization", "Bearer " + accessToken);
    }
  
    return builder.build();
}

В базе данных Stormpath пара ключ / значение Notes хранится в пользовательском поле «CustomData». Хотя произвольные пары ключ / значение могут быть добавлены к объекту пользователя, Stormpath не предназначен для использования в качестве хранилища произвольных объектов.

saveNotes() вызывается в onClickListener

Наконец, давайте добавим метод выхода из системы в меню панели инструментов. В onOptionsItemSelected найдите if statement отношении (id == R.id.action_logout) и добавьте следующее:

1
2
Stormpath.logout();
startActivity(new Intent(context, StormpathLoginActivity.class));

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

Необязательным дополнением будет сохранение заметок на стороне клиента.

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

Что дальше?

Попробуйте iOS SDK. Если вы ( или ваш друг ) занимаетесь разработкой для iOS, попробуйте выполнить руководство по iOS для Stormpath Notes . Поскольку приложение будет отправлять запросы на один и тот же API, вы заметите, что можете сохранять свои заметки на одном устройстве и открывать их на другом!

Создайте бэкэнд с помощью Stormpath — попробуйте создать этот API с нуля! Пример бэкэнда Stormpath Notes — всего 45 строк кода! Смотрите код на GitHub . В качестве альтернативы, попробуйте начать работу с express-stormpath или stormpath-laravel (скоро будет больше интеграций!)

Stormpath бесплатен и может помочь вашей команде написать безопасное, масштабируемое приложение, не беспокоясь о мельчайших деталях аутентификации, авторизации и безопасности пользователя. Зарегистрируйте аккаунт сегодня!

Управление идентификацией здания, включая аутентификацию и авторизацию? Попробуйте Stormpath! Наш REST API и надежная поддержка Java SDK могут устранить риск для безопасности и могут быть реализованы за считанные минуты. Зарегистрируйтесь и никогда больше не создавайте аутентификацию!