双token生成并存入Redis。

master
liuyuanqiang 3 years ago
parent 79c9511300
commit 2e07341226

@ -40,6 +40,7 @@
<dependency> <dependency>
<groupId>org.mashibing</groupId> <groupId>org.mashibing</groupId>
<artifactId>internal-common</artifactId> <artifactId>internal-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency> </dependency>
</dependencies> </dependencies>

@ -1,6 +1,7 @@
package com.mashibing.apipassenger.controller; package com.mashibing.apipassenger.controller;
import com.mashibing.apipassenger.request.VerificationCodeDTO; import com.mashibing.apipassenger.request.VerificationCodeDTO;
import com.mashibing.common.dto.ResponseResult;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -13,4 +14,21 @@ public class TestController {
// //
return "test api passenger."; return "test api passenger.";
} }
/**
* token
* @return
*/
@GetMapping("/authTest")
public ResponseResult authTest(){
return ResponseResult.success("auth test!");
}
/**
* token
* @return
*/
@GetMapping("/noAuthTest")
public ResponseResult noAuthTest(){
return ResponseResult.success("no auth test!");
}
} }

@ -30,7 +30,6 @@ public class VerificationCodeController {
String passengerPhone = verificationCodeDTO.getPassengerPhone(); String passengerPhone = verificationCodeDTO.getPassengerPhone();
System.out.println("verificationCode:" + verificationCode + ",passengerPhone:" + passengerPhone); System.out.println("verificationCode:" + verificationCode + ",passengerPhone:" + passengerPhone);
return verificationCodeService.checkCode(passengerPhone,verificationCode); return verificationCodeService.checkCode(passengerPhone,verificationCode);
} }

@ -0,0 +1,25 @@
package com.mashibing.apipassenger.interceptor;
import com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Bean
public JwtInterceptor jwtInterceptor(){
return new JwtInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// /**拦截的更多,子目录也拦截
// registry.addInterceptor(new JwtInterceptor()) 这个会导致拦截器初始化时没有初始化redisTemplate,所以要提前new
registry.addInterceptor(jwtInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/noAuthTest")
.excludePathPatterns("/verification-code")
.excludePathPatterns("/verification-code-check");
}
}

@ -0,0 +1,63 @@
package com.mashibing.apipassenger.interceptor;
import com.auth0.jwt.exceptions.AlgorithmMismatchException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.mashibing.common.constant.TokenConstants;
import com.mashibing.common.dto.ResponseResult;
import com.mashibing.common.dto.TokenResult;
import com.mashibing.common.util.JwtUtils;
import com.mashibing.common.util.RedisPrefixUtils;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Result;
import java.io.PrintWriter;
public class JwtInterceptor implements HandlerInterceptor {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
boolean result = true;
String resutltString = "";
String token = request.getHeader("Authorization");
// 解析token
TokenResult tokenResult = null;
try {
tokenResult = JwtUtils.parseToken(token);
}catch (Exception e){
tokenResult = null;
}
if (tokenResult == null){
resutltString = "access token invalid";
result = false;
}else{
// 拼接key
String phone = tokenResult.getPhone();
String identity = tokenResult.getIdentity();
String tokenKey = RedisPrefixUtils.generateTokenKey(phone,identity, TokenConstants.ACCESS_TOKEN_TYPE);
// 从redis中取出token
String tokenRedis = stringRedisTemplate.opsForValue().get(tokenKey);
if ((StringUtils.isBlank(tokenRedis)) || (!token.trim().equals(tokenRedis.trim()))){
resutltString = "access token invalid";
result = false;
}
}
if (!result){//输出到前台页面数据
PrintWriter out = response.getWriter();
out.print(JSONObject.fromObject(ResponseResult.fail(resutltString)).toString());
}
return result;
}
}

