一、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。
// 生成頭部 Map header = 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。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/241308.html