设计RESTful登录服务

Jag*_*uar 2 java rest login

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

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

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

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

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

谢谢 !

ten*_*shi 6

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

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

  1. 客户端可以通过HTTP标头提供用户名和密码(非标准,如UserName:userPassword:secret).
  2. 在服务器端,您可以使用
    1. 使用AOP:只是包装你BooksServiceAuthAdvice(你应该自己写).建议您以某种方式访问​​(使用Jersey功能)HTTP请求,从中获取相应的标头,对用户进行身份验证和授权(从数据库加载),ThreadLocal如果需要,将用户置于其中(以便其他应用可用)如果凭据有问题,只需调用相应的方法或抛出异常.
    2. 使用泽西功能:(抱歉,我不是很熟悉泽西岛,我使用的是CXF,但从概念上讲它应该是相同的)只是创建某种类型AuthHendler并将其放入请求预处理管道中.在这个处理程序中,你需要与in完全相同AuthAdvice

现在,您的每个请求都会在到达时进行身份验证和授权BooksService.通常,无状态实现对于可伸缩性来说要好得多.

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

更新:并使用HTTPS!:)