@ -4,11 +4,14 @@ import com.mashibing.apipassenger.remote.ServicePassengerUserClient;
import com.mashibing.apipassenger.remote.ServiceVefificationcodeClient; import com.mashibing.apipassenger.remote.ServiceVefificationcodeClient;
import com.mashibing.common.constant.CommonStatusEnum; import com.mashibing.common.constant.CommonStatusEnum;
import com.mashibing.common.constant.IdentityConstant; import com.mashibing.common.constant.IdentityConstant;
import com.mashibing.common.constant.TokenConstants;
import com.mashibing.common.dto.ResponseResult; import com.mashibing.common.dto.ResponseResult;
import com.mashibing.common.request.VerificationCodeDTO; import com.mashibing.common.request.VerificationCodeDTO;
import com.mashibing.common.response.NumberCodeResponse; import com.mashibing.common.response.NumberCodeResponse;
import com.mashibing.common.response.TokenResponse; import com.mashibing.common.response.TokenResponse;
import com.mashibing.common.util.JwtUtils; import com.mashibing.common.util.JwtUtils;
import com.mashibing.common.util.RedisPrefixUtils;
import jdk.nashorn.internal.parser.TokenType;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -27,7 +30,7 @@ public class VerificationCodeService {
@Autowired @Autowired
private StringRedisTemplate stringRedisTemplate; private StringRedisTemplate stringRedisTemplate;
private String verificationCodePrefix = "verification-code-";
/** /**
* *
@ -43,7 +46,7 @@ public class VerificationCodeService {
//存入redis //存入redis
System.out.println("存入redis"); System.out.println("存入redis");
String key = this.generateKeyByCode(passengerPhone); String key = RedisPrefixUtils.generateKeyByCode(passengerPhone);
stringRedisTemplate.opsForValue().set(key, "" + numberCode,2, TimeUnit.MINUTES); stringRedisTemplate.opsForValue().set(key, "" + numberCode,2, TimeUnit.MINUTES);
//发送短信。。。 //发送短信。。。
@ -52,9 +55,6 @@ public class VerificationCodeService {
} }
private String generateKeyByCode(String passengerPhone){
return this.verificationCodePrefix + passengerPhone;
}
/** /**
* *
* @param passengerPhone * @param passengerPhone
@ -63,7 +63,7 @@ public class VerificationCodeService {
*/ */
public ResponseResult checkCode(String passengerPhone, String verificationCode) { public ResponseResult checkCode(String passengerPhone, String verificationCode) {
System.out.println("根据手机号和验证码查询redis"); System.out.println("根据手机号和验证码查询redis");
String key = this.generateKeyByCode(passengerPhone); String key = RedisPrefixUtils.generateKeyByCode(passengerPhone);
String codeRedis = stringRedisTemplate.opsForValue().get(key); String codeRedis = stringRedisTemplate.opsForValue().get(key);
System.out.println("code in redis:" + codeRedis); System.out.println("code in redis:" + codeRedis);
@ -80,12 +80,22 @@ public class VerificationCodeService {
servicePassengerUserClient.loginOrRegister(verificationCodeDTO); servicePassengerUserClient.loginOrRegister(verificationCodeDTO);
System.out.println("颁发token"); System.out.println("颁发token");
String token = JwtUtils.generateToken(passengerPhone, IdentityConstant.PASSENGER_IDENTITY); String accessToken = JwtUtils.generateToken(passengerPhone, IdentityConstant.PASSENGER_IDENTITY, TokenConstants.ACCESS_TOKEN_TYPE);
String refreshToken = JwtUtils.generateToken(passengerPhone, IdentityConstant.PASSENGER_IDENTITY, TokenConstants.REFRESH_TOKEN_TYPE);
//token存入Redis
String accessTokenRedisKey = RedisPrefixUtils.generateTokenKey(passengerPhone, IdentityConstant.PASSENGER_IDENTITY, TokenConstants.ACCESS_TOKEN_TYPE);
String refreshTokenRedisKey = RedisPrefixUtils.generateTokenKey(passengerPhone, IdentityConstant.PASSENGER_IDENTITY, TokenConstants.REFRESH_TOKEN_TYPE);
stringRedisTemplate.opsForValue().set(accessTokenRedisKey, accessToken, 30,TimeUnit.DAYS);
stringRedisTemplate.opsForValue().set(refreshTokenRedisKey, refreshToken, 31,TimeUnit.DAYS);
TokenResponse tokenResponse = new TokenResponse(); TokenResponse tokenResponse = new TokenResponse();
tokenResponse.setToken(token); tokenResponse.setAccessToken(accessToken);
tokenResponse.setRefreshToken(refreshToken);
return ResponseResult.success(tokenResponse); return ResponseResult.success(tokenResponse);
} }
} }

