设计 RESTful 登录服务

Posted

技术标签:

【中文标题】设计 RESTful 登录服务【英文标题】:Designing RESTful login service 【发布时间】:2011-06-21 13:52:07 【问题描述】:

我遇到了类似的问题here。但我还不清楚概念。这是我的场景...

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

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

据我了解,您正在尝试在客户端和服务器之间实现 stetefull 通信。因此,您使用第一个请求登录,然后使用某种令牌发出进一步的请求。

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

    客户端可以通过 HTTP Headers 提供用户名和密码(非标准,例如 UserName: userPassword: secret)。 在服务器端,您可以使用
      使用 AOP: 只需将 BooksService 包装为 AuthAdvice(您应该自己编写)。建议您以某种方式访问​​(使用 Jersey 功能)HTTP 请求,从中获取对应的标头,验证并授权用户(您从数据库加载),将用户放入 ThreadLocal(以便它可用于您的应用程序的其余部分) 如果需要,只需调用相应的方法或在凭据有问题时抛出异常。 使用 Jersey 功能:(对不起,我对 Jersey 不是很熟悉,我使用的是 CXF,但从概念上讲应该是一样的)只需创建某种 AuthHendler 并将其放入 request pre -处理管道。在此处理程序中,您需要与AuthAdvice 中的完全相同

现在您的每个请求都将在到达BooksService 时进行身份验证和授权。一般来说,无状态实现在可扩展性方面要好得多。

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

更新:并使用 HTTPS! :)

【讨论】:

非常感谢 Easy Angel :) 但我仍然不清楚 AuthAdvice 和 AuthHandler 的概念。您能否添加一个示例或给我一些指示? @user430720 - 你可以看这里(spring-aop + jersey):javakaffee.de/blog/2008/11/15/…【参考方案2】:

我对 Easy Angel 的回答没有任何争议,但我觉得你也想对这些概念进行一些额外的评论。

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于设计 RESTful 登录服务的主要内容,如果未能解决你的问题,请参考以下文章

Restful设计,如何创建授权服务

开放接口/RESTful/Api服务的设计和安全方案

RESTFUL API 中的多次登录

如何对 WCF 4 RESTful 服务进行身份验证?

RESTFul Shiro

是否可以通过 RESTful 服务使用他们的 Facebook 帐户登录某人?