一、JWT生成Token
JSON Web Token (JWT)是一种基于JSON的开放标准,用于在网络上传输声明的方案。JWT由三部分组成:Header(头部)、Payload(负载)和Signature(签名)。
1、JWT Header
JWT头部通常由两部分信息组成:声明类型和声明加密算法。常用的加密算法有HMAC SHA256和RSA。
{ "alg": "HS256", "typ": "JWT" }
2、JWT Payload
Payload包含声明,声明是关于实体(通常是用户)和其他数据的声明信息。JWT的标准定义中包含了一些默认的声明,也可以定义自己的声明。
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
3、JWT Signature
使用HS256算法,将Header和Payload进行Base64Url编码后再用“.”连接起来,再用Key进行SHA256加盐,就生成了签名。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
二、公众号Token生成
公众号Token是指公众号接口调用时的访问令牌,是一种JSON格式的数据结构。生成公众号Token需要按照以下步骤进行。
1、获取access_token
调用获取access_token接口,将appid和appsecret作为参数,获取到访问令牌access_token。
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
2、获取jsapi_ticket
调用获取jsapi_ticket接口,将access_token作为参数,获取到用于生成JS-SDK权限验证的jsapi_ticket。
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
3、生成signature
根据公众号的配置信息以及当前页面的url,生成signature。
signature = sha1(string1).hexdigest() string1 = "jsapi_ticket=JSAPI_TICKET&noncestr=NONCESTR×tamp=TIMESTAMP&url=URL"
三、Token生成方式
Token的生成方式有多种,以下列举几个常见的方式。
1、UUID
使用Java自带的UUID类生成Token。
String token = UUID.randomUUID().toString().replace("-", "");
2、SecureRandom
使用Java自带的SecureRandom类生成Token。
SecureRandom random = new SecureRandom(); byte bytes[] = new byte[20]; random.nextBytes(bytes); String token = bytes.toString();
3、JWT
使用JWT标准生成Token。
// 生成头部 Mapheader = new HashMap<>(); header.put("alg", "HS256"); header.put("typ", "JWT"); // 生成载荷 Map claims = new HashMap<>(); claims.put("sub", "1234567890"); claims.put("name", "John Doe"); claims.put("iat", 1516239022); // 生成签名 byte[] secretBytes = DatatypeConverter.parseBase64Binary("your-256-bit-secret"); Key signingKey = new SecretKeySpec(secretBytes, SignatureAlgorithm.HS256.getJcaName()); String token = Jwts.builder() .setHeader(header) .setClaims(claims) .signWith(signingKey) .compact();
四、Token生成过程
Token的生成流程大致分为以下几步。
1、生成Payload
根据需要的信息,生成Payload。
2、生成Header
根据加密算法的要求和自己的需求,生成Header。
3、生成Signature
根据加密算法的要求,将Header和Payload连接起来,再进行加密,生成Signature。
4、将Header、Payload和Signature连接起来,生成Token
String token = base64UrlEncode(header) + "." + base64UrlEncode(payload) + "." + signature;
五、Token是谁生成的
Token可以由应用程序或者后端服务器生成,也可以由第三方授权平台生成,例如OAuth或者OpenID Connect。
1、应用程序/后端服务器生成Token
应用程序或者后端服务器可以自行生成Token,也可以使用JWT等标准生成库生成Token,例如Java的jjwt。
2、第三方授权平台生成Token
第三方授权平台如OAuth或者OpenID Connect可以生成Token,供应用程序使用。在OAuth流程中,access_token即为Token。