【问题标题】:Problems of security code of android app when interacting with Java RESTful servicesandroid app与Java RESTful服务交互时的安全码问题
【发布时间】:2015-03-12 17:47:04
【问题描述】:

我使用 spring 和 maven 构建了一个 RESTful 服务,另外,我编写了一个 Android 应用程序来访问我的网站,并且在应用程序的登录页面上有一个安全代码。

现在,我可以从服务器获取安全码图像并成功显示在登录页面上,但是当我将正确的安全码和帐户信息发送到服务器时,我发现我找不到在发送时保存的安全码生成。我将它作为属性保存到会话对象中,但结果是不同的会话对象,因为下载安全代码和登录是两个不同的请求。我需要验证安全码,所以我希望有人能帮助我解决以下问题:

  1. 由于下载安全码和登录是两个不同的请求,服务器如何知道安全码是为谁生成的?服务器端生成的安全码应该保存在哪里?
  2. 对于防伪码图片,我返回给手机端的是一个字节数组,把这个数组转换成图片显示在Activity上,请问这个图片怎么返回手机端呢?有没有更好的方法?
  3. 我希望移动用户的会话从成功登录到会话超时都是有效的,所以我想知道如何维护移动用户的会话?
  4. 除了 RESTful 服务之外,Android 应用通常可以通过哪些方式与服务器交互?

对不起我的英语,希望我已经清楚地描述了我的问题......

任何答案将不胜感激,在此先感谢。

【问题讨论】:

  • 也许您可以在测试期间使用 curl 来查看在 http 中来回传递的标头。这可能会让您更好地了解如何为 android 登录请求设置标头和参数值。

标签: android security rest interaction


【解决方案1】:

听起来您需要就如何构建您的服务(以及您的客户)做出一些相当高层次的决定。

您需要决定的第一件事是您希望您的服务是有状态的还是无状态的。传统上,REST 服务是无状态的,但这些是您的服务,所以这是您的选择。

  1. 由于下载安全码和登录是两个不同的请求,服务器如何知道安全码是为谁生成的?服务器端生成的安全码应该保存在哪里?

如果您要使用有状态路由,请使用会话 cookie。当从客户端收到对安全代码图像的请求时,该服务将开始会话。客户端在收到服务的响应时会设置 cookie。该会话 cookie 会将客户端的后续请求映射到会话,从而允许服务器将请求与安全代码相关联。

如果你要走无状态路线,你应该向客户端传递另一条信息,比如一些 uuid。客户端的下一个请求将包含安全码和 uuid。服务器将保留 uuid 到安全映像的映射,允许它验证客户端的请求。

  1. 对于安全码图片,我返回给手机端的是一个字节数组,把这个数组转换成图片显示在Activity上,请问这个图片如何返回手机端呢?有没有更好的方法?

字节数组很好。 Base64 编码的字符串也可以使用。您可能只包含指向图像的 http 链接。您的来电。

  1. 我希望移动用户的会话从成功登录到会话超时都是有效的,所以我想知道如何维护移动用户的会话?

如果您的服务是有状态的,您应该使用会话 cookie。您的 Android 客户端应该能够保留一个 cookie 存储来保存会话 cookie 并为每个请求发送它。

如果您的服务是无状态的,并且您不想为每个请求发送用户名和密码,您将需要某种临时身份验证令牌。服务将负责使该令牌过期。客户端将负责保存状态并将所有必要的信息传递给每个请求的服务。

  1. 除了 RESTful 服务之外,Android 应用通常可以通过哪些方式与服务器交互?

Android 具有开箱即用的 HTTP 功能,并且有许多优秀的第三方库可以在您需要时为您提供帮助。但如果您愿意,Android 也可以低于 HTTP。

你在这里的问题真的很模糊。当然,大多数网络都是通过 HTTP 完成的(使用 REST 或其他),但并非必须如此。这取决于您决定您希望您的服务支持什么,然后让客户遵守它。如果您感觉特别受虐,您可以使用 SOAP。您可以制定任何您想要的合同。

REST 之所以成为 Web 服务的一种非常常见的结构,是因为它对 HTTP 规范很直观,并且很容易在大多数类型的客户端上实现,以及其他原因。 ,

【讨论】:

  • 感谢您的详细回答,非常清楚,还有一个问题:如何为移动设备生成令牌?最常见的几种方式?
  • @Xiaolong 您将在服务器上生成令牌。对于 Java,您可以使用 java.util.UUID.randomUUID(); 来执行此操作。如果你在 ORM 中使用 hibernate,你可以使用 @GeneratedValue 来生成 ID 并存储在数据库中。获取唯一令牌/ID 的方法有很多。
  • 抱歉,回复晚了,对您的回答很有帮助,非常感谢,再次感谢。
猜你喜欢
  • 2012-03-13
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多