JWT(JSON WEB TOKEN)是基于RFC 7519标准定义的一种可以安全传输的小巧和自包含的JSON对象。由于数据是使用数字签名的,所以是可信任的和安全的。JWT可以使用HMAC算法对secret进行加密或者使用RSA的公钥私钥对来进行签名。
JWT通常由头部(Header),负载(Payload),签名(Signature)三个部分组成,中间以.号分隔,其格式为Header.Payload.Signature
Header:声明令牌的类型和使用的算法
- alg:签名的算法
- typ:token的类型,比如JWT
Payload:也称为JWT Claims,包含用户的一些信息
系统保留的声明(Reserved claims):
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众用户
- nbf (Not Before):在此之前不可用
- iat (Issued At):签发时间
- jti (JWT ID):JWT唯一标识,能用于防止JWT重复使用
公共的声明(public):见 http://ponent public class JWTAuthFilter implements GlobalFilter, Ordered{ @Override public int getOrder() { return -100; } @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String url = exchange.getRequest().getURI().getPath(); //忽略以下url请求 if(url.indexOf("/auth-service/") >= 0){ return chain.filter(exchange); } //从请求头中取得token String token = exchange.getRequest().getHeaders().getFirst("Authorization"); if(StringUtil.isEmpty(token)){ ServerHttpResponse response = exchange.getResponse(); response.setStatusCode(HttpStatus.OK); response.getHeaders().add("Content-Type", "application/json;charset=UTF-8"); Response res = new Response(401, "401 unauthorized"); byte[] responseByte = JSONObject.fromObject(res).toString().getBytes(StandardCharsets.UTF_8); DataBuffer buffer = response.bufferFactory().wrap(responseByte); return response.writeWith(Flux.just(buffer)); } //请求中的token是否在redis中存在 boolean verifyResult = JWTUtil.verify(token); if(!verifyResult){ ServerHttpResponse response = exchange.getResponse(); response.setStatusCode(HttpStatus.OK); response.getHeaders().add("Content-Type", "application/json;charset=UTF-8"); Response res = new Response(1004, "invalid token"); byte[] responseByte = JSONObject.fromObject(res).toString().getBytes(StandardCharsets.UTF_8); DataBuffer buffer = response.bufferFactory().wrap(responseByte); return response.writeWith(Flux.just(buffer)); } return chain.filter(exchange); } }
3、关键的application配置信息
spring: application: name: service-gateway cloud: gateway: discovery: locator: enabled: true lowerCaseServiceId: true routes: #认证服务路由 - id: auth-service predicates: - Path=/auth-service/** uri: lb://auth-service filters: - StripPrefix=1以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。