概要
Token是干什么
Token是怎么做的?
Token长什么样子呢?
Token怎么使用呢?
Token是干什么
- 简称 JWT,在HTTP通信过程中,进行身份认证。
Token是怎么做的?
- 客户端通过用户名和密码登录服务器;
- 服务端对客户端身份进行验证;
- 服务端对该用户生成Token,返回给客户端;
- 客户端将Token保存到本地浏览器
- 客户端发起请求,需要携带该Token;
- 服务端收到请求后,首先验证Token,之后返回数据。
注意: 服务端不需要保存Token,只需要对Token中携带的信息进行验证即可;无论客户端访问后台的那台服务器,只要可以通过用户信息的验证即可。
Token长什么样子呢?
通过名字就可以看出来,是一个 json。
由三部分内容组成:
- 头(header),一般很少改动直接使用默认的即可:
1 2 3 4
| { 'typ':'JWT', 'alg':'HS256' }
|
Token怎么使用呢?
利用Java封装的JJWT实现,下载jar地址为:http://maven.outofmemory.cn/io.jsonwebtoken/jjwt/0.6.0/
还需要依赖包 jackson-annotations-2.5.0.jar、jackson-core-2.5.0.jar、jackson-databind-2.5.0.jar,地址:http://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core/2.5.0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| import java.security.Key; import java.util.Date; import java.util.HashMap; import java.util.Map;
import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter;
import io.jsonwebtoken.Claims; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.InvalidClaimException; import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm;
public class JwtManager {
public static String createToken() { SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
byte[] secretBytes = DatatypeConverter.parseBase64Binary("JWT-TOKEN"); Key signingKey = new SecretKeySpec(secretBytes, signatureAlgorithm.getJcaName()); Map<String, Object> claims = new HashMap<String, Object>(); claims.put("username", "token"); claims.put("role", "admin"); JwtBuilder builder = Jwts.builder().setClaims(claims) .setId("tokenid") .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis()+10*60*1000)) .signWith(signatureAlgorithm, signingKey);
return builder.compact(); }
public static Claims parseToken(String token) { return Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary("JWT-TOKEN")) .parseClaimsJws(token).getBody(); }
public static void validateToken(String token) { try{ Claims claims = parseToken(token); String username = claims.get("username").toString(); String role = claims.get("role").toString(); String tokenid = claims.getId(); System.out.println("[username]:"+username); System.out.println("[role]:"+role); System.out.println("[tokenid]:"+tokenid); } catch(ExpiredJwtException e) { System.out.println("token expired"); } catch (InvalidClaimException e) { System.out.println("token invalid"); } catch (Exception e) { System.out.println("token error"); } }
public static void main(String[] args) { validateToken(createToken()); }
}
|