JAX-RS 泽西岛 servlet JJWT

JAX-RS Jersey servlet JJWT

我花了几天时间解决了一些问题,但找不到解决方案。

我关注了这些问题:

Best practice for REST token-based authentication with JAX-RS and Jersey

但我不明白如何使用过滤器。

我需要为 android 应用程序创建一个令牌使用我的网络服务的资源。

我不能只创建一个令牌并发送它吗?

我用的是jjwthttps://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:如果我问错了问题,我很抱歉,我是 stackover 的新手...对不起我的英语

您提供的代码对于为 Web 应用程序(使用 application/x-www-form-urlencoded)颁发新令牌有效,但对于 android 应用程序,可能更合适将凭据作为 json POST 或授权 header

在此之后,客户端应用程序接收令牌,将其存储并需要在对服务器的每个请求中包含 JWT。您可以在 headers 或请求参数中包含令牌。服务器必须验证令牌签名,以及其他字段,如 sub(用户 ID)和 exp(过期时间)。

使用过滤器,例如示例中提供的 AuthenticationFilter,可以简化身份验证过程。它可以拦截所有请求并在唯一点执行验证。否则,您必须在业务逻辑的每个方法中验证 JWT

如果您对如何配置过滤器有疑问,我建议 post 在 SO 中提出一个具体问题

我是 answer about token-based authentication in JAX-RS 的作者。这种身份验证方法可以概括为以下步骤:

为令牌交换硬凭证

无需过滤器即可。您应该有一个端点(JAX-RS 资源方法)来使用 硬凭证 (如用户名和密码)执行身份验证。如果凭据有效,端点将发出一个令牌,该令牌将在响应负载中发送给客户端。客户端必须在每个请求的 Authorization header 中发送此令牌。

颁发令牌的端点不得受到保护,也就是说,访问它不需要任何身份验证。一旦你有一个 Android 应用程序作为客户端,我想你会发现使用 application/jsonapplication/x-www-form-urlencoded 更好。我的 answer 提供了有关如何操作的详细信息。

正在验证令牌

身份验证过滤器在这里发挥作用。使用过滤器验证令牌时,您可以保持端点精简并专注于业务。

过滤器背后的想法是 拦截 对受保护资源的请求,从 Authorization header 中提取令牌并验证它。如果令牌有效,请求将继续到请求的端点。如果令牌无效,请求将被中止。

除了认证过滤器,您还可以有其他过滤器来执行授权,例如。在 身份验证过滤器 中,您必须检查令牌是否有效,然后找到您为其颁发令牌的用户。在授权过滤器中,您必须确保用户有足够的权限访问所请求的资源。可以根据您的需要创建其他过滤器。