@ -1,3 +0,0 @@
artifactId=api-passenger
groupId=org.mashibing
version=1.0-SNAPSHOT

@ -1,5 +0,0 @@
com\mashibing\apipassenger\request\VerificationCodeDTO.class
com\mashibing\apipassenger\ApiPassengerApplication.class
com\mashibing\apipassenger\controller\TestController.class
com\mashibing\apipassenger\service\VerificationCodeService.class
com\mashibing\apipassenger\controller\VerificationCodeController.class

@ -1,5 +0,0 @@
D:\Works\workspaces\online-taxi-public\api-passenger\src\main\java\com\mashibing\apipassenger\controller\VerificationCodeController.java
D:\Works\workspaces\online-taxi-public\api-passenger\src\main\java\com\mashibing\apipassenger\request\VerificationCodeDTO.java
D:\Works\workspaces\online-taxi-public\api-passenger\src\main\java\com\mashibing\apipassenger\service\VerificationCodeService.java
D:\Works\workspaces\online-taxi-public\api-passenger\src\main\java\com\mashibing\apipassenger\ApiPassengerApplication.java
D:\Works\workspaces\online-taxi-public\api-passenger\src\main\java\com\mashibing\apipassenger\controller\TestController.java

@ -0,0 +1,11 @@
package com.mashibing.common.constant;
/**
* token
*/
public class TokenConstants {
public static final String ACCESS_TOKEN_TYPE = "accessToken";
public static final String REFRESH_TOKEN_TYPE = "refreshToken";
}

@ -6,4 +6,5 @@ import lombok.Data;
public class TokenResult { public class TokenResult {
private String phone; private String phone;
private String identity; private String identity;
private String tokenType;
} }

@ -4,5 +4,6 @@ import lombok.Data;
@Data @Data
public class TokenResponse { public class TokenResponse {
private String token; private String accessToken;
private String refreshToken;
} }

