2011-11-23 152 views
0

的计划:为Android应用程序登录系统

我开发在很大程度上数据库驱动的Android应用程序(如中,大部分的内容通过一个RESTful服务层是从MySQL数据库中提取我的网络服务器)。

在可以对API请求数据进行任何调用之前,用户必须通过将凭据传递给数据库进行身份验证来进行身份验证。如果用户被验证,我会传回授权令牌。如果用户选择了“记住我”选项,该令牌将被保存在本地以供将来使用。

所有将来的API调用都需要包含此授权令牌。

当用户希望注销时,会将呼叫发送回API以从数据库中删除该令牌,从而使其无效以供将来使用。令牌的本地副本也会被删除。


的问题

如果用户注销,并直接关闭应用程序(家庭或后退按钮),并没有足够的“记住我”选项选中,我想销毁服务器上的令牌。如何才能做到这一点?


可能的解决方案#1

  • 如果有onExit事件触发应用程序退出时,请对API让它知道摧毁令牌的呼叫。
  • 用这种方法

的问题是:

  • 请问这种情况存在,这是保证在所有 条件来提高(home键,返回键,程序崩溃(我能活 没有这个))?

可能的解决方案#2

  • 维护数据库中的一个time of last activity列。如果自上次活动后致电x min,该令牌将被视为过期。

使用这种方法的问题是:在每个API调用更新数据库中的时间列的

  • 额外开销。

  • 此外,我现在必须存储在数据库中,如果用户选择要记住,因为在那种情况下令牌不能过期。


你会实行这两种解决方案?还是有另一种更好的方式来实现这种机制?

如果您建议#1,请告诉我哪个事件会符合我的目的。

+0

当用户没有选择“记住我”选项时,为什么要在服务器上保存授权令牌?您的授权请求可能包含1)凭证2)“记住我”选项。只有在选择选项时才记住标记。 – Flavio

+0

我一直在想,一旦我收到了证书并验证了用户,发出令牌就不需要每次进行API调用时都要将用户名和密码传递给服务器,从而使其更安全。令牌将是临时的,而密码更持久。此外,拥有令牌可以让用户远程登出任何设备。 (访问朋友的电话,忘记注销) – xbonez

回答

1

你的第一个解决方案是不适用的,因为:

  1. 没有的OnExit事件。 (当然,如果用户按Home或Back按钮只是为了弄清楚用户是否隐藏了应用程序,你可以创建基本活动并在那里监控)但是这非常复杂)
  2. 不要依赖客户端注销。如果用户请求注销,但当时互联网不可用,该怎么办?
  3. Android可以在低内存的情况下随时杀死您的应用程序。

您最好实施第二种解决方案。正面:

  1. AFAIK,这是常见的做法,当服务器控制授权令牌
  2. 无需在数据库中存储,如果选择的用户要记住到期。只需将过期日期设置为Integer.MAX_VALUE或其他。
1

我认为这应该由服务器来处理。当您的会话在特定的不活动时间后死亡时,服务器必须是注销用户的服务器。我不确定是否有整个应用程序的监听器,如果它死了,但我从来没有听说过。另外,用户可以始终强制杀死应用程序,而无需通过任务管理器注销。

+0

我也倾向于这种解决方案。我不认为维持上次活动时间的开销应该是显而易见的,但我会测试并检查这一点。 – xbonez

+0

是的。我之前做过一个Web服务,并且做了这个解决方案。你可以做的就是将会话设置为在一段时间不活动之后终止,并创建一个监听器,在会话消失时监听它。你并不需要在数据库上保存最后的交易时间。但这一切都取决于你的网络服务是有状态的还是无状态的。 – Arci