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/json
比 application/x-www-form-urlencoded
更好。我的 answer 提供了有关如何操作的详细信息。
正在验证令牌
身份验证过滤器在这里发挥作用。使用过滤器验证令牌时,您可以保持端点精简并专注于业务。
过滤器背后的想法是 拦截 对受保护资源的请求,从 Authorization
header 中提取令牌并验证它。如果令牌有效,请求将继续到请求的端点。如果令牌无效,请求将被中止。
除了认证过滤器,您还可以有其他过滤器来执行授权,例如。在 身份验证过滤器 中,您必须检查令牌是否有效,然后找到您为其颁发令牌的用户。在授权过滤器中,您必须确保用户有足够的权限访问所请求的资源。可以根据您的需要创建其他过滤器。
我花了几天时间解决了一些问题,但找不到解决方案。
我关注了这些问题:
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/json
比 application/x-www-form-urlencoded
更好。我的 answer 提供了有关如何操作的详细信息。
正在验证令牌
身份验证过滤器在这里发挥作用。使用过滤器验证令牌时,您可以保持端点精简并专注于业务。
过滤器背后的想法是 拦截 对受保护资源的请求,从 Authorization
header 中提取令牌并验证它。如果令牌有效,请求将继续到请求的端点。如果令牌无效,请求将被中止。
除了认证过滤器,您还可以有其他过滤器来执行授权,例如。在 身份验证过滤器 中,您必须检查令牌是否有效,然后找到您为其颁发令牌的用户。在授权过滤器中,您必须确保用户有足够的权限访问所请求的资源。可以根据您的需要创建其他过滤器。