From 4896454164b1c11fee2f0c93912b9d155b4daeb8 Mon Sep 17 00:00:00 2001 From: topsun Date: Wed, 19 Apr 2023 16:26:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=B7=E6=96=B0token=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BC=96=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TokenController.java | 23 ++++++++++ .../interceptor/JwtInterceptor.java | 35 +++++++-------- .../apipassenger/service/TokenService.java | 42 ++++++++++++++++++ .../service/VerificationCodeService.java | 34 ++++++-------- .../com/taxi/apipassenger/util/TokenUtil.java | 41 +++++++++++++++++ .../service/VerificationCodeService.class | Bin 4697 -> 4250 bytes .../internal/contant/CommonStatusEnum.java | 8 ++++ ...ckCodeResponse.java => TokenResponse.java} | 2 +- .../main/java/com/internal/util/JwtUtils.java | 15 +++++++ 9 files changed, 159 insertions(+), 41 deletions(-) create mode 100644 online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/controller/TokenController.java create mode 100644 online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/service/TokenService.java create mode 100644 online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/util/TokenUtil.java rename online-taxi-public/internal-common/src/main/java/com/internal/response/{CheckCodeResponse.java => TokenResponse.java} (79%) diff --git a/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/controller/TokenController.java b/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/controller/TokenController.java new file mode 100644 index 0000000..22f2b39 --- /dev/null +++ b/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/controller/TokenController.java @@ -0,0 +1,23 @@ +package com.taxi.apipassenger.controller; + +import com.internal.dto.ResponseResult; +import com.internal.response.TokenResponse; +import com.taxi.apipassenger.service.TokenService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class TokenController { + + @Autowired + TokenService tokenService; + + @PostMapping("/token-refresh") + public ResponseResult refreshToken(@RequestBody TokenResponse tokenResponse){ + return tokenService.refreshToken(tokenResponse.getRefreshToken()); + } + +} diff --git a/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/interceptor/JwtInterceptor.java b/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/interceptor/JwtInterceptor.java index 0ac081f..1fae85f 100644 --- a/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/interceptor/JwtInterceptor.java +++ b/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/interceptor/JwtInterceptor.java @@ -29,21 +29,21 @@ public class JwtInterceptor implements HandlerInterceptor { String token = request.getHeader("Authorization"); //解析token - TokenResult tokenResult = null; - try { - //解析token - tokenResult =JwtUtils.parseToken(token); - } catch (SignatureException exception) { - resultStr = "token sign error "; - resultBoolean = false; - }catch (TokenExpiredException ex){ - resultStr = "token time out"; - resultBoolean = false; - }catch (Exception exception){ - resultBoolean = false; - } + TokenResult tokenResult = JwtUtils.checkToken(token); +// try { +// //解析token +// tokenResult =JwtUtils.parseToken(token); +// } catch (SignatureException exception) { +// resultStr = "token sign error "; +// resultBoolean = false; +// }catch (TokenExpiredException ex){ +// resultStr = "token time out"; +// resultBoolean = false; +// }catch (Exception exception){ +// resultBoolean = false; +// } if(tokenResult == null){ - resultStr = "token sign error "; + resultStr = "token invalid "; resultBoolean = false; }else{ //拼接tokenKey @@ -52,14 +52,9 @@ public class JwtInterceptor implements HandlerInterceptor { String tokenKey = RedisPrefixUtils.getTokenPrefixKey(phone,identity, TokenConstant.ACCESS_TOKEN_TYPE); //从redis中取出token String redisToke = stringRedisTemplate.opsForValue().get(tokenKey); - if(StringUtils.isBlank(redisToke)){ + if(StringUtils.isBlank(redisToke) || (!token.trim().equals(redisToke.trim()))){ resultStr = "token invalid "; resultBoolean = false; - }else{ - if(!token.trim().equals(redisToke)){ - resultStr = "token invalid "; - resultBoolean = false; - } } } diff --git a/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/service/TokenService.java b/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/service/TokenService.java new file mode 100644 index 0000000..ac6e397 --- /dev/null +++ b/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/service/TokenService.java @@ -0,0 +1,42 @@ +package com.taxi.apipassenger.service; + +import com.internal.contant.CommonStatusEnum; +import com.internal.contant.IdentityConstant; +import com.internal.contant.TokenConstant; +import com.internal.dto.ResponseResult; +import com.internal.dto.TokenResult; +import com.internal.response.TokenResponse; +import com.internal.util.JwtUtils; +import com.internal.util.RedisPrefixUtils; +import com.taxi.apipassenger.util.TokenUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +@Service +public class TokenService { + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + public ResponseResult refreshToken(String refreshToken) { + TokenResult tokenResult = JwtUtils.checkToken(refreshToken); + TokenResponse tokenResponse; + if (tokenResult == null) { + return ResponseResult.fail(CommonStatusEnum.TOKEN_ERROR); + } + String passenegerPhone = tokenResult.getPassengerPhone(); + String refreshTokenKey = RedisPrefixUtils.getTokenPrefixKey(passenegerPhone, + IdentityConstant.PASSENGER_IDENTITY, TokenConstant.REFRESH_TOKEN_TYPE); + //从redis 缓存中获取refreshtoken + String redisRefreshToken = stringRedisTemplate.opsForValue().get(refreshTokenKey); + //判断refreshToken是否有效 + if (redisRefreshToken.equals(refreshToken)) {//生成双token + tokenResponse = TokenUtil.proDoubleTokenAndSaveRedis(stringRedisTemplate, + passenegerPhone); + } else { + return ResponseResult.fail(CommonStatusEnum.TOKEN_ERROR); + } + return ResponseResult.success(tokenResponse); + } +} diff --git a/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/service/VerificationCodeService.java b/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/service/VerificationCodeService.java index cda9a3e..a639373 100644 --- a/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/service/VerificationCodeService.java +++ b/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/service/VerificationCodeService.java @@ -4,13 +4,15 @@ import com.internal.contant.CommonStatusEnum; import com.internal.contant.IdentityConstant; import com.internal.contant.TokenConstant; import com.internal.dto.ResponseResult; +import com.internal.dto.TokenResult; import com.internal.request.VerificationCodeDTO; -import com.internal.response.CheckCodeResponse; +import com.internal.response.TokenResponse; import com.internal.response.NumberResponse; import com.internal.util.JwtUtils; import com.internal.util.RedisPrefixUtils; import com.taxi.apipassenger.remote.ServicePassengerUserClient; import com.taxi.apipassenger.remote.ServiceVerificatoncodeClient; +import com.taxi.apipassenger.util.TokenUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; @@ -68,29 +70,21 @@ public class VerificationCodeService { VerificationCodeDTO verificationCodeDTO = new VerificationCodeDTO(); verificationCodeDTO.setPassengerPhone(passenegerPhone); servicePassengerUserClient.loginOrReg(verificationCodeDTO); - //四、颁发令牌 - String accessToken = JwtUtils.generatorToken(passenegerPhone, - IdentityConstant.PASSENGER_IDENTITY, TokenConstant.ACCESS_TOKEN_TYPE); - String refreshToken = JwtUtils.generatorToken(passenegerPhone, - IdentityConstant.PASSENGER_IDENTITY,TokenConstant.REFRESH_TOKEN_TYPE); - - //将accesstoken存入redis - String accessTokenKey = RedisPrefixUtils.getTokenPrefixKey(passenegerPhone, - IdentityConstant.PASSENGER_IDENTITY,TokenConstant.ACCESS_TOKEN_TYPE); - stringRedisTemplate.opsForValue().set(accessTokenKey,accessToken,30,TimeUnit.DAYS); - //将refreshToken存入redis - String refreshTokenKey = RedisPrefixUtils.getTokenPrefixKey(passenegerPhone, - IdentityConstant.PASSENGER_IDENTITY,TokenConstant.REFRESH_TOKEN_TYPE); - stringRedisTemplate.opsForValue().set(refreshTokenKey,refreshToken,31,TimeUnit.DAYS); - - CheckCodeResponse checkCodeResponse = new CheckCodeResponse(); - checkCodeResponse.setAccessToken(accessToken); - checkCodeResponse.setRefreshToken(refreshToken); - return ResponseResult.success(checkCodeResponse); + + /** + * 生成双token并且保存到redis + */ + TokenResponse tokenResponse = TokenUtil.proDoubleTokenAndSaveRedis(stringRedisTemplate, + passenegerPhone); + + return ResponseResult.success(tokenResponse); } } else { CommonStatusEnum.VERIFICATION_CODE_ERROR.setMessage("验证码错误!"); return ResponseResult.fail(CommonStatusEnum.VERIFICATION_CODE_ERROR); } } + + + } diff --git a/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/util/TokenUtil.java b/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/util/TokenUtil.java new file mode 100644 index 0000000..287f75d --- /dev/null +++ b/online-taxi-public/api-passenger/src/main/java/com/taxi/apipassenger/util/TokenUtil.java @@ -0,0 +1,41 @@ +package com.taxi.apipassenger.util; + +import com.internal.contant.IdentityConstant; +import com.internal.contant.TokenConstant; +import com.internal.response.TokenResponse; +import com.internal.util.JwtUtils; +import com.internal.util.RedisPrefixUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.concurrent.TimeUnit; + +public class TokenUtil { + + /** + * 生成双token并且保存到redis + * 动作一致 + */ + public static TokenResponse proDoubleTokenAndSaveRedis(StringRedisTemplate stringRedisTemplate, + String passenegerPhone){ + //四、颁发令牌 + String accessToken = JwtUtils.generatorToken(passenegerPhone, + IdentityConstant.PASSENGER_IDENTITY, TokenConstant.ACCESS_TOKEN_TYPE); + String refreshToken = JwtUtils.generatorToken(passenegerPhone, + IdentityConstant.PASSENGER_IDENTITY,TokenConstant.REFRESH_TOKEN_TYPE); + + //将accesstoken存入redis + String accessTokenKey = RedisPrefixUtils.getTokenPrefixKey(passenegerPhone, + IdentityConstant.PASSENGER_IDENTITY,TokenConstant.ACCESS_TOKEN_TYPE); + stringRedisTemplate.opsForValue().set(accessTokenKey,accessToken,30, TimeUnit.DAYS); + //将refreshToken存入redis + String refreshTokenKey = RedisPrefixUtils.getTokenPrefixKey(passenegerPhone, + IdentityConstant.PASSENGER_IDENTITY,TokenConstant.REFRESH_TOKEN_TYPE); + stringRedisTemplate.opsForValue().set(refreshTokenKey,refreshToken,31,TimeUnit.DAYS); + + TokenResponse checkCodeResponse = new TokenResponse(); + checkCodeResponse.setAccessToken(accessToken); + checkCodeResponse.setRefreshToken(refreshToken); + return checkCodeResponse; + } +} diff --git a/online-taxi-public/api-passenger/target/classes/com/taxi/apipassenger/service/VerificationCodeService.class b/online-taxi-public/api-passenger/target/classes/com/taxi/apipassenger/service/VerificationCodeService.class index 4d0d81cf204b5a00678e95e906b82b82af37698b..cef1aa8151b28e361a750a8aa4492de6a5421231 100644 GIT binary patch delta 1108 zcmZXT*>hAy6vlsdCinK8J55+hP(i?034}>7E(y^Dvq+S%3}P}72rfV}>PX1MOoEEw zIBG~pVoj#|}@_lD|ekwgy zlE3=brOQAy7XvCt#pvJ>pLGH2*$^W^XPk{Z8t@p8E1n4O*`(MU5RmfOVr`d&ZVTyv zCwa_1V+2ivFZeE?_nT76xN%=Q*F}1Fi)$l;cp`Q4v8zQEZVoiSw~yEWb0md^EMdvj@r zvel;8o8_i#)Reh(PQTgYZirV?qj+7jn>Wn&ZsnXkn!UWKsbsNYpJtf16#F#?IB4SD zqUbP(Os%)R(J-PhysdeM!-^xCqa4%R#odZ`HOG0+0mb{84>+OtQ1cNVYd+zm=2Jd1 zKX~OepL1CA1*a5WYQExYhns#owQq8?@au`fyOr zo+q}-{>YZp|6;O~|HPu=%jN}_NL7_s*%of%0?z5MO|7793O90(puU#Cy-cYS*P))J zGHr=jHg!kdCeM>)Lz%qJ1>C?w=2I?(2^xfDT3Fd8)!4_FktVi>J>4hwj^uaHNR#xN z&q|uPU(_{-%4LE@v`D5Me=X|)$$C&Ct|P^k$a1E)S|)OCkvhv_#3ZNHxNVhJSYvii zlZ~Badc_0_>%5!23ChRLFmJ}9^V}+Sf|4<*h+;J~FjcTlSk{Z|rLxIJ@tOpiStYF6 zg;A$W?~YHxeGTC3HkK9*nnQma<`j0}ra&10W^_Tzu{`R{%2=1HeY z5-0vXa0r;ej}}4N{d5pExy_=JE26m6LqQ{AKjBc~WIUAid2HE5NNlQ+s!wGfP zN0&PboLF}>5_1eLa<_Q${q-q_yDdFvY;b={Z_TJ@j^bsTS9sN}^;Q(UX7f7RZEBdM z*kSVqI~8x*?BXqh5_hYo#H)>OyMx}vwY%A4vzvaK0R|OAHhX!;rj9EV!#4XEF+j23 z<^Ts3@7lb_A)CXzZ*znX+4~&;1wzqCye$$B%v0m@js6L>8~k4<{@FPlg9G8H1{N>)Ht zX(HaTeHa5tm@7qUP&k*XMA~NqxSGs)vNdR+QBIrd2C~*Bba0W(0GuyRZ3%fyp_mJ( zqExCX!(mzyWCr>%2@8nE(AqUL30590T+4NWS1h>mxn6EJn{pP2H=TtNsgFM!)htmh zV(}W1tP8n;oJG14(SMhcGsJkttwc5;2UP9ENYlb3ak+> z?H{Blw`!P)vW_q*(JwW5&@A0VzQ`)!p<1*c)1`YsxofR_8>Mp#<+)lSeF@2Z!jjP| zTqT5)jlz#B%B)8IK^Uqp_N}*#&6u1WVu^72(eB)t#VF+_Jlw-2{juf zV5w;GN|S?@iDn8|rC6Kr3tXO*ceA`)g}|{Eof&PBw%sCeX##mV*%*&p;Ah&zmd>q` ilSSHJEK!8y_a~c@P4cJdCKXDi9?j)R>5L8R3it;~%1b8z diff --git a/online-taxi-public/internal-common/src/main/java/com/internal/contant/CommonStatusEnum.java b/online-taxi-public/internal-common/src/main/java/com/internal/contant/CommonStatusEnum.java index c5088f6..fb3b29b 100644 --- a/online-taxi-public/internal-common/src/main/java/com/internal/contant/CommonStatusEnum.java +++ b/online-taxi-public/internal-common/src/main/java/com/internal/contant/CommonStatusEnum.java @@ -2,6 +2,11 @@ package com.internal.contant; public enum CommonStatusEnum { + /** + *TOKEN类提示:1100 - 1199 + */ + TOKEN_ERROR(1199,"token 错误"), + /** * */ @@ -10,12 +15,15 @@ public enum CommonStatusEnum { * 成功 */ SUCCESS(1,"success"), + /** * 失败 */ FAIL(0,"fail"); + + private int code; private String message; diff --git a/online-taxi-public/internal-common/src/main/java/com/internal/response/CheckCodeResponse.java b/online-taxi-public/internal-common/src/main/java/com/internal/response/TokenResponse.java similarity index 79% rename from online-taxi-public/internal-common/src/main/java/com/internal/response/CheckCodeResponse.java rename to online-taxi-public/internal-common/src/main/java/com/internal/response/TokenResponse.java index 24b324e..53e0902 100644 --- a/online-taxi-public/internal-common/src/main/java/com/internal/response/CheckCodeResponse.java +++ b/online-taxi-public/internal-common/src/main/java/com/internal/response/TokenResponse.java @@ -3,7 +3,7 @@ package com.internal.response; import lombok.Data; @Data -public class CheckCodeResponse { +public class TokenResponse { private String accessToken; diff --git a/online-taxi-public/internal-common/src/main/java/com/internal/util/JwtUtils.java b/online-taxi-public/internal-common/src/main/java/com/internal/util/JwtUtils.java index 1325896..9374688 100644 --- a/online-taxi-public/internal-common/src/main/java/com/internal/util/JwtUtils.java +++ b/online-taxi-public/internal-common/src/main/java/com/internal/util/JwtUtils.java @@ -69,5 +69,20 @@ public class JwtUtils { return tokenResult; } + /*** + * 校验token + * @param token + * @return + */ + public static TokenResult checkToken(String token){ + TokenResult tokenResult = null; + try { + tokenResult = parseToken(token); + } catch (Exception e) { + throw new RuntimeException(e); + } + return tokenResult; + } + }