java – Объясните принципы разработки авторизации в android – Stack Overflow на русском

Основные поля

Кратко остановимся на том, какие есть стандартные полях в токене и зачем они нужны:

Что из этого вышло?

Мы в мобильных приложениях для регистрации не используем паролей вообще. Да, нет необходимости запоминать ещё один пароль. Для регистрации/авторизации в мобильном приложении достаточно ввести только email, на который прийдёт письмо со ссылкой для подтверждения действия. После следующего ввода email — Вы автоматически войдёте в приложение без регистрации.

Что такое аутентификация?

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

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

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

Разработка основной базы.

Согласно выше представленной блок-схемы, обращения к основной базе возникают в трех случаях:

3 Устройство на ОС Андроид.

В текущей статье разработка будет идти сразу на реальное устройство, без эмуляторов. Для этого, необходимо установить мобильную платформу на ваше устройство. Как это сделать? Просто!

1. Создание мобильной конфигурации.

Запускаем платформу 1С от имени администратора и создаем пустую конфигурацию, задаем ей имя «МобильноеПриложение» и в «Назначения использования» указываем «Приложение для мобильной платформы». Далее, в параметре «Используемая функциональность мобильного приложения», добавляем опцию «Камера».

Похожее:  УЧИ РУ 2 КЛАСС ВХОД ДЛЯ УЧЕНИКА ЛИЧНЫЙ КАБИНЕТ

2. Настройка взаимодействия с устройством.

Сразу настроим взаимодействие с мобильным устройством, для этого, публикуем мобильное приложение на веб-сервер, открываем меню «Конфигурация» – «Мобильное приложение» – «Публиковать…» и устанавливаем настройки согласно скриншоту, далее нажимаем «Опубликовать»:


На запрос о перезапуске веб-сервера и обновление мобильного приложения, отвечаем отрицательно, так как нужно перенести настройки публикации. Более подробнее о публикации мобильного приложения 1С:

3. Добавление объектов в мобильное приложение 1С.

▪ Добавляем константу «ХешПароля», тип «Строка», длина «100» с отключенной опцией «Использовать стандартные команды».▪ Добавляем общую форму с наименованием «ФормаВходa» и устанавливаем ее в рабочую область начальной страницы:

В форме размещены следующие элементы:

— Команда «Вход».

— Декорация надпись «ДекорацияСообщение», которая послужит для вывода вспомогательных сообщений.

Модуль формы содержит следующий код:

Api и библиотеки

Мы описали детальное API, для работы с сервисом. Генерация и отправка запроса, получение ответа и декодирование данных. Всё доступно по ссылке.

На данный момент одна из основных задач — это написание библиотек для работы с сервисом для снижения порога вхождения пользователями сервиса. Поэтому сейчас уже доступны:

Мы нуждаемся в: Python, Go, Ruby, Node, .NET — библиотеках. А так же в PHP, фреймворк-пакетах, напр под WordPress, Laravel и другие. Для авторизации в Linux через SSH/Bash LogOn, необходим so-модуль.

Если Вы заинтересованы помочь проекту — мы будем рады предоставить PREMIUM 6 month account.

Forms authentication

java - Объясните принципы разработки авторизации в android - Stack Overflow на русском

Token authentication

java - Объясните принципы разработки авторизации в android - Stack Overflow на русском

Следующее поколение способов аутентификации представляет Token Based Authentication, который обычно применяется при построении систем Single sign-on (SSO). При его использовании запрашиваемый сервис делегирует функцию проверки достоверности сведений о пользователе другому сервису. Т. е. провайдер услуг доверяет выдачу необходимых для доступа токенов собственно токен-провайдеру (Identity provider).

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

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

На следующей схеме дополнительно отражены те этапы взаимодействия, в которых пользователь принимает непосредственное участие. Этот момент и является недостатком подобной схемы — нам всегда нужен пользователь, чтобы получить доступ к ресурсу.
java - Объясните принципы разработки авторизации в android - Stack Overflow на русском

Web-site

Двух-факторная или простая одно-факторная авторизация на сайте может упростить или обезопасить доступ к внутренним ресурсам. Например для доступа к web-панели администратора того же WordPress, когда Вы даёте доступ своему подрядчику/разработчику и хотите строго контролировать его по средству Push-запросов авторизации.

Взгляд сверху

Picture7

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

Включить опцию «неизвестные источники»:

