我是REST Web服务的新手,刚刚创建了我的第一个Web服务
在我的服务中,用户可以通过简单的表格创建个人资料,给出他想要的用户名和密码。
现在如何在用户登录时检查用户凭据
我的意思是,我有一个简单的表单来验证用户是否登录,但当用户执行添加/更新/删除的各种配置文件操作时,如何验证用户??
例如:
在FB中,你登录后,它会存储一个cookie,其中包含你的凭据,当你执行"发布状态"等操作时,会给朋友发消息。。。等等…它不再要求您提供凭据,因为它有一个cookie,其中包含您的凭据,它只使用该cookie。。。
但是在REST中,我们不使用cookie,所以下一个选项是HTTP头。我想知道如何通过HTTP标头发送和接收用户凭据。即Basic HTTP Auth
客户端
要将凭据发送到API,请使用HTTP Authorization
标头,以Basic username:password
的形式指定凭据。username:password字符串必须使用名为Base64的编码方案进行编码。因此,一个示例标头可能看起来像这样:
Authorization: Basic d2lraTpwZWRpYQ==
由于rest规范规定客户端-服务器通信应该是无状态的,因此必须在每个请求中包含带有凭据的标头。通常,您将在客户端使用会话cookie来识别用户,这样他就不必在每次请求时都输入凭据。
服务器端
要检查Jersey REST服务中的凭据,您需要捕获并拦截所有传入的请求。Jersey提供了一个名为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
需要实现Jersey ContainerRequestFilter
接口并覆盖public ContainerRequest filter(ContainerRequest request)
方法。在方法内部,您将基本上执行以下操作:
- 从请求的Authorization标头中获取Base64编码的凭据
- 解码它们(即使用
javax.xml.bind.DatatypeConverter.parseBase64Binary()
) - 使用UserDao(或其他数据源提供程序)检查凭据是否有效
- 如果验证失败,则返回状态代码
401 Unauthorized
(即throw new WebApplicationException(Status.UNAUTHORIZED)
) - 如果凭据有效,只需返回请求即可将其委派给负责处理该请求的Jersey Resource
你可以在这篇博客文章中找到一个很好的例子。