From 4e796a114106ea4675d76543075de24263efc37a Mon Sep 17 00:00:00 2001 From: Fancy <Fancy.fx@outlook.com> Date: 星期四, 26 十二月 2024 14:23:52 +0800 Subject: [PATCH] edit mp login --- pms-parent/pms-web-wechat/pom.xml | 5 + pms-parent/pms-web-wechat/src/main/resources/application.yml | 5 + pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/AuthController.java | 2 pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/WeChatService.java | 26 +++++--- pms-parent/pom.xml | 11 +++ pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/util/JwtUtil.java | 96 ++++++++++++++++++++------------ 6 files changed, 97 insertions(+), 48 deletions(-) diff --git a/pms-parent/pms-web-wechat/pom.xml b/pms-parent/pms-web-wechat/pom.xml index 28d1b52..fcd1a22 100644 --- a/pms-parent/pms-web-wechat/pom.xml +++ b/pms-parent/pms-web-wechat/pom.xml @@ -201,6 +201,11 @@ <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt</artifactId> + <version>${jjwt.version}</version> + </dependency> </dependencies> <build> diff --git a/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/AuthController.java b/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/AuthController.java index 8bb9448..c6da1dd 100644 --- a/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/AuthController.java +++ b/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/AuthController.java @@ -21,7 +21,7 @@ public BaseResponse<Boolean> login(@RequestBody QueryVo vo) { try { JSONObject wxResponse = weChatService.login(vo.code); - if (wxResponse.containsKey("openid")) { + if (wxResponse.containsKey("token")) { // 鎴愬姛鑾峰彇鍒颁簡鐢ㄦ埛鐨刼penid,session_key鍜屽叾浠栦俊鎭� // 杩欓噷鍙互杩涜鏇村涓氬姟閫昏緫鎿嶄綔锛屼緥濡傜敓鎴愯嚜瀹氫箟token杩斿洖缁欏鎴风 return BaseResponseUtils.buildSuccess(wxResponse); diff --git a/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/WeChatService.java b/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/WeChatService.java index f912145..983e4d9 100644 --- a/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/WeChatService.java +++ b/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/login/WeChatService.java @@ -3,12 +3,14 @@ import com.alibaba.fastjson2.JSONObject; import com.dy.pmsGlobal.daoMp.MpOpenIdMapper; import com.dy.pmsGlobal.pojoMp.MpOpenId; +import com.dy.pmsWechat.util.JwtUtil; import com.dy.pmsWechat.util.RestTemplateUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.IOException; +import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -23,6 +25,12 @@ @Value("${wechat.loginUrl}") private String loginUrl; + + @Value("${wechat.jwt.secret-key}") + private String secretKey; + + @Value("${wechat.jwt.ttl}") + private long ttlMillis; private final RestTemplateUtil restTemplateUtil; private MpOpenIdMapper mpOpenIdDao; @@ -44,21 +52,21 @@ queryParams.put("grant_type", "authorization_code"); Map<String, String> headerParams = new HashMap<>(); JSONObject wxMpUser = restTemplateUtil.get(loginUrl, queryParams, headerParams); + String openId = wxMpUser.get("openid").toString(); //鑾峰彇寰俊淇℃伅娣诲姞鍒版暟鎹簱 //鍏堟牴鎹畂penid鏌ヨ鐢ㄦ埛淇℃伅 - MpOpenId userInfo = mpOpenIdDao.getInfoByOpenId(wxMpUser.get("openid").toString()); + MpOpenId userInfo = mpOpenIdDao.getInfoByOpenId(openId); if(userInfo == null){ //鏁版嵁搴撴病鏈夋椂娣诲姞鍒版暟鎹簱涓� userInfo = new MpOpenId(); - userInfo.setOpenId(wxMpUser.get("openid").toString()); + userInfo.setOpenId(openId); + userInfo.setCreateTime(new Date()); mpOpenIdDao.insert(userInfo); } //鎺堟潈瀹屾垚涔嬪悗锛岃烦杞埌鍏蜂綋鐨勫姛鑳介〉闈� //鐢熸垚token,鎸夌収涓�瀹氳鍒欑敓鎴愬瓧绗︿覆锛屽彲浠ュ寘鍚敤鎴蜂俊鎭� - String token= JwtHelper.createToken(userInfo.getId(),userInfo.getNickName()); - //localhost:8080/weixin?a=1&token=222 - if(returnUrl.indexOf("?")==-1){//鑻eturnUrl涓病鏈夊弬鏁� - return "redirect:"+returnUrl+"?token="+token; - }else{ - return "redirect:"+returnUrl+"&token="+token; - } + //鐧婚檰controller涓敓鎴愶紝杩斿洖缁欏鎴风 + Map<String, Object> claims = new HashMap<>(); + claims.put("openId",openId); + String token = JwtUtil.createJwt(secretKey,ttlMillis,claims); + return new JSONObject().fluentPut("token",token); } } \ No newline at end of file diff --git a/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/util/JwtUtil.java b/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/util/JwtUtil.java index 9d74256..b12f734 100644 --- a/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/util/JwtUtil.java +++ b/pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/util/JwtUtil.java @@ -1,46 +1,70 @@ package com.dy.pmsWechat.util; -import cn.hutool.jwt.Claims; -import com.alibaba.druid.util.StringUtils; +import io.jsonwebtoken.*; +import io.jsonwebtoken.security.Keys; + +import javax.crypto.SecretKey; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.Map; + public class JwtUtil { - //token瀛楃涓叉湁鏁堟椂闂� - private static long tokenExpiration = 24*60*60*1000; - //鍔犲瘑缂栫爜绉橀挜 - private static String tokenSignKey = "123456"; - //鏍规嵁userid 鍜� username 鐢熸垚token瀛楃涓� - public static String createToken(Long userId, String userName) { - String token = Jwts.builder() - //璁剧疆token鍒嗙被 - .setSubject("GGKT-USER") - //token瀛楃涓叉湁鏁堟椂闀� - .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration)) - //绉佹湁閮ㄥ垎锛堢敤鎴蜂俊鎭級 - .claim("userId", userId) - .claim("userName", userName) - //鏍规嵁绉橀挜浣跨敤鍔犲瘑缂栫爜鏂瑰紡杩涜鍔犲瘑锛屽瀛楃涓插帇缂� - .signWith(SignatureAlgorithm.HS512, tokenSignKey) - .compressWith(CompressionCodecs.GZIP) - .compact(); - return token; + /** + * 鐢熸垚jwt + * 浣跨敤Hs256绠楁硶, 绉佸寵浣跨敤鍥哄畾绉橀挜 + * + * @param secretKey jwt绉橀挜 + * @param ttlMillis jwt杩囨湡鏃堕棿(姣) + * @param claims 璁剧疆鐨勪俊鎭� + * @return + */ + public static String createJwt(String secretKey, long ttlMillis, Map<String, Object> claims) { + // 鎸囧畾绛惧悕鐨勬椂鍊欎娇鐢ㄧ殑绛惧悕绠楁硶锛屼篃灏辨槸header閭i儴鍒� + // SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; + + // 鐢熸垚JWT鐨勬椂闂� + long expMillis = System.currentTimeMillis() + ttlMillis; + Date exp = new Date(expMillis); + + //鐢熸垚 HMAC 瀵嗛挜锛屾牴鎹彁渚涚殑瀛楄妭鏁扮粍闀垮害閫夋嫨閫傚綋鐨� HMAC 绠楁硶锛屽苟杩斿洖鐩稿簲鐨� SecretKey 瀵硅薄銆� + SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8)); + + // 璁剧疆jwt鐨刡ody + JwtBuilder builder = Jwts.builder() + // 璁剧疆绛惧悕浣跨敤鐨勭鍚嶇畻娉曞拰绛惧悕浣跨敤鐨勭閽� + .signWith(key) + // 濡傛灉鏈夌鏈夊0鏄庯紝涓�瀹氳鍏堣缃繖涓嚜宸卞垱寤虹殑绉佹湁鐨勫0鏄庯紝杩欎釜鏄粰builder鐨刢laim璧嬪�硷紝涓�鏃﹀啓鍦ㄦ爣鍑嗙殑澹版槑璧嬪�间箣鍚庯紝灏辨槸瑕嗙洊浜嗛偅浜涙爣鍑嗙殑澹版槑鐨� + .claims(claims) + // 璁剧疆杩囨湡鏃堕棿 + .expiration(exp); + return builder.compact(); } - //浠巘oken瀛楃涓茶幏鍙杣serid - public static Long getUserId(String token) { - if(StringUtils.isEmpty(token)) return null; - Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); - Claims claims = claimsJws.getBody(); - Integer userId = (Integer)claims.get("userId"); - return userId.longValue(); - } + /** + * Token瑙e瘑 + * + * @param secretKey jwt绉橀挜 姝ょ閽ヤ竴瀹氳淇濈暀濂藉湪鏈嶅姟绔�, 涓嶈兘鏆撮湶鍑哄幓, 鍚﹀垯sign灏卞彲浠ヨ浼��, 濡傛灉瀵规帴澶氫釜瀹㈡埛绔缓璁敼閫犳垚澶氫釜 + * @param token 鍔犲瘑鍚庣殑token + * @return + */ + public static Claims parseJWT(String secretKey, String token) { - //浠巘oken瀛楃涓茶幏鍙杇etUserName - public static String getUserName(String token) { - if(StringUtils.isEmpty(token)) return ""; - Jws<Claims> claimsJws - = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); - Claims claims = claimsJws.getBody(); - return (String)claims.get("userName"); + //鐢熸垚 HMAC 瀵嗛挜锛屾牴鎹彁渚涚殑瀛楄妭鏁扮粍闀垮害閫夋嫨閫傚綋鐨� HMAC 绠楁硶锛屽苟杩斿洖鐩稿簲鐨� SecretKey 瀵硅薄銆� + SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8)); + + // 寰楀埌DefaultJwtParser + JwtParser jwtParser = Jwts.parser() + // 璁剧疆绛惧悕鐨勭閽� + .verifyWith(key) + .build(); + Jws<Claims> jws = jwtParser.parseSignedClaims(token); + Claims claims = jws.getPayload(); + return claims; } } + + + + diff --git a/pms-parent/pms-web-wechat/src/main/resources/application.yml b/pms-parent/pms-web-wechat/src/main/resources/application.yml index c515b63..42da78d 100644 --- a/pms-parent/pms-web-wechat/src/main/resources/application.yml +++ b/pms-parent/pms-web-wechat/src/main/resources/application.yml @@ -16,4 +16,7 @@ wechat: appId: wx2e6beb0eca7c3672 appSecret: b8f8ce34e13d3ba2eeaeba89068d7fbe - loginUrl: https://api.weixin.qq.com/sns/jscode2session \ No newline at end of file + loginUrl: https://api.weixin.qq.com/sns/jscode2session + jwt: + secret-key: dayuzhuisu123456789abcdefghigklmnopqrstuvwxyz + ttl: 7200000 \ No newline at end of file diff --git a/pms-parent/pom.xml b/pms-parent/pom.xml index cf9ccf4..9cc7dbb 100644 --- a/pms-parent/pom.xml +++ b/pms-parent/pom.xml @@ -52,6 +52,8 @@ <mapstruct.version>1.5.5.Final</mapstruct.version> <dubbo.version>3.2.11</dubbo.version> <hutool-all.version>5.8.22</hutool-all.version> + <jjwt.version>0.12.6</jjwt.version> + <jdom2.version>2.0.6.1</jdom2.version> <quartz.version>2.1.7</quartz.version> <junit.version>4.13.2</junit.version> @@ -365,7 +367,14 @@ <type>pom</type> <scope>import</scope> </dependency> - + <!--JWT浠ょ墝--> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt</artifactId> + <version>${jjwt.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> <!-- 娴嬭瘯 --> <dependency> <groupId>junit</groupId> -- Gitblit v1.8.0