Временно, на устройстве включаем опцию «Неизвестные источники», которая позволит устанавливать приложения миную Google Play, напрямую с помощью apk файла:

Добавляем действие на кнопку

Пишем в нашем активити:

Запрос на аутентификацию


Authentication/Token Request — процесс запроса аутентификации.

В зависимости от того какие области (scopes) запрошены, сервис выдачи токенов вернет:

  1. Только Identity Token, если запрошены только Identity scopes.
  2. Identity Token и Access Token, если запрошены также и Resources scopes.
  3. Access Token и Refresh Token, если запрошeн Offline Access.

Более подробно про процесс аутентификации можно прочесть в разделе «

Инженерия и оборудование

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

Какие виды авторизации?

Сейчас доступно два основных вида запросов на авторизацию:

  1. Push вопрос на авторизацию, в котором клиенту необходимо дать ответ: Да или Нет. Для данного способа доступен сервис routing, о котором чуть ниже.
  2. Безопасный Push-код, которые владелец сервиса сам отправляет в мобильное приложение клиента по средству сервиса PushAuth.
  3. QR-авторизация, которая позволяет сканировать код мобильным приложением клиента и пройти авторизацию. Данный способ уже на стадии закрытого тестирования мобильными приложениями и в ближайшее время так же станет доступен.

Какой способ авторизации выбрать для мобильного приложения — вопросы на

Приветствую, эксперты.

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

Сразу утомлять двойной авторизацией не хочется (недостающую информацию мы соберем, когда пользователь уже «пороется» в приложении). Уважаемые эксперты, по вашему мнению, какой способ наиболее предпочтителен? Возможно, пользователи охотнее зарегистрируются через телефон, или же людям проще авторизоваться через социальные сети в два клика?

Спасибо.


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

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

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

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

Клиент

Client — устройство или программа (браузер, приложение), которым требуется либо токен для аутентификации пользователя, либо токен для доступа к какому-то ресурсу (подразумевается, что данный ресурс «знаком» с тем конкретным «

» у которого клиент запрашивает токен для доступа).

Мобильные приложения

Push-вопрос

Безопасный Push-код

Приложения уже доступны:

Небольшая подготовка

Для начала — у вас должны быть установлены Google Play Services в SDK. После их установки можно будет импортировать все необходимые библиотеки. Статья пишется с расчетом на Android Studio — он сам подсказывает, что необходимо импортировать.


У вас должно быть создано активити с кнопкой.

Область (scope)

Scope — идентификатор ресурса, к которому клиент хочет получить доступ. Список scope посылается в адрес

в составе

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

Scopes бывают двух видов:

  1. Identity scopes — это запрос информации о пользователе. Его имя, профиль, пол, фотография, адрес электронной почты и т. д.
  2. Resource scopes — имена внешних ресурсо (Web APIs), к которым клиент хочет получить доступ.

Объясните принципы разработки авторизации в android

буду делать на retrofit так как по нем больше информации и видосов

Не лучший ход мыслей.

во всех случаях каждый из разработчиков создает кучу классов для обычного логина

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

Но чаще пользуются Retrofit. Почему? Потому что он очень удобен.

Чуть позже, когда помимо вопросов как написать тоже самое, но на десять строчек кода короче, и вообще когда помимо количества строчек кода или внешней простоты реализации для вас появятся ещё какие-нибудь пункты, соответствие которым будет для вас весомым, вы поймёте, почему по Retrofit «куча видосов» — отчасти, из-за некоторой общей популярности, потому что работа с сетью у всех и ассоциируется с Retrofit, — но и популярность пришла не зря.

Да и насчёт простоты кода тоже можно поспорить — вам всего пару шагов проделать надо, и в случае сильного увеличения количества запросов, в случае усложнения этих самых запросов, количество кода будет сильно уменьшаться, и с Volley-ами и OkHttp вы устанете переписывать одно и то же везде, или костылить свои врапперы.

Пример: инициализируем

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.example.com")
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build();

Затем создаём интерфейс для работы с API:

interface MyExampleApi {

    @GET("/get-something")
    Call<MyExampleResponse> getSomething(@Query String someParameter);
}

Далее вам нужно десериализованный POJO для ответа от сервера написать, и всё:

class MyExampleResponse {
    private String topSecretInfo;

    // constructors, getters, setters
}

На этом «куча классов» закончилась. Удобно, разве нет? Теперь вызываем:

