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

时间:2017-02-07 04:45:52

标签: android identity android-permissions

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

  1. 如果他们删除并重新安装您的应用,您就会知道是他们;
  2. 如果他们将应用安装在他们打算同时使用的第二台设备上,您会知道是他们吗?
  3. 举个例子,我看到Netflix应用会在没有任何用户互动的情况下自动链接到您的桌面帐户。我猜他们使用accountManager.getAccounts()或类似方法,因为他们还需要GET_ACCOUNTS权限。但当然,该权限标记为Protection level: dangerous。是否有任何技术可以做到这种侵入性较小或可能有惊人的技术?

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

    我的主要原因是:

    1. 我不想要重新安装后孤立其内容的用户的支持请求;和
    2. 我不想承载大量孤儿内容。

6 个答案:

答案 0 :(得分:9)

看看Firebase Authentication。它非常无缝,不需要太多努力就可以合并。此外,它对最终用户来说也不会产生干扰或麻烦。

以下是Google的video tutorial

修改 如果您的用户确定拥有带有电话号码的移动设备,您可以使用AccountKit。这也是他们所谓的OTA(一次性身份验证)。 AccountKit仅使用用户电话号码来验证和验证用户。

修改 Firebase身份验证现在具有“电话验证”功能,类似于上面提到的AccountKit。两者都是很好的服务。但是,Firebase手机验证可让您从头开始创建自己的UI(这意味着比AccountKit更好的控制)。此外,如果您不想制作用户界面,可以随时使用FirebaseUI

答案 1 :(得分:4)

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

答案 2 :(得分: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();
}

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

如果您只想解决问题的第一点(重新安装后确定),那么设备ID - Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID); 虽然不是100%可靠(fe工厂)重置重置此值)

答案 5 :(得分:0)

实现此类功能的标准是将JSON web tokens (JWT)与标准的restful api流量结合使用。

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

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

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

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

    你的api会在提供时解密JWT 通过请求标头进行身份验证,然后在该标识中提供该信息 会议背景。

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

    我将通过引用您提交的最终要求来结束,其中基本上表明您不希望跨安装来访问用户。如果我理解您的意思,您希望用户能够简单地安装应用程序并开始使用它而不提供身份验证凭据,那么就无法安全地实现这一点。你或许可以想出一种让它发挥作用的hackish方式,但它将从根本上说是不安全的。