详解JWT token心得与使用实例
本文你能学到什么?
token的组成
token串的生成流程。
token在客户端与服务器端的交互流程
Token的优点和思考
参考代码核心代码使用参考,不是全部代码
JWT token的组成
头部(Header),格式如下
{ “typ”: “JWT”, “alg”: “HS256” }
由上可知,该token使用HS256加密算法,将头部使用Base64编码可得到如下个格式的字符串
eyJhbGciOiJIUzI1NiJ9
有效载荷(Playload)
{ “iss”: “Online JWT Builder”, “iat”: 1416797419, “exp”: 1448333419, ……. “userid”:10001 }
有效载荷中存放了token的签发者(iss)、签发时间(iat)、过期时间(exp)等以及一些我们需要写进token中的信息。有效载荷也使用Base64编码得到如下格式的字符串
eyJ1c2VyaWQiOjB9
签名(Signature)
将Header和Playload拼接生成一个字符串str=“eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOjB9”,使用HS256算法和我们提供的密钥(secret,服务器自己提供的一个字符串)对str进行加密生成最终的JWT,即我们需要的令牌(token),形如str.”签名字符串”。
token在服务与客户端的交互流程
1客户端通过用户名和密码登录
2服务器验证用户名和密码,若通过,生成token返回给客户端。
3客户端收到token后以后每次请求的时候都带上这个token,相当于一个令牌,表示我有权限访问了
4服务器接收(通常在拦截器中实现)到该token,然后验证该token的合法性(为什么能验证狼蚁网站SEO优化说)。若该token合法,则通过请求,若token不合法或者过期,返回请求失败。
关于Token的思考
服务如何判断这个token是否合法?
由上面token的生成可知,token中的签名是由Header和有效载荷通过Base64编码生成再通过加密算法HS256和密钥最终生成签名,这个签名位于JWT的尾部,在服务器端同样对返回过来的JWT的前部分再进行一次签名生成,然后比较这次生成的签名与请求的JWT中的签名是否一致,若一致说明token合法。由于生成签名的密钥是服务器才知道的,所以别人难以伪造。
token中能放敏感信息吗?
不能,因为有效载荷是经过Base64编码生成的,并不是加密。所以不能存放敏感信息。
Token的优点
(1)相比于session,它无需保存在服务器,不占用服务器内存开销。
(2)无状态、可拓展性强比如有3台机器(A、B、C)组成服务器集群,若session存在机器A上,session只能保存在其中一台服务器,此时你便不能访问机器B、C,因为B、C上没有存放该Session,而使用token就能够验证用户请求合法性,并且我再加几台机器也没事,所以可拓展性好就是这个意思。
(3)由(2)知,这样做可就支持了跨域访问。
Java实例:JWT token使用
部分代码来自互联网,找不到原作者了。。
编写JWT(Java Web Token)操作类:JavaWebToken
public class JavaWebToken { private static Logger log = LoggerFactory.getLogger(JavaWebToken.class); //该方法使用HS256算法和Secret:bankgl生成signKey private static Key getKeyInstance() { //We will sign our JavaWebToken with our ApiKey secret SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("bankgl"); Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); return signingKey; } //使用HS256签名算法和生成的signingKey最终的Token,claims中是有效载荷 public static String createJavaWebToken(Map<String, Object> claims) { return Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, getKeyInstance()).pact(); } //解析Token,也能验证Token,当验证失败返回null public static Map<String, Object> parserJavaWebToken(String jwt) { try { Map<String, Object> jwtClaims = Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(jwt).getBody(); return jwtClaims; } catch (Exception e) { log.error("json web token verify failed"); return null; } } }
编写登录Conreoller,在服务器端给客户返回token.
public LoginStatusMessage checkUserAndPassword( @RequestParam(value="username",required=true) String username, @RequestParam(value="password",required=true) String password,User user,HttpServletRequest request) throws Exception{ User u = new User(); //登录成功 if((u = userService.checkUsernameAndPassword(user)) != null){ Map<String,Object> m = new HashMap<String,Object>(); m.put("userid", user.getUserid()); String token = JavaWebToken.createJavaWebToken(m); System.out.println(token); LoginStatusMessage lsm = new LoginStatusMessage(); lsm.setUser(u); lsm.setToken(token); return lsm; }; //登录失败,返回Null return null; }
在拦截器中对请求中的Token验证(部分代码,表示下意思)
String token = request.getParameter("token"); if(JavaWebToken.parserJavaWebToken(token) != null){ //表示token合法 return true; }else{ //token不合法或者过期 return false; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。
编程语言
- 宿迁百度关键词排名指南:实现精准营销的关键
- 四川SEO优化怎么做网络推广
- 立昂技术备案老域名收购:如何为您的业务赋能
- 安徽百度关键词seo贵不贵,一般需要多少钱
- 吉林百度快照排名怎么做电话营销
- 多伦新手做SEO怎么做
- 甘肃优化关键词排名推广怎么做论坛营销
- 沙雅SEO网站推广:提升您的在线可见性
- 四川SEO优化如何提升销售额和销售量
- 聂荣网站排名优化:提升网站可见性的全方位指
- 涞水SEO:提升地方企业在线可见性的策略
- 辽宁百度seo排名怎样做网站排名
- 临湘哪有关键词排名优化:提升网站可见度的关
- 黑龙江百度网站优化有没有优惠
- 凉城优化关键词排名推广:提升您的网络可见性
- 萝北整站优化:提升您网站流量和排名的全面指