MyExampleApi api = retrofit.create(MyExampleApi.class)
api.getSomething("wow! such retrofit").enqueue(new Callback<MyExampleResponse> { /*  обработка */ });

Итого — у вас в коде пара строчек потрачено на логику по работе с сетью, и помимо этого ещё пара коротеньких файлов.
Это я ещё не говорил про тестирование, DI и так далее.

Какая мораль? Если вы слабо знакомы с HTTP-протоколом, да и вообще HTTP, POST и GET для вас ругательства капсом — тогда не парьтесь пока что 🙂
В таком случае лучше изучите сначала теорию по этим вопросам. Не нужно просто брать и копировать из тырнетов огромные простыни, подменяя лишь маленький кусочек кода в серединке, который и является вашей бизнес-логикой. Вы должны сначала понимать каждую буковку, которую пишете — потом понимать цель, с которой пишется эта строчка кода и что она в итоге делает — а уже потом среди аналогов выбирать, какой же из них делает это удобнее всего.

Самое главное — не делайте ничего бездумно, не копируйте первый попавшийся код потому что он «короче», «выглядит проще» или потому что «по нему видосиков куча».


Если к делу — о какой конкретно авторизации идёт речь? У вас свой API, или же вы хотите встроить авторизацию через популярные сервисы вроде VK, Google, Facebook и всё такое прочее?

В первом случае всё зависит от протоколов и способов аутентификации. Что вы используете: OAuth, накостыленная передача логинов и паролей прямо в теле запроса, Bearer-токены?

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

Если же всё-таки вы всё делаете вручную, и бэкенд тоже ваш, тогда логика тоже довольно проста — в случае с Retrofit — создаёте интерфейс (вроде написанного выше MyExampleApi), помещаете туда методы с нужными сигнатурами, и выстраиваете свою логику. Юзер вводит пароль, или вы как-то сами его получаете, — вместе с логином шифруете его как-нибудь, или просто так отправляете в теле запроса — делаете обычный запрос с нужными заголовками, телом или query, и на основе ответа от сервера решаете, залогинился юзер или нет.


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


UPD:

Передача данных на сервер пока идет в формате json но потом вроде как планируется и передавать методом post.

А как вы планируете json передавать не через POST, в query как параметр при GET-запросе? Есть некоторые случаи такой логики, например при подписи запросов, но я сомневаюсь, что у вас это используется, а значит вам нужен именно POST-запрос.

Делается всё очень просто. Допустим, вам нужно отправить только логин и пароль на сервер, а в ответ придёт статус — залогинен юзер или нет. Тогда пример выше я преобразую:

Инициализация выглядит также. Интерфейс будет примерно такой:

interface AuthApi {

    @POST("/auth")
    Call<AuthResponse> authUser(@Body AuthRequestBody body);
}

Вот ваше тело запроса:

class AuthRequestBody {
    private String login, password;

    // constructor, getters, setters
}

Оно будет автоматически сериализовано в JSON с помощью GSON:

{ "login": "some string", "password": "some string" }

Допустим, вот ваш JSON-ответ от сервера:

{ "success": true }

Тогда ваш десериализованный класс может выглядеть так:

class AuthResponse {
    private boolean success;

    public boolean isUserLoggedIn() {
        return success;
    }
}

Это будет сделано автоматически GSON-ом, т.к. вы добавили GsonConverterFactory в билдере при инициализации ретрофита.

Допустим, из ваших двух EditText по нажатию на кнопку вы получаете логин и пароль юзера:

String login = loginEditText.getText();
String password = passwordEditText.getText();
AuthRequestBody body = new AuthRequestBody(login, password);

Тело запроса сформировано. Теперь проинициализируем интерфейс для работы с API:

AuthApi api = retrofit.create(AuthApi.class)
Call<AuthResponse> call = api.authUser(body);

И теперь обрабатываем ответ:

call.enqueue(new Callback<AuthResponse> {

    @Override
    public void onResponse(Call<AuthResponse> call, Response<AuthResponse> response) {
        if (response.isSuccessful()) {
            AuthResponse serverAnswer = response.body();

            if (serverAnswer.isUserLoggedIn()) {
                // Авторизация прошла успешно
                // можно, например, перейти на другую активити
            } else {
                // Авторизация не прошла
            }
        } else {
            // Ошибка при запросе
        }
    }

    @Override
    public void onFailure(Call<AuthResponse> call, Throwable t) {
        // Ошибка при запросе
    }
});

