2012-08-29 61 views
11

好的。我开始为我们的企业Web应用程序开发Android应用程序。刚刚开始登录屏幕活动设计。Android登录设计和开发 - 方法和最佳实践

此应用程序完全由RESTFul API驱动。

我想了解如何开发登录/注销功能在应用程序。 据我所知,应用程序领域没有Session概念。另外,对于API,我们需要发送每个请求的用户名和密码(基本身份验证)。显然,我们需要将登录凭证保存在本地存储的某个位置,以便随每个请求一起发送。

以下是我从我的基本的Android知识理解。

当用户输入登录信息,并按下按钮,我们将旋转了一个HTTP调用API。如果登录凭证有效,那么我们必须在本地存储凭证。选项有

  1. SQLite的
  2. 共享偏好。 (我从来没有使用过,但我猜想,我们可以用这个)
  3. 包(不知道这是一个选项)

任何其他的选择吗?

我想确保我遵循最佳实践,而不是从性能和结构的角度牺牲。

而对于注销,我想我只需要消灭本地存储的证书,并显示登录活动。

有没有什么不同的更好的方法?

回答

13

我会建议使用Android Accounts功能。

This blog有一个很好的一步一步指导您需要放在一起的所有位。

总体思路是提供AccountManager用户名/密码,并将其留给AccountManager以安全存储。

当您需要身份验证令牌时,您需要向AccountManager请求一个身份验证令牌,它会返回一个缓存的令牌,或者回拨您的代码(传递用户名/密码),并将您的验证服务调用为得到一个新的令牌。

+0

我对第3段感到困惑。当您将数据存储在帐户中时,它是否会在某个时间过期?这意味着,如果用户处于应用程序中间,在某个活动中,如果帐户不给我U/P,我需要显示登录屏幕以再次获取U/P? –

+0

@KevinRave他正在考虑从首选项中重用访问令牌 –

+0

用户名/密码不会过期。从web服务返回的身份验证令牌可能会过期(在服务器端),如果发生这种情况,您需要通知AccountManager该令牌已过期,并且会触发回叫,指示您获得新的令牌 – Rob

2

一般来说,有三种方法可以在Android的持续数据:SQLite的,SharedPreferences和读取/写入到文件中,一拉的Java I/O。 SQLite是关系数据的最佳选择,但是因为您只需存储用户的凭据,所以我建议您使用SharedPreferences。在我看来,就像一个简单的键值数据模型。

SharedPreferences基本上只是直接文件I/O的封装 - 也就是说,底层实现仍然是文件读取和写入,但是对于键值对来说是简化的。我对加密知之甚少,但在将密码存储到对象之前,您可能必须自己处理该密码(也可以考虑JaiSoni的建议:改为使用访问令牌)。但请放心,如果您创建了SharedPreferences并将其设置为MODE_PRIVATE,则其他应用程序将无权访问共享的prefs文件。

我相信这几乎是一个标准的实现。如果你看看这个页面,你可以做的只有很多:http://developer.android.com/guide/topics/data/data-storage.html

我还可以指出,直接文件I/O的复杂性之一是你必须决定你想存储在哪里文件 - 内部或外部存储器(例如SD卡) - 因此检查其可用性(并非所有设备都有SD卡插槽,有时内部存储器被注册为设备的外部存储器)。所以,只要去共享首选项。

对于注销,这可能是有用的:Deleting shared preferences

+0

谢谢。我想知道,如果这是一个标准的做法。或者有更好的方法来做到这一点。关于注销? –

+0

@KevinRave请参阅编辑。 –

2

我认为存储应用程序密码是糟糕的想法,更好的办法是只在第一次做出与用户证书请求时,获得用户登录服务器返回一个访问令牌在SharedPreferences中保存此访问令牌的其他目的,如获取用户详细信息在请求中使用该令牌。
会议:为维护会话创建自己的班级。 Hackbook就是一个很好的例子。

+0

很棒的建议。这将需要他们修改后端,但是,我是对的吗?如果访问令牌机制还没有实现,那就是。 –

+0

@mattquiros是的,您将需要支持访问令牌的Web服务 –

+0

@mattquiros您是对的。这是后端业务逻辑的变化。目前尚无法做到这一点。 –

0

为什么您需要将登录凭证保存在文件或数据库中?你想在你的应用程序重新启动后自动登录?如果持久性不是必要的,你可以把凭证放到一个静态java成员中。

+0

在整个用户会话中是否可以跨应用程序访问? –

+0

不确定在运行期间如何为静态成员分配用户名和密码? –

+0

如果您公开它,它是可访问的。有关详细信息,请参见[教程了解实例和类成员](http://docs.oracle.com/javase/tutorial /java/javaOO/classvars.html) – k3b