Pea*_*Gen 8 java rest jersey jwt auth0
我有一个Android应用程序.它与一个REST API开发的连接Jersey.我的REST端点由令牌保护.以下是我如何生成它们.
Algorithm algorithm = Algorithm.HMAC256(secret);
String token = JWT.create()
.withClaim("userName","myusername)
.withExpiresAt(expirationDate)
.sign(algorithm);
Run Code Online (Sandbox Code Playgroud)
以下是我验证令牌的方法
public boolean validateTokenHMAC256(String token, String secret) throws UnsupportedEncodingException, JWTVerificationException
{
Algorithm algorithm = Algorithm.HMAC256(secret);
JWTVerifier verifier = JWT.require(algorithm)
.build(); //Reusable verifier instance
DecodedJWT jwt = verifier.verify(token);
Claim usernameClaim = jwt.getClaim("username");
String username = usernameClaim.asString();
System.out.println(username);
return true;
}
Run Code Online (Sandbox Code Playgroud)
在我的REST API中,我有一个过滤器,该过滤器检查每个请求以查看令牌是否原样.下面是代码.
@Secured
@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter{
//private static String authorizationSecret = "ZXW24xGr9Dqf9sq5Dp8ZAn5nSnuZwux2QxdvcH3wQGqYteJ5yMTw5T8DBUJPbySR";
public AuthenticationFilter()
{
System.out.println("test printing");
}
@Override
public void filter(ContainerRequestContext crc) throws IOException
{
String headerString = crc.getHeaderString("Bearer");
System.out.println("bluh: "+headerString);
System.out.println("test printing");
try
{
boolean validateToken = validateToken(headerString, AuthKey.authorizationSecret);
System.out.println("valid");
}
catch(Exception e)
{
System.out.println("invalid");
crc.abortWith(
Response.status(Response.Status.UNAUTHORIZED).build());
}
}
private boolean validateToken(String strToken, String secret) throws UnsupportedEncodingException, JWTVerificationException
{
Token token = new Token();
return token.validateTokenHMAC256(strToken,secret);
}
}
Run Code Online (Sandbox Code Playgroud)
当用户登录应用程序时,将调用上面的代码.但是令牌将在60分钟后过期.我知道在令牌过期后,我必须让用户返回登录屏幕或刷新令牌.我在这里和这里经历了建议
但我不明白以下几点.
如何判断令牌是否必须续订?我认为我应该在它过期后这样做,但似乎并非如此.如果我要求它刷新,now<exp它将在每个请求中刷新.
如何将此令牌分配并发送回用户?目前,当用户登录时,他将获得令牌并将其保存在变量中.为了使刷新的令牌工作,我是否必须login再次调用该方法(因此令牌将被发送给用户)或JWT它自己将处理案例?
我如何使用java-jwt实际引用?
- 如何判断令牌是否必须续订?我认为我应该在它过期后这样做,但似乎并非如此.如果我现在要求它刷新
您需要在令牌过期之前刷新令牌.决定你的政策:
在每个请求中发出一个新令牌
当前的令牌即将到期时发出新令牌.例如10分钟
让客户端应用程序在需要时使用api的"刷新服务"请求新令牌.例如
@GET
@Path("/jwt/refresh")
@Produces(MediaType.TEXT_HTML)
public String refresh(){
//Build a returns a fresh JWT to client
}
Run Code Online (Sandbox Code Playgroud)
- 如何将此令牌分配并发送回用户?
如果在请求期间发出新令牌,则可以将其返回到客户端在处理响应期间将读取的特殊标头中.如果您发布如上所述的"刷新"服务,那么当前JWT即将到期时,客户端将独立调用它
重定向到登录方法不是一个好的选择,因为您将丢失当前请求
- 我如何使用java-jwt实际刷新
只需发出一个新令牌
| 归档时间: |
|
| 查看次数: |
8260 次 |
| 最近记录: |