Вот, собственно, и вся логика.

Ваше тело запроса AuthRequestBody будет сериализовано в JSON, почитайте про то, как это работает, в частности про библиотеку GSON.

Проверяем токен на сервере. (php)

Хочу обратить внимание, полученный нами токен имеет тип Online. И действует он лишь 10 минут. Для получения offline токена (чтобы дольше работать с ним с сервера) обратитесь к этой инструкции

Процесс аутентификации

Picture9

Разбираемся детально ху из ху

В данный момент на слуху следующие протоколы:

  1. OpenID — для проверки учетных данных пользователя (identification & authentication).
  2. OAuth — про то, чтобы получать доступ к чему-то.
  3. OpenID Connect — и про и то, и про другое одновременно.

Регистрация нашего приложения.

Изначально забыл этот пункт — исправляюсь.


Нам необходимо зайти на

Сервис выдачи токенов

Open ID Connect Provider — важнейший объект всей конструкции централизованного сервиса аутентификации, он также может называться Security Token Service, Identity Provider authorization server и т. д. Различные источники называют его по-разному, но по смыслу это сервис, который выдает токены клиентам.

Основные функции:

Токен доступа

Access Token — информация, что конкретному пользователю разрешается делать. Клиент запрашивает Access Token и затем использует его для доступа к ресурсам (Web APIs). Access Token содержит информацию о клиенте и пользователе, если она присутствует. Важно понимать, что есть такие типы авторизации, при которых пользователь в процессе непосредственно не участвует (подробнее об этом в следующей части)

Токен личности


Identity Token — подтверждение аутентификации. Этот токен содержит минимальный набор информации о пользователе.

Токен обновления

Refresh Token — токен, по которому STS вернет новый Access Token. В зависимости от режима работы, Refresh Token может быть многоразовым и одноразовым. В случае с одноразовым токеном, при запросе нового Access Token будет также сформирован готовый Refresh Token, который следует использовать при повторном обновлении. Очевидно, что одноразовые токены более безопасны.

Более подробно о составе токенов в разделе «структура токена».

Установка на устройство доступно в двух видах:

  1. Публикация конфигурации для мобильной платформы 1С на веб-сервере, с последующей загрузкой на устройстве.
  2. Сборка apk-файла с помощью сборщика мобильных приложений, с последующей установкой либо напрямую в устройство либо через Google Play.

Формат

Picture10

Заключение


Возможно код сырой и написан достаточно криво. Однако я целую неделю убил на поиск работающего решения. Решение это я нашел тут:

Backend

Для владельцев сервисов доступна детальная статистика об статусах авторизации их клиентов. Вы можете создавать для каждого сервиса свой отдельный Application и следить за его использованием. Кроме того, Вы можете настроить Web-хуки, которые будут отправлять данные об авторизации:

Заключение первой части

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

Stay tuned.

Спойлер второй части

Минимальная реализация интеграция Identity Server в ваше приложение выглядит так:

public void Configuration(IAppBuilder app)
{
    var factory = new IdentityServerServiceFactory();
    factory.UseInMemoryClients(Clients.Get())
           .UseInMemoryScopes(Scopes.Get())
           .UseInMemoryUsers(Users.Get());

    var options = new IdentityServerOptions
    {
        SiteName = Constants.IdentityServerName,
        SigningCertificate = Certificate.Get(),
        Factory = factory,
    };

    app.UseIdentityServer(options);
}

Минимальная реализация интеграции веб-клиента с Identity Server:

public void Configuration(IAppBuilder app)
{
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = "Cookies"
    });

    app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
    {
        ClientId = Constants.ClientName,
        Authority = Constants.IdentityServerAddress,
        RedirectUri = Constants.ClientReturnUrl,
        ResponseType = "id_token",
        Scope = "openid email",
        SignInAsAuthenticationType = "Cookies",
    });
}

Минимальная реализация интеграции веб-API с Identity Server:

public void Configuration(IAppBuilder app)
{
    app.UseIdentityServerBearerTokenAuthentication(
        new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = Constants.IdentityServerAddress,
            RequiredScopes = new[] { "write" },
            ValidationMode = ValidationMode.Local,

            // credentials for the introspection endpoint
            ClientId = "write",
            ClientSecret = "secret"
        });

    app.UseWebApi(WebApiConfig.Register());
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *