最小的方式来唯一识别Android用户

如何唯一标识已安装应用的用户,以便:

  1. 如果他们删除并重新安装您的应用,您就会知道是他们;
  2. 如果他们将应用程序安装在他们打算同时使用的第二台设备上,您会知道是他们吗?

举个例子,我看到Netflix应用会在没有任何用户互动的情况下自动链接到您的桌面帐户。 我猜它们使用accountManager.getAccounts()或类似的方法,因为它们还需要GET_ACCOUNTS权限。 但当然,该许可被标记为Protection level: dangerous 。 是否有任何技术可以做到这一点,侵入性较小或可能是惊人的?


回答这个问题的关键是既简单(对用户而言)和微创。 Android提供了大量识别用户的方法,其中许多方法涉及刺破用户的隐私,如果这是唯一的方法,我会做我现在做的事情(可选的电子邮件注册)。 我只想让我的应用程序知道用户是否已在我的系统中在整个安装过程中注册,而无需采访用户(用户名/密码,电子邮件地址,第三方OAuth等)。

我的主要原因是:

  1. 我不希望重新安装后孤立其内容的用户提出支持请求; 和
  2. 我不想托管很多孤立的内容。

Solutions Collecting From Web of "最小的方式来唯一识别Android用户"

查看Firebase身份validation 。 它非常无缝,不需要太多努力就可以合并。 它也不会让最终用户感到干扰或麻烦。

这是Google的video教程 。

编辑:如果您的用户确定有带有电话号码的蜂窝设备,您可以使用AccountKit 。 这也是他们所谓的OTA(一次性身份validation)。 AccountKit仅使用用户电话号码来validation和validation用户。

编辑: Firebase身份validation现在具有“电话validation”function,类似于上面提到的AccountKit。 两者都是很好的服务。 但是,Firebase手机validation可让您从头开始创建自己的UI(这意味着比AccountKit更好的控制)。 此外,如果您不想创建UI,则可以始终使用FirebaseUI

我通过推送通知实现了与你的东西看起来很相似的东西,如果用户卸载我的应用程序(并从注册ID我得到用户),我可能会收到错误,如果他重新安装,他会获得一个新的注册ID,并尝试获取不同设备的用户UUID

我认为最简单的方法是使用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(); } 

我认为最好的方法是使用Google或Facebook实施登录。 这对用户来说非常无缝,足够安全(因为Google和Facebook被认为是可信的),您不需要实施电子邮件注册,并且您将拥有跨设备的身份。

如果您的应用仅限Android,并且您希望在没有为用户创建任何帐户的情况下提供身份,我相信使用Google帐户名称/ ID是最佳选择( 通过Android访问Google帐户ID /用户名 ),因为您必须使用Google Android手机上的帐户(除非您根据它,删除Google Play服务等)。

如果您只想解决问题的第一点(重新安装后识别Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);出现设备ID – Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID); 虽然它不是100%可靠(fe Factory Reset重置此值)

实现此类function的标准是通过使用JSON Web令牌(JWT)和标准的restful api流量。

假设您的Android应用程序与RESTful api交互以处理所有类似crud的操作和业务逻辑,那么使用JWT作为api的身份validation标识符可以很好地工作。 您可以在每个JWT中嵌入信息,以便识别您喜欢的任何内容(数据库中的用户ID,用户登录的设备ID等)。 JWT本质上是一种数据结构,允许您存储API使用的信息。

有关其工作原理的一些基础知识:

  1. 将JWT引入应用程序 :用户使用其用户名/密码登录应用程序。 然后api返回一个加密的JWT,供客户端用于所有将来的请求。 不要尝试自己进行加密。 任何可以处理api服务的语言都会有这个库。
  2. 使用JWT中的信息 :JWT本身就是一个数据结构。 例如,它可能如下所示:

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

    当您通过请求标头提供身份validation时,您的api将解密JWT,然后在会话的上下文中提供该信息。

如果您提供api使用的语言,那么我可能会推荐一个库。

最后,我将参考您提交的最终要求,其中基本上表明您不希望在安装过程中对用户进行访谈。 如果我理解您的意思,您希望用户能够简单地安装应用程序并开始使用它而无需提供身份validation凭据,那么就无法安全地实现这一点。 你或许可以想出一种让它发挥作用的hackish方式,但它基本上是不安全的。