我正在尝试进行基于JWT的身份验证过程.
/users/loginAuthorization: Bearer ${jwt}标头的请求/users/profilejwt签名有效,则返回用户信息,否则回复Unauthorized现在,我才意识到; 这怎么样安全?任何用户都不能简单地从浏览器中读取cookie并将curl请求发送到/users/profile它并且它是否有效?
我真的还是个新手,你能解释一下吗?这是一些简单的测试代码
@Path("users")
public class UserResources {
@Path("login")
@POST
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response loginUser(UserInput userInput) {
String compactJws = Jwts.builder().setSubject(userInput.getUsername()).claim("name", userInput.getName())
.signWith(SignatureAlgorithm.HS256, Server.SECRECT_KEY).compact();
return Response.status(Status.OK).cookie(new NewCookie("jwt", compactJws)).entity(compactJws).build();
}
@Path("profile")
@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response getUser(@HeaderParam("Authorization") String compactJws) {
try {
if (compactJws == null || compactJws.trim().isEmpty() || !compactJws.startsWith("Bearer ")) {
throw new SignatureException("Invalid access token");
}
Jws<Claims> claims = Jwts.parser().setSigningKey(Server.SECRECT_KEY)
.parseClaimsJws(compactJws.substring("Bearer ".length()));
return Response.ok(new String("Subject: " + claims.getBody().getSubject() + "\nName: " + claims.getBody().get("name"))).build();
} catch (SignatureException e) {
return Response.status(Status.UNAUTHORIZED).entity(e.getMessage()).build();
}
}
}
Run Code Online (Sandbox Code Playgroud)
验证签名可确保JWT未被伪造或篡改.正如你猜测的那样,JWT仍然可以被盗.如果有人窃取了令牌,他们可以冒充您的用户并提出请求.
有三件重要的事情要做:
使用HTTPS - 端到端TLS可防止有人拦截或嗅探线路上的请求并窃取令牌.
在客户端上安全地存储令牌 - 如果您将令牌存储在cookie中,请确保使用HttpOnly标志以防止通过XSS被盗,并在所有表单上使用CSRF保护.有关更深入的说明,请参阅Cookie与HTML5 Web存储.
使令牌过期 - 如果所有其他方法都失败,并且令牌确实被盗,则合理的到期(exp声明)将确保令牌可用于造成损害的时间窗口有限.
| 归档时间: |
|
| 查看次数: |
956 次 |
| 最近记录: |