Android应用程序的登录系统

时间:2011-11-23 09:37:09

标签: android authentication

计划:

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

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

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

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


问题

如果用户没有注销,只是关闭应用程序(主页或后退按钮)并且没有选择“记住我”选项,我想在服务器上销毁令牌。怎么办呢?


可能的解决方案#1

  • 如果应用程序退出时会触发onExit事件,请调用API让其知道销毁令牌。

此方法存在以下问题:

  • 是否存在此类事件,保证会在所有事件中提出 条件(主页按钮,后退按钮,程序崩溃(我可以活下去) 没有这个))?

可能的解决方案#2

  • 在数据库中维护time of last activity列。如果自上次活动后拨打x min,则该令牌将被视为已过期。

此方法存在以下问题:

  • 在每次API调用时添加了更新数据库中时间列的开销。

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


您将实施两种解决方案中的哪一种?或者是否有另一种更好的方法来实现这种机制?

如果您建议#1,请告知哪些事件符合我的目的。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

  1. 没有onExit事件。 (当然,如果用户按下Home或后退按钮以确定用户是否隐藏应用程序,您可以创建基本活动并监控那里。但这非常复杂)
  2. 不要依赖客户端注销。如果用户请求注销但当时没有互联网,该怎么办?
  3. Android可以在内存不足的情况下随时杀死您的应用程序。
  4. 您最好实施第二个解决方案。肯定:

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