Подтвердить что ты не робот

Наименее инвазивный способ однозначно идентифицировать пользователя Android

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

  • Вы узнаете, что это они, если они удаляют и переустанавливают ваше приложение;
  • Вы узнаете, что это они, если они устанавливают ваше приложение на втором устройстве, которое они намерены использовать одновременно?

Как пример, я вижу, что приложение Netflix автоматически свяжется с вашей учетной записью на рабочем столе без какого-либо взаимодействия с пользователем. Я предполагаю, что они используют accountManager.getAccounts() или аналогичный метод, потому что они также требуют разрешения GET_ACCOUNTS. Но, конечно, это разрешение отмечено как Protection level: dangerous. Есть ли какой-либо метод для этого, который менее инвазивен или потенциально опасен?


Ключ к ответу на это должен быть простым (для пользователя) и минимально инвазивным. Android предлагает множество способов идентифицировать пользователей, и многие из этих способов связаны с проникновением конфиденциальности пользователей, и если это единственный способ, я буду делать то, что я делаю сейчас (дополнительная регистрация по электронной почте). Я просто хочу, чтобы мое приложение узнало, зарегистрирован ли пользователь в моей системе через установки без необходимости опроса пользователя (имя пользователя/пароль, адрес электронной почты, сторонний OAuth и т.д.).

Мои основные причины:

  • Мне не нужны запросы поддержки от пользователей, которые потеряли свой контент после переустановки; и
  • Я не хочу размещать много потерянного контента.
4b9b3361

Ответ 1

Посмотрите Firebase Authentication. Он довольно бесшовный и не требует больших усилий для включения. Также он не чувствует себя навязчивым или громоздким для конечного пользователя.

Ниже приведено видеоурок от Google.

EDIT: Если у ваших пользователей есть сотовый телефон с номером телефона, вы можете использовать AccountKit. Это также то, что они называют OTA (одноразовая аутентификация). AccountKit использует только номер телефона пользователя для проверки и проверки пользователей.

EDIT: Firebase Authentication теперь имеет функцию "Проверка телефона", которая аналогична AccountKit, упомянутой выше. Оба являются хорошими услугами. Тем не менее, проверка телефона Firebase позволяет создавать собственный пользовательский интерфейс с нуля (что означает намного лучший контроль, чем AccountKit). Кроме того, если вы не хотите создавать свой пользовательский интерфейс, вы всегда можете использовать FirebaseUI

Ответ 2

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

Ответ 3

Я думаю, что самый простой способ - использовать UUID и хранить хэш на sharedPreferences. Вы должны сгенерировать UUID как можно раньше в своем приложении.

sharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS,Activity.MODE_PRIVATE);
if (sharedPrefs.getString("YOUR-KEY-TO-THE-UUID") == null || "".equals(sharedPrefs.getString("YOUR-KEY-TO-THE-UUID"))){
    prefsEditor = sharedPrefs.edit();
    prefsEditor.putString("YOUR-KEY-TO-THE-UUID", UUID.randomUUID().toString());
    prefsEditor.commit();
}

Ответ 4

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

Ответ 5

Если ваше приложение только для Android, и вы хотите предоставить личность без создания учетной записи для пользователя, я считаю, что использование имени/идентификатора учетной записи Google является лучшим выбором (Доступ к Google Идентификатор учетной записи/имя пользователя через Android), так как вы должны использовать учетную запись Google на телефоне Android (если вы не установили ее, не удалите Службы Google Play и т.д.).

Если вы хотите только обратиться к первой точке своего вопроса (идентифицировать после переустановки), то идентификатор устройства - Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID); , хотя он не на 100% надежный (fe Factory Reset сбрасывает это значение)

Ответ 6

Стандартом для достижения такого рода функциональности является использование JSON web tokens (JWT) в сочетании со стандартным аварийным трафиком api.

Предполагая, что ваше приложение для Android работает с RESTful api для всех кропотливых операций и бизнес-логики, использование JWT в качестве идентификатора аутентификации для вашего api может работать довольно хорошо. Вы можете вставлять информацию в каждый JWT, чтобы вы могли идентифицировать все, что вам нравится (идентификатор пользователя в базе данных, идентификатор устройства, в котором зарегистрирован пользователь и т.д.). JWT - это, по существу, структура данных, позволяющая хранить информацию, которая будет использоваться API.

Некоторые основы для того, как это работает:

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

    { user_id: 1, device_id: 44215, device_os: android, }

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

Если вы предоставляете язык, используемый вашим api, я могу рекомендовать библиотеку.

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