我有几天时间在几个问题之后,但我找不到解决办法。
我跟踪了这些问题: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();
}
}如果有人能帮我,谢谢..。
我是卡斯特拉诺的接待员。
抱歉,如果我问错了,我是新来的.为我的英语道歉
发布于 2016-07-28 08:26:17
我是answer about token-based authentication in JAX-RS的作者。此身份验证方法可归纳为以下步骤:
用硬凭据交换令牌
这样做不需要过滤器。您应该有一个端点(JAX资源方法)来使用硬凭据(比如用户名和密码)来执行身份验证。如果凭据有效,端点将发出一个令牌,该令牌将发送到响应有效负载中的客户端。客户端必须在每个请求的Authorization头中发送此令牌。
发出令牌的端点必须不受保护,也就是说,访问令牌所需的身份验证必须不受保护。一旦您将Android应用程序作为客户端,我认为您将发现更好地使用application/json而不是application/x-www-form-urlencoded。我的answer提供了如何做到这一点的详细信息。
验证令牌
在这里,身份验证过滤器起作用。当使用过滤器验证令牌时,您可以保持端点的简洁性和业务重点。
过滤器背后的思想是拦截对受保护资源的请求,从Authorization头中提取令牌并验证它。如果令牌有效,则请求将继续到请求的端点。如果令牌无效,请求将被中止。
除了身份验证筛选器之外,您还可以使用其他过滤器来执行授权,例如。在身份验证筛选器中,必须检查令牌是否有效,然后查找发出令牌的用户。在授权筛选器中,必须确保用户有足够的权限访问所请求的资源。其他过滤器可以根据您的需要创建。
发布于 2016-07-28 07:57:38
您所提供的代码对于为web应用程序发出新令牌(使用application/x-www-form-urlencoded)是有效的,但对于安卓应用程序来说,可能更适合将凭据作为json或在授权头中发送。
在此之后,客户端应用程序接收令牌,存储它,并需要在对服务器的每个请求中包含JWT。您可以将令牌包含在标头或请求参数中。服务器必须验证令牌签名以及其他字段,如sub ( userId)和exp (过期时间)。
使用过滤器(如示例中提供的AuthenticationFilter )可以简化身份验证过程。它可以拦截所有请求并在唯一点执行验证。如果没有,则必须在业务逻辑的每个方法中验证JWT。
如果您对如何配置过滤器有疑问,我建议您提交一个特定的问题。
https://stackoverflow.com/questions/38623132
复制相似问题