JWT Interceptor for Http Service
Http JWT Interceptor Server and Client.
build.gradle
def grpcVersion = 'x.x.x'
dependencies {
implementation 'org.hertsstack:herts-core:1.1.0'
implementation 'org.hertsstack:herts-http:1.1.0'
implementation 'org.hertsstack:herts-http-client:1.0.0'
implementation "io.grpc:grpc-protobuf:${grpcVersion}"
implementation "io.grpc:grpc-services:${grpcVersion}"
implementation "io.grpc:grpc-stub:${grpcVersion}"
}
HttpService.class
@HertsHttp
public interface HttpService extends HertsService {
String helloWorld();
Map<String, String> getUser(String id);
}
HttpServiceImpl.class
public class HttpServiceImpl extends HertsServiceHttp<HttpService> implements HttpService {
@Override
public String helloWorld() {
return "hello world";
}
@Overide
public Map<String, String> getUser(String id) {
return Collections.singletonMap("name", "foo");
}
}
Server side interceptor.
JwtServerInterceptor.java
public class JwtServerInterceptor implements HertsHttpInterceptor {
private final JwtVerifier jwtVerifier;
public JwtServerInterceptor() {
this.jwtVerifier = new JwtVerifier();
}
@Override
public void beforeHandle(HertsHttpRequest request) {
var token = request.getHeader("Authorization");
if (token == null || token.isEmpty()) {
throw new HttpErrorException(HttpErrorException.StatusCode.Status401, "Unauthorized");
}
if (!this.jwtVerifier.verifyToken(token)) {
throw new HttpErrorException(HttpErrorException.StatusCode.Status401, "Unauthorized");
}
}
@Override
public void afterHandle() {
}
}
Start Herts HTTP Server
public class Main {
public static void main(String[] args) {
// Inject other class if need it
var httpService = new HttpServiceImpl();
var interceptor = new JwtServerInterceptor();
HertsHttpEngine engine = HertsHttpServer.builder()
.registerHertsHttpService(httpService, interceptor)
.build();
engine.start();
}
}
Run server. Default port is 9999
java -jar {Your Jar path}
2023-06-15 13:16:06.793 INFO org.hertstack.http.HertsHttpServer start HttpServiceImpl endpoint.
2023-06-15 13:16:06.796 INFO org.hertstack.http.HertsHttpServer start [POST] /api/HttpService/helloWorld
2023-06-15 13:16:06.796 INFO org.hertstack.http.HertsHttpServer start [OPTIONS] /api/HttpService/helloWorld
2023-06-15 13:16:06.796 INFO org.hertstack.http.HertsHttpServer start [POST] /api/HttpService/getUser
2023-06-15 13:16:06.796 INFO org.hertstack.http.HertsHttpServer start [OPTIONS] /api/HttpService/getUser
2023-06-15 13:16:06.856 INFO org.hertstack.http.HertsHttpServer start Started Herts HTTP server. Port 9999
You need to define Map(Header key/value) when call createHertsService
.
Also, If you want recreate token by expires, you should createHertsService
again.
Start Herts HTTP Client
public class Main {
public static void main(String[] args) {
HertsHttpClient client = HertsHttpClient
.builder("localhost")
.registerHertsService(HttpService.class)
.secure(false)
.build();
// Create interface instance
var token = "";
var httpService = client.createHertsService(HttpService.class, Collections.singletonMap("Authorization", token));
var res01 = httpService.helloWorld();
System.out.println(res01);
}
}