因工做中須要用到登錄,此時就要用到token的分發與校驗,採用jwt來進行token的生成與校驗,下面把使用方法記下:前端
大體方案:java
利用jwt生成token,併發放給前端;後端
下一次前端請求後端url時帶上token,後端利用jwt相同的密鑰對token進行校驗,若是校驗成功,容許前端訪問後端api,返回200;api
若是校驗失敗,返回給前端401;併發
依賴:微服務
compile('com.auth0:java-jwt:3.4.0')
生成token:ui
public static String genToken(Map<String, String> claims, Date expireDatePoint){ try { //使用HMAC256進行加密 Algorithm algorithm = Algorithm.HMAC256(SECRET); //密鑰 //建立jwt JWTCreator.Builder builder = JWT.create() .withClaim("loginName", username) withExpiresAt(expireDatePoint); //過時時間點 //傳入參數 claims.forEach((key,value)-> { builder.withClaim(key, value); }); //簽名加密 return builder.sign(algorithm); } catch (IllegalArgumentException | UnsupportedEncodingException e) { throw new RuntimeException(e); } }
校驗token加密
public static Map<String,String> verifyToken(String token) throws RuntimeException{ Algorithm algorithm = null; try { //使用HMAC256進行加密 algorithm = Algorithm.HMAC256(SECRET); } catch (IllegalArgumentException | UnsupportedEncodingException e) { throw new RuntimeException(e); } //解密 JWTVerifier verifier = JWT.require(algorithm).withIssuer(ISSUER).build(); DecodedJWT jwt = verifier.verify(token); Map<String, Claim> map = jwt.getClaims(); Map<String, String> resultMap = new HashMap<>(); map.forEach((k,v) -> resultMap.put(k, v.asString())); return resultMap; }
校驗token,能夠用在微服務當中的api gateway服務,利用全局過濾器globalFilter,對全部api進行攔截,校驗token的合法性,選擇是否對其進行放行。url