0

我有几天关注一些问题,但我找不到解决方案。

我已经关注了这些问题:自定义 JAX-RS 授权 - 在每个请求中使用 JWT

使用 JAX-RS 和 Jersey 进行基于 REST 令牌的身份验证的最佳实践

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

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

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

我正在使用 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:对不起,如果我问错了问题,我是stackover的新手......对不起我的英语

4

2 回答 2

0

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

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

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

如果您对如何配置过滤器有疑问,我建议您在 SO 中发布一个特定问题

于 2016-07-28T07:57:38.827 回答
0

我是有关 JAX-RS 中基于令牌的身份验证的答案的作者。这种身份验证方法可以概括为以下步骤:

用硬凭证交换令牌

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

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

验证令牌

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

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

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

于 2016-07-28T08:26:17.477 回答