这对我来说似乎是一个反复出现的问题,因为我似乎在过去几年里都倾向于使用移动应用程序。除了网络用户,我还要对移动用户进行身份验证和授权。我需要使其足够无缝,以便用户可以轻松拥有一个Web帐户,而不会中断他们的数据。我希望解决方案在主题中是架构,而不是特定于任何语言/框架。
要求/假设
考虑的架构
您认为什么是好的解决方案?其中之一,还是其他什么?
答案 0 :(得分:2)
我想提出类似于2的想法。
为每个移动设备生成UUID。当用户生成内容并将内容发送到服务器时,它将用于在以后出现时识别设备。
如果用户在以后的任何时间想要创建一个网络帐户,他可以在网上或设备上注册。如果用户已经拥有一个网络帐户,他可以选择在他的移动设备上提供一次(或设备)现有凭证,并将该设备链接到他在服务器端的网络帐户。
在服务器端,我将允许两种不同类型的实体作为身份:通过凭证进行身份验证的Web用户(OpenID在我看来是一个附加功能)和通过其GUID进行身份验证而无需用户干扰的设备。当然,Web用户实体可以拥有多个设备实体。当用户选择将其设备链接到现有帐户时,设备实体链接到帐户。内容通常与身份相关联。
保留用户和设备之间的链接,也可以用于显示内容的来源。
您无需为移动用户创建/删除/转换生成凭据的帐户。您也不需要在移动设备上存储凭据。
仍有一些安全注意事项未决,具体取决于应用程序上下文的重要性。如果没有任何安全措施,攻击者会发现滥用UUID很容易。
答案 1 :(得分:2)
我认为这是从错误的方向看待的。在服务器上定义由任意值定义的标识。可能只是一个数据库序列。将任何人口统计信息(姓名,电子邮件...)和使用历史与此身份相关联。
另外,在服务器上定义身份验证实体。这可以是用户/密码。它可以是设备GUID / UUID。它可以是像OpenID这样的联合ID。给定身份可以具有(并且通常将在您的用例中)多个关联的身份验证实体。很可能是同一类型的多个身份验证身份。 (例如我的智能手机的GUID,我的iPad的GUID ......)
您的前端(无论是基于Web还是基于应用程序)使用定义的API对用户进行身份验证;使用前端支持的任何机制。
在某些情况下(特别是本机应用),未知ID的显示会触发创建新身份。但是,正如有人指出的那样,在这种情况下,您应该询问用户是否要连接到现有身份。他们需要提供身份验证(一次)以建立该连接。
另一点,无论服务器用于唯一指定标识,都应该是从不提供给客户端的值。客户端只知道身份验证机制及其数据。也就是GUID / UUID,用户名/密码......
除了上面列出的技术之外,像OAuth这样的东西比本地生成的GUID更安全。这些是以下之一:容易确定或b:容易丢失。如果该值具有高度可预测性(比如电话号码),则很容易被欺骗。如果它是在运行时生成的并且包含难以预测的值,例如当它首次生成时的当前时间的哈希值,那么它必须存储在设备上并且如果擦除设备则很容易丢失。可以生成良好的GUID,但它们通常是特定于设备类型的。从ROM,IMEI中检索到的设备序列号......这很容易实现。但是,与我可能会感到满意的相比,它更具体的设备依赖性。
我在整个方法中看到的最大的障碍是允许现有设备(无用户名/密码)用户坐在PC浏览器并连接到他现有的帐户将会很尴尬。
答案 2 :(得分:0)
第2号作为基本决定是足够好的。用户讨厌注册;)因此,无需注册即可使用服务的能力。
您可以使用GUID / UUID来识别设计。并在用户登录前将其用作匿名登录。
但如果2个(或更多)人使用1个设备该怎么办?或设备将被丢失,被盗? 我认为没有一点可以涵盖这些案例。
我不知道您设计的是哪种Web服务,因此无法提供更多建议。
答案 3 :(得分:-3)
一种解决方案是生物识别。如果移动设备具有生物识别传感器,例如指纹读取器,则用户将在购买时使用该设备登记生物识别(仅由于隐私问题)。可以编写应用程序,使每个安全事务都要求用户验证生物识别。
这似乎并不太遥远。摩托罗拉Atrix有一个指纹传感器......