2017-02-07 6 views
23

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

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

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


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

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

  1. Я не хочу запросы от пользователей, осиротевших их содержание после переустановки; и
  2. Я не хочу размещать много потерянного контента.
+0

Я думаю, что это одна из причин, почему 'GET_ACCOUNTS' имеет уровень« опасный ». Вы будете несколько собирать личную информацию, если будете следить за тем, у кого установлено приложение на основе учетных записей. И поскольку в настоящее время нет связи между одновременно используемыми устройствами, несмотря на связанные аккаунты, я не могу думать ни о чем. – Vacutainer

+0

Я полностью согласен.Здесь, однако, прецедент очень распространен - ​​подумайте о приложении для фотографий. Пользователи устанавливают приложение, я создаю учетную запись, они создают контент, я связываю его со своей учетной записью, некоторые из которых являются частными, некоторые из которых являются общими. Я хочу, чтобы учетная запись сохранялась на всех устройствах, не пугая пользователей с «страшными разрешениями». Я бы хотел, чтобы Android был «GUID», который был уникален для пользователя для каждого издателя, так что «com.mycompany.app1» и «com.mycompany.app2» видели одно и то же значение или что-то в этом роде. Но я понимаю, почему это в настоящее время не сработает. – Andrew

+0

В этом контексте было бы полезно, вы правы. С другой стороны, это может также напугать пользователей, имеющих частично закрытый контент, «волшебным образом» на другом устройстве. Возможно, если вы полностью объясните разрешение во время запроса на разрешение, это поможет устранить шрамы. Это также позволит пользователю выбрать, хочет ли он, чтобы его содержимое ограничивалось одним устройством. – Vacutainer

ответ

9

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

Адрес: video tutorial.

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

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

+2

Я собираюсь принять этот ответ, потому что я думаю, что это приближает меня к моей цели, хотя есть некоторые действительно интересные идеи ниже. Наиболее интересна система уведомлений о перекрестном устройстве, предложенная @ assem-mahrous (хотя я не уверен, что она является постоянной/детерминированной для всех установок). Что решает это для меня, Firebase разрешает «анонимный вход», поэтому пользователи могут сразу войти в приложение, изучить, создать собственный контент, а затем, когда они почувствуют себя инвестированными и доверяют ему, они могут обновить свою личность до своей учетной записи Google (или FB или адрес электронной почты/пароль). И они могут обеспечить единую учетную запись. – Andrew

+2

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

1

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

+0

Спасибо за ответ. Если у них нет Google/Facebook? Думаю, я могу использовать Twitter. Нет Twitter? Наверное, может быть, Foursquare. Нет Foursquare? Тогда Вейбо. Тогда Еци. Затем Fitbit, Mixi и Netflix. Это путь бесконечной регрессии. Тогда возникает вопрос о том, удобны ли пользователи для подключения к вашей идентификации OAuth, и если вам удобно подключать ваше приложение и базу пользователей к этому провайдеру. Я лично никогда не чувствую себя комфортно, нажимая эту кнопку (это единственное, что я сейчас подключил). Я думаю, что это слишком сильно сходит с слишком маленьким возвратом. – Andrew

+0

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

+1

@ Андрей, как вы думаете, ничто не будет работать для вас. Если у вас есть устройство Android, вы должны настроить его с помощью учетной записи Google. Если у кого-то есть какие-то странные корневые образы для Android, и нет учетной записи facebook или twitter, мы уже говорим об иглах в стоге сена. И это совершенно не бесконечный регресс. Вы предоставляете пару простых вариантов для пользователей, если у них нет ни одной из этих учетных записей, они просто должны будут зарегистрироваться, используя свою электронную почту. О, и что, если у них нет электронной почты? :) Ты знаешь, о чем я говорю? –

1

Если ваше приложение является Android, и вы хотите предоставить личность без создания учетной записи для пользователя, я считаю, что использовать имя учетной записи Google/id - лучший выбор (Accessing Google Account Id /username via Android), так как вы должны использовать учетную запись Google на телефоне Android (если вы не установили ее, не удалите сервисы Google Play и т. д.).

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

+0

Спасибо за ответ , Я думаю, что 'Secure.ANDROID_ID', приближается к ответу, который отвечает моим требованиям при переустановке приложения или очистке данных устройства, хотя проблема с заводским сбросом - это муха в мазе точно. Я предполагаю, что «ADROID_ID» одного пользователя будет отличаться от устройства к устройству. – Andrew

0

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

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

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

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

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

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

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

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

+0

JWT отлично подходит для поддержания состояния через сеансы (хотя, как многие объяснили в другом месте, JWT хуже для поддержания сохранения состояния). Мой вопрос, однако, заключается в том, чтобы поддерживать идентификацию в новых экземплярах. Это именно мой вопрос, и я уже предоставил способ, которым это делается, безопасно и не хаки, NetFlix. – Andrew

+0

Когда netflix обнаруживает, что у вас установлена ​​настольная версия (или в приложении для Android установлено приложение для Android, и затем использует учетные данные, найденные в этом приложении для предоставления доступа через браузер, почти наверняка просто извлекает JWT из локального приложение и используя это для аутентификации. Он может запросить новую уникальную возможность отличить себя от настольного приложения для аналитики, но дело в том, что вам нужно опросить пользователя хотя бы раз на каждом отдельном устройстве ради безопасности. – melchoir55

+0

Если ваша проблема заключается только в том, что JWT остается между установками приложения, вы должны хранить данные вне «нормального» приложения. Например, вы можете создать зашифрованный файл на SD-карте или файловой системе. – melchoir55

4

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

+0

спасибо за это. Вы используете Firebase или еще GCM для получения UID? Кроме того, знаете ли вы, что неаутентифицированный пользователь получит тот же UID на двух устройствах, которыми она владеет (например, телефон и планшет)? Я уверен, что это будет невозможно с публичным API, но если Google использует частный API, это может быть возможно. – Andrew

+0

firebase, но реализованный на моем бэкенде на laravel, каждый пользователь получает уникальный токен, и если он удалит и переустановит приложение, он получит новый токен, единственная уникальная вещь - UUID, я даже получаю его, прежде чем регистрироваться в своем приложении, чтобы быть в состоянии отслеживать его –

2

Я думаю, что самый простой способ - использовать 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(); 
} 
+0

Это не сработает, если пользователь удалит приложение с устройства. Данные SharedPreference будут удалены, если пользователь удалит приложение –

Смежные вопросы