我在几个问题后有几天但我找不到解决方案。
我已经关注了这些问题:Custom JAX-RS authorization - using JWT in each request和
Best practice for REST token-based authentication with JAX-RS and Jersey
但我不明白如何使用过滤器。
我需要为Android应用程序创建令牌使用我的Web服务的资源。
我不能只创建一个令牌并发送它吗?
我正在使用jjwt https://github.com/jwtk/jjwt,但我认为这是一段代码:
@POST
@Produces("application/json")
@Consumes("application/x-www-form-urlencoded")
public Response authenticateUser(@FormParam("username") String username,
@FormParam("password") String password) {
try {
// Authenticate the user using the credentials provided
// authenticate(username, password);
// Issue a token for the user
String compactJws = Jwts.builder().setSubject(username).signWith(SignatureAlgorithm.HS512, "pepe").compact();
// Return the token on the response
return Response.ok(compactJws).build();
} catch (Exception e) {
return Response.status(Response.Status.UNAUTHORIZED).build();
}
}
如果有人可以帮助我,谢谢...
Si alguno me puede responder en castellano,mejor。
PD:对不起,如果我提出错误的问题,我会在堆叠中重新开始......对不起我的英文答案 0 :(得分:0)
您提供的代码对于Web应用程序的新令牌(使用application/x-www-form-urlencoded
)有效,但对于Android应用程序可能更适合将凭据作为json POST或Authorization标头发送
在此之后,客户端应用程序接收令牌,存储它并需要在每个服务器请求中包含JWT。您可以在标头或请求参数中包含令牌。服务器必须验证令牌签名以及其他字段,如sub
(userId)和exp
(到期时间)。
使用过滤器(如示例中提供的AuthenticationFilter
)可简化身份验证过程。它可以拦截所有请求并在唯一的点上执行验证。如果没有,则必须在业务逻辑的每种方法中验证JWT
如果您对如何配置过滤器有疑问,我建议在SO中发布特定问题
答案 1 :(得分:0)
我是answer about token-based authentication in JAX-RS的作者。此身份验证方法可以通过以下步骤进行总结:
不需要过滤器。您应该有一个端点(JAX-RS资源方法)来使用硬凭证(如用户名和密码)执行身份验证。如果凭据有效,则端点将发出将在响应有效负载中发送到客户端的令牌。客户端必须在每个请求的Authorization
标头中发送此令牌。
颁发令牌的端点不得受到保护,也就是说,访问它所必需的身份验证不是必需的。一旦您将Android应用程序作为客户端,我认为您会发现更好的消费application/json
而不是application/x-www-form-urlencoded
。我的answer提供了有关如何操作的详细信息。
此处验证过滤器发挥作用。使用过滤器验证令牌时,您可以保持端点的精益和业务重点。
过滤器背后的想法是拦截对受保护资源的请求,从Authorization
标头中提取令牌并对其进行验证。如果令牌有效,请求将前进到请求的端点。如果令牌无效,请求将被中止。
除了身份验证过滤器之外,您还可以使用其他过滤器来执行授权。在身份验证过滤器中,您必须检查令牌是否有效,然后找到您为其颁发令牌的用户。在授权过滤器中,您必须确保用户具有足够的权限来访问所请求的资源。可以根据您的需要创建其他过滤器。