@ -4,6 +4,7 @@ import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator; import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT; import com.auth0.jwt.interfaces.DecodedJWT;
import com.mashibing.common.constant.TokenConstants;
import com.mashibing.common.dto.TokenResult; import com.mashibing.common.dto.TokenResult;
import java.util.Calendar; import java.util.Calendar;
@ -17,11 +18,13 @@ public class JwtUtils {
private static final String JWT_KEY_PHONE = "phone"; private static final String JWT_KEY_PHONE = "phone";
//乘客是1司机是2 //乘客是1司机是2
private static final String JWT_KET_IDENTITY = "identity"; private static final String JWT_KET_IDENTITY = "identity";
private static final String JWT_KET_TOKEN_TYPE = "tokenType";
public static String generateToken(String phone, String identity){ public static String generateToken(String phone, String identity, String tokenType){
Map<String,String> map = new HashMap<String, String>(); Map<String,String> map = new HashMap<String, String>();
map.put(JwtUtils.JWT_KEY_PHONE,phone); map.put(JwtUtils.JWT_KEY_PHONE,phone);
map.put(JwtUtils.JWT_KET_IDENTITY,identity); map.put(JwtUtils.JWT_KET_IDENTITY,identity);
map.put(JwtUtils.JWT_KET_TOKEN_TYPE,tokenType);
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE,1); calendar.add(Calendar.DATE,1);
@ -31,7 +34,7 @@ public class JwtUtils {
map.forEach((k,v) -> { map.forEach((k,v) -> {
builder.withClaim(k,v); builder.withClaim(k,v);
}); });
builder.withExpiresAt(date); // builder.withExpiresAt(date);
String token = builder.sign(Algorithm.HMAC256(SIGN)); String token = builder.sign(Algorithm.HMAC256(SIGN));
return token; return token;
@ -39,16 +42,18 @@ public class JwtUtils {
public static TokenResult parseToken(String token){ public static TokenResult parseToken(String token){
DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token); DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
String phone = decodedJWT.getClaim(JwtUtils.JWT_KEY_PHONE).toString(); String phone = decodedJWT.getClaim(JwtUtils.JWT_KEY_PHONE).asString();//不能写toString会多带“”双引号
String identity = decodedJWT.getClaim(JwtUtils.JWT_KET_IDENTITY).toString(); String identity = decodedJWT.getClaim(JwtUtils.JWT_KET_IDENTITY).asString();
String tokenType = decodedJWT.getClaim(JwtUtils.JWT_KET_TOKEN_TYPE).asString();
TokenResult tokenResult = new TokenResult(); TokenResult tokenResult = new TokenResult();
tokenResult.setTokenType(tokenType);
tokenResult.setIdentity(identity); tokenResult.setIdentity(identity);
tokenResult.setPhone(phone); tokenResult.setPhone(phone);
return tokenResult; return tokenResult;
} }
public static void main(String[] args) { public static void main(String[] args) {
String token = JwtUtils.generateToken("13751145166","1"); String token = JwtUtils.generateToken("13751145166","1", TokenConstants.ACCESS_TOKEN_TYPE);
System.out.println("token:" + token); System.out.println("token:" + token);
TokenResult result = JwtUtils.parseToken(token); TokenResult result = JwtUtils.parseToken(token);
System.out.println("phone parsed:" + result.toString()); System.out.println("phone parsed:" + result.toString());

@ -0,0 +1,14 @@
package com.mashibing.common.util;
public class RedisPrefixUtils {
private static String verificationCodePrefix = "verification-code-";
private static String tokenKeyPrefix = "token-";
public static String generateKeyByCode(String passengerPhone){
return verificationCodePrefix + passengerPhone;
}
public static String generateTokenKey(String phone,String identity, String tokenType){
return tokenKeyPrefix + phone + "-" + identity + "-" + tokenType;
}
}

@ -1,5 +1 @@
com\mashibing\common\dto\ResponseResult.class com\mashibing\common\util\RedisPrefixUtils.class
com\mashibing\common\request\VerificationCodeDTO.class
com\mashibing\common\constant\CommonStatusEnum.class
com\mashibing\common\response\NumberCodeResponse.class
com\mashibing\common\response\TokenResponse.class

@ -1,5 +1,9 @@
D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\constant\IdentityConstant.java
D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\constant\CommonStatusEnum.java D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\constant\CommonStatusEnum.java
D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\dto\ResponseResult.java D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\dto\ResponseResult.java
D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\response\NumberCodeResponse.java D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\response\NumberCodeResponse.java
D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\constant\TokenConstants.java
D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\request\VerificationCodeDTO.java D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\request\VerificationCodeDTO.java
D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\response\TokenResponse.java D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\response\TokenResponse.java
D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\util\JwtUtils.java
D:\Works\workspaces\online-taxi-public\internal-common\src\main\java\com\mashibing\common\dto\TokenResult.java

@ -74,12 +74,6 @@
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
<dependency>
<groupId>org.mashibing</groupId>
<artifactId>internal-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>

@ -35,6 +35,7 @@
<dependency> <dependency>
<groupId>org.mashibing</groupId> <groupId>org.mashibing</groupId>
<artifactId>internal-common</artifactId> <artifactId>internal-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.alibaba.cloud</groupId> <groupId>com.alibaba.cloud</groupId>

@ -37,6 +37,7 @@
<dependency> <dependency>
<groupId>org.mashibing</groupId> <groupId>org.mashibing</groupId>
<artifactId>internal-common</artifactId> <artifactId>internal-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency> </dependency>
</dependencies> </dependencies>

Loading…
Cancel
Save