双token生成并存入Redis。

master
liuyuanqiang 3 years ago
parent 79c9511300
commit 2e07341226

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

@ -1,6 +1,7 @@
package com.mashibing.apipassenger.controller;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@ -13,4 +14,21 @@ public class TestController {
//
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();
System.out.println("verificationCode:" + verificationCode + ",passengerPhone:" + passengerPhone);
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.common.constant.CommonStatusEnum;
import com.mashibing.common.constant.IdentityConstant;
import com.mashibing.common.constant.TokenConstants;
import com.mashibing.common.dto.ResponseResult;
import com.mashibing.common.request.VerificationCodeDTO;
import com.mashibing.common.response.NumberCodeResponse;
import com.mashibing.common.response.TokenResponse;
import com.mashibing.common.util.JwtUtils;
import com.mashibing.common.util.RedisPrefixUtils;
import jdk.nashorn.internal.parser.TokenType;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -27,7 +30,7 @@ public class VerificationCodeService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
private String verificationCodePrefix = "verification-code-";
/**
*
@ -43,7 +46,7 @@ public class VerificationCodeService {
//存入redis
System.out.println("存入redis");
String key = this.generateKeyByCode(passengerPhone);
String key = RedisPrefixUtils.generateKeyByCode(passengerPhone);
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
@ -63,7 +63,7 @@ public class VerificationCodeService {
*/
public ResponseResult checkCode(String passengerPhone, String verificationCode) {
System.out.println("根据手机号和验证码查询redis");
String key = this.generateKeyByCode(passengerPhone);
String key = RedisPrefixUtils.generateKeyByCode(passengerPhone);
String codeRedis = stringRedisTemplate.opsForValue().get(key);
System.out.println("code in redis:" + codeRedis);
@ -80,12 +80,22 @@ public class VerificationCodeService {
servicePassengerUserClient.loginOrRegister(verificationCodeDTO);
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.setToken(token);
tokenResponse.setAccessToken(accessToken);
tokenResponse.setRefreshToken(refreshToken);
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 {
private String phone;
private String identity;
private String tokenType;
}

@ -4,5 +4,6 @@ import lombok.Data;
@Data
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.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.mashibing.common.constant.TokenConstants;
import com.mashibing.common.dto.TokenResult;
import java.util.Calendar;
@ -17,11 +18,13 @@ public class JwtUtils {
private static final String JWT_KEY_PHONE = "phone";
//乘客是1司机是2
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.put(JwtUtils.JWT_KEY_PHONE,phone);
map.put(JwtUtils.JWT_KET_IDENTITY,identity);
map.put(JwtUtils.JWT_KET_TOKEN_TYPE,tokenType);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE,1);
@ -31,7 +34,7 @@ public class JwtUtils {
map.forEach((k,v) -> {
builder.withClaim(k,v);
});
builder.withExpiresAt(date);
// builder.withExpiresAt(date);
String token = builder.sign(Algorithm.HMAC256(SIGN));
return token;
@ -39,16 +42,18 @@ public class JwtUtils {
public static TokenResult parseToken(String token){
DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
String phone = decodedJWT.getClaim(JwtUtils.JWT_KEY_PHONE).toString();
String identity = decodedJWT.getClaim(JwtUtils.JWT_KET_IDENTITY).toString();
String phone = decodedJWT.getClaim(JwtUtils.JWT_KEY_PHONE).asString();//不能写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.setTokenType(tokenType);
tokenResult.setIdentity(identity);
tokenResult.setPhone(phone);
return tokenResult;
}
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);
TokenResult result = JwtUtils.parseToken(token);
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\request\VerificationCodeDTO.class
com\mashibing\common\constant\CommonStatusEnum.class
com\mashibing\common\response\NumberCodeResponse.class
com\mashibing\common\response\TokenResponse.class
com\mashibing\common\util\RedisPrefixUtils.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\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\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\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>
</dependency>
<dependency>
<groupId>org.mashibing</groupId>
<artifactId>internal-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>

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

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

Loading…
Cancel
Save