如何在REST Web服务(Java + Jersey)中使用Basic HTTP Auth?

时间:2013-07-05 11:32:06

标签: rest http-headers jersey http-authentication

我是REST网络服务的新手,刚刚创建了我的第一个网络服务 在我的服务中,用户可以通过简单的表单创建配置文件,提供他想要的用户名和密码。

现在如何在用户登录时检查用户凭据? 我的意思是我有一个简单的表单,用于验证用户是否已登录但如何验证用户何时执行添加/更新/删除的各种配置文件操作?

例如:
在FB中,您登录并存储一个具有您的凭据的cookie,当您执行“发布状态”等操作时,向朋友发送消息......等等...它不再要求您的凭据,因为它有一个cookie您的凭据在那里,它只使用该cookie ...

但是在REST中我们不使用cookie,所以下一个选项是HTTP头。 我想知道如何通过HTTP标头发送和接收用户凭据.i.e
Basic HTTP Auth

1 个答案:

答案 0 :(得分:29)

客户端

要将凭据发送到API,请使用HTTP Authorization标头,以Basic username:password的形式指定凭据。 username:password字符串必须使用名为Base64的编码方案进行编码。所以示例标题看起来像这样:

Authorization: Basic d2lraTpwZWRpYQ==

由于其余规范声明客户端 - 服务器通信应该是无状态的,因此您必须在每个请求中包含带有凭据的标头。通常,您将在客户端使用会话cookie来识别用户,这样他就不必在每个请求中输入他的凭据。

服务器端

要检查Jersey REST服务中的凭据,您需要捕获并拦截所有传入的请求。泽西岛提供了一个名为ContainerRequestFilters的概念来实现这一目标。例如,如果您使用Tomcat,您可以在web.xml中的servlet定义中添加此类型的过滤器,如下所示:

<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>your.package.BasicAuthFilter</param-value>
</init-param>

引用的类BasicAuthFilter需要实现Jerseys ContainerRequestFilter接口并覆盖public ContainerRequest filter(ContainerRequest request)方法。在方法内部,您基本上将执行以下操作:

  • 从请求的Authorization标头中获取Base64编码的凭据
  • 解码它们(即使用javax.xml.bind.DatatypeConverter.parseBase64Binary()
  • 使用您的UserDao(或其他数据源提供商)检查凭据是否有效
  • 如果验证失败(<{1}}),则
  • 返回状态代码401 Unauthorized
  • 如果凭证有效,只需返回请求以将其委托给负责处理凭证的泽西资源

您可以在this博文中找到一个很好的例子。