设计RESTful登录服务

时间:2011-02-04 19:09:28

标签: java rest login

我经历了一个类似的问题here。但我还不清楚概念。这是我的情景...

我的客户端(移动设备应用)有一个登录界面,可输入用户名,密码。提交后,他应该看到数据库中的书籍列表以及该用户订阅的书籍列表。

我有/ LoginService接受用户名,密码和&检查mysql数据库以进行凭证验证。只有在授权之后....我有一个/ BookService; GET将返回数据库中的所有书籍。

  1. 我应该在登录服务上使用GET,POST或PUT吗?由于登录请求是只读操作,我应该使用GET - 但这对浏览器来说听起来很愚蠢(因为提交的数据是可见的)。

  2. 什么是accesstokens(在上面的链接答案中提到),以及如何使用Java生成它们?我正在使用Jersey进行开发。它们是一种安全的授权方式吗?

  3. 谢谢!

3 个答案:

答案 0 :(得分:6)

据我所知,您正在尝试在客户端和服务器之间实现完美的通信。因此,您首先请求登录,然后使用某种令牌进行进一步的请求。

一般来说,我可以建议您进行无状态沟通。这意味着,您对每个请求进行身份验证和授权。在这种情况下,您不需要LoginRestService。这里的重点是:

  1. 客户端可以通过HTTP标头提供用户名和密码(非标准,例如用户名:用户密码:密码)。
  2. 在服务器端,您可以使用
    1. 使用AOP:只需用BooksService包裹AuthAdvice(您应该自己编写)。建议您以某种方式访问​​(使用Jersey功能)HTTP请求,从中获取相应的标头,对用户进行身份验证和授权(从DB加载),将用户放入ThreadLocal(以便其他人可以使用您的应用程序)如果需要,只需调用相应的方法或在凭证出错时抛出异常。
    2. 使用泽西岛功能(抱歉,我不是很熟悉泽西岛,我使用的是CXF,但从概念上说它应该是相同的)只是创建某种AuthHendler和把它放在请求预处理管道中。在此处理程序中,您需要与AuthAdvice
    3. 中的完全相同
  3. 现在,您的每个请求在到达BooksService时都会经过身份验证和授权。通常,无状态实现对于可伸缩性来说要好得多。

    如果你想以有条不紊的方式行事,那么你可以使用HttpSessionLoginService.login()应该是POST请求,因为您实际上在服务器上产生了一些副作用。服务将根据提供的用户名和密码执行用户身份验证,并将加载的User对象放入会话。此时,将创建服务器端会话,并且客户端在cookie中具有会话ID。因此,进一步的请求应自动将其发送到服务器。为了向BooksService授权请求,您仍然需要某种Handler建议(请参阅无状态解决方案)。唯一的区别是:这次用户来自HttpSession(您应该检查您是否已登录!)。

    更新并使用 HTTPS ! :)

答案 1 :(得分:2)

我在Easy Angel的回答中没有什么可争议的,但给人的印象是你也想对这些概念做一些额外的评论。

如果您考虑资源而不是服务,问题会更清晰。将您的建议登录视为生成新的授权资源,而不是查询登录服务。然后你会发现POST非常有意义。

授权令牌将是您的用户进入会话对象的关键(如EA的答案中所述)。您可能希望通过连接一些唯一标识该用户并对其进行哈希处理的信息来生成它。我当然同意,如果您希望获得REST的所有好处,那么无状态身份验证方法将更可取。

答案 2 :(得分:1)

使用HTTP中提供的内容:HTTP上的HTTP AUTH。 使用HTTP AUTH保护您的所有资源,浏览器将负责为用户提供登录。

如果您需要会话信息,请使用Cookie或会话参数。 Cookie是为了这些目的而制作的,通常效果很好。