当前位置: 首页 > 知识库问答 >
问题:

在JAX-RS中使用API密钥进行身份验证

夏弘文
2023-03-14
  1. 面向公共的服务需要api密钥。
  2. “专用”服务只能接受来自群集内部的呼叫,而不能接受外部世界的呼叫。
  3. 每个api都标识一个用户,并且用户对象必须可用于rest服务。

在一个JAX-RS应用程序中有什么标准的方法可以做到这一点吗?(我们用的是resteasy。)

我读过关于过滤器、拦截器和基本身份验证的所有内容,但我不清楚什么是最好的方法。

共有1个答案

宋斌
2023-03-14

这种身份验证可以通过ContainerRequestFilter来实现,拦截对资源方法的请求。

过滤器将用于从请求中提取API键并验证它。如果API密钥无效,请求将被拒绝。否则,请求将继续到资源方法。

请看下面的代码。ContainerRequestContextAPI可用于从HTTP请求中提取信息:

@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {

        // Extract and validate the API key from the request
        String apiKey = requestContext.getHeaderString("API-Key");
        ...
    }
}

在身份验证过程中,您必须能够识别正在执行请求的用户。要将此信息传播到资源类/方法,您可以:

  1. 重写SecurityContext并将其注入资源类/方法。
  2. 使用CDI事件和生产者方法创建一个对象,该对象包含可以注入资源类/方法中的用户标识符。

有关这些方法的更多细节,请参阅我上面提到的答案。

 类似资料:
  • 为了测试,我尝试下面的代码过滤包含用户的url参数,但是它没有在未经授权的情况下中止请求。最重要的是,我需要以这样的方式来实现它,即只有更新和删除需要用各自的用户名和密码来授权。其他我只是不想过滤的东西。我有一个user类,它具有username和password(加密)属性。因此,如果url包含Users/{userID}的PUT或delete方法,我希望它使用特定用户的用户名和密码进行验证。我

  • 如何用Apache CXF实现这一点?

  • 问题内容: 我正在用TastyPie制作内部API。我有 禁用身份验证规则后,我的API效果很好。启用它后,无论尝试如何,都会收到401(未经授权)的响应。 我敢肯定,一旦你看到它的实际作用,这就是其中的一件事,但与此同时,请告知如何提出请求(GET)。 问题答案: 将用户名和api_key参数添加到你的GET变量中。确保你拥有 设置时,请确保遵循docs的其他说明: ApiKey身份验证 作为要

  • 我正在开发REST webService,我的一些客户机将使用我的webservices,所以为了识别真正的客户机,我决定给每个真正的客户机一个唯一的应用程序令牌。客户机将对这个令牌进行编码,他们将把这个令牌放在请求头中,我已经在我的REST webservices中配置了一个REST过滤器来验证令牌。我不想使用https。我的问题是,任何人都可以从我的客户端站点获取该令牌,并可以使用我的REST

  • 我正在使用生成用户密码的强哈希值。我想登录用户,但不想通过网络以明文形式发送密码,如何检查密码是否正确(没有往返),因为它是加盐的? 我有一个客户端/服务器场景。客户端是台式计算机上的应用程序(不是网站,也不是超文本传输协议服务器)。 我怎样才能做到这一点?我只是走了这么远:我正在客户端上生成salt散列,从中形成一个mcf并将其发送到我的服务器。将mcf保存到数据库。我没有发送密码,只发送了实际

  • 我正在尝试使用私钥和公钥对为sftp服务器设置身份验证。 我已经在本地计算机上设置了带有Bitvise SSH服务器的sftp服务器。我用SSH服务器生成了私钥和公钥。我已经在SSH服务器的主机密钥部分上设置了私钥,并且已经创建了一个虚拟帐户并将公钥设置到该帐户。 谢谢