From d946fdaadca41fae5ca9f52895eb6945a008a437 Mon Sep 17 00:00:00 2001 From: Steve Hu Date: Mon, 13 Apr 2020 23:40:17 -0400 Subject: [PATCH] fixes #248 pass the exchange to PortalAuthenticator for jaeger tracer --- .../oauth/auth/LightPortalAuthenticator.java | 16 ++++++++++++++++ .../LightBasicAuthenticationMechanism.java | 2 +- .../LightFormAuthenticationMechanism.java | 2 +- .../oauth/security/LightPasswordCredential.java | 10 +++++++++- .../oauth/auth/LightPortalAuthenticatorTest.java | 2 +- .../token/handler/Oauth2TokenPostHandler.java | 2 +- 6 files changed, 29 insertions(+), 5 deletions(-) diff --git a/authhub/src/main/java/com/networknt/oauth/auth/LightPortalAuthenticator.java b/authhub/src/main/java/com/networknt/oauth/auth/LightPortalAuthenticator.java index 3939a6c8..59e691cd 100644 --- a/authhub/src/main/java/com/networknt/oauth/auth/LightPortalAuthenticator.java +++ b/authhub/src/main/java/com/networknt/oauth/auth/LightPortalAuthenticator.java @@ -1,11 +1,17 @@ package com.networknt.oauth.auth; +import com.networknt.client.ClientConfig; +import com.networknt.client.ClientRequestCarrier; import com.networknt.client.Http2Client; import com.networknt.cluster.Cluster; import com.networknt.config.JsonMapper; +import com.networknt.httpstring.AttachmentConstants; import com.networknt.oauth.security.LightPasswordCredential; import com.networknt.server.Server; import com.networknt.service.SingletonServiceFactory; +import io.opentracing.Tracer; +import io.opentracing.propagation.Format; +import io.opentracing.tag.Tags; import io.undertow.UndertowOptions; import io.undertow.client.ClientConnection; import io.undertow.client.ClientRequest; @@ -82,6 +88,16 @@ public Account authenticate(String id, Credential credential) { String message = "/portal/query?cmd=" + URLEncoder.encode(s, "UTF-8"); final ClientRequest request = new ClientRequest().setMethod(Methods.GET).setPath(message); request.getRequestHeaders().put(Headers.HOST, "localhost"); + boolean injectOpenTracing = ClientConfig.get().isInjectOpenTracing(); + if(injectOpenTracing) { + Tracer tracer = passwordCredential.getExchange().getAttachment(AttachmentConstants.EXCHANGE_TRACER); + if(tracer != null && tracer.activeSpan() != null) { + Tags.SPAN_KIND.set(tracer.activeSpan(), Tags.SPAN_KIND_CLIENT); + Tags.HTTP_METHOD.set(tracer.activeSpan(), request.getMethod().toString()); + Tags.HTTP_URL.set(tracer.activeSpan(), request.getPath()); + tracer.inject(tracer.activeSpan().context(), Format.Builtin.HTTP_HEADERS, new ClientRequestCarrier(request)); + } + } connection.sendRequest(request, client.createClientCallback(reference, latch)); latch.await(); int statusCode = reference.get().getResponseCode(); diff --git a/authhub/src/main/java/com/networknt/oauth/security/LightBasicAuthenticationMechanism.java b/authhub/src/main/java/com/networknt/oauth/security/LightBasicAuthenticationMechanism.java index 9b164df3..dca85bc7 100644 --- a/authhub/src/main/java/com/networknt/oauth/security/LightBasicAuthenticationMechanism.java +++ b/authhub/src/main/java/com/networknt/oauth/security/LightBasicAuthenticationMechanism.java @@ -175,7 +175,7 @@ public AuthenticationMechanismOutcome authenticate(HttpServerExchange exchange, } IdentityManager idm = getIdentityManager(securityContext); - LightPasswordCredential credential = new LightPasswordCredential(password, clientAuthClass, userType); + LightPasswordCredential credential = new LightPasswordCredential(password, clientAuthClass, userType, exchange); try { final AuthenticationMechanismOutcome result; Account account = idm.verify(userName, credential); diff --git a/authhub/src/main/java/com/networknt/oauth/security/LightFormAuthenticationMechanism.java b/authhub/src/main/java/com/networknt/oauth/security/LightFormAuthenticationMechanism.java index 9d3f31d6..e6f221fe 100644 --- a/authhub/src/main/java/com/networknt/oauth/security/LightFormAuthenticationMechanism.java +++ b/authhub/src/main/java/com/networknt/oauth/security/LightFormAuthenticationMechanism.java @@ -130,7 +130,7 @@ public AuthenticationMechanismOutcome runFormAuth(final HttpServerExchange excha } AuthenticationMechanismOutcome outcome = null; - LightPasswordCredential credential = new LightPasswordCredential(password.toCharArray(), clientAuthClass, userType); + LightPasswordCredential credential = new LightPasswordCredential(password.toCharArray(), clientAuthClass, userType, exchange); try { IdentityManager identityManager = getIdentityManager(securityContext); Account account = identityManager.verify(userName, credential); diff --git a/authhub/src/main/java/com/networknt/oauth/security/LightPasswordCredential.java b/authhub/src/main/java/com/networknt/oauth/security/LightPasswordCredential.java index b6be51bd..69bf867e 100644 --- a/authhub/src/main/java/com/networknt/oauth/security/LightPasswordCredential.java +++ b/authhub/src/main/java/com/networknt/oauth/security/LightPasswordCredential.java @@ -1,6 +1,8 @@ package com.networknt.oauth.security; +import com.sun.net.httpserver.HttpServer; import io.undertow.security.idm.Credential; +import io.undertow.server.HttpServerExchange; /** * For the OAuth 2.0 authorization code grant type, we need to pass the client specific authentication @@ -22,11 +24,13 @@ public class LightPasswordCredential implements Credential { private final char[] password; private final String clientAuthClass; private final String userType; + private HttpServerExchange exchange; - public LightPasswordCredential(char[] password, String clientAuthClass, String userType) { + public LightPasswordCredential(char[] password, String clientAuthClass, String userType, HttpServerExchange exchange) { this.password = password; this.clientAuthClass = clientAuthClass; this.userType = userType; + this.exchange = exchange; } public char[] getPassword() { return this.password; } @@ -34,4 +38,8 @@ public LightPasswordCredential(char[] password, String clientAuthClass, String u public String getClientAuthClass() { return this.clientAuthClass; } public String getUserType() { return this.userType; } + + public HttpServerExchange getExchange() { + return exchange; + } } diff --git a/authhub/src/test/java/com/networknt/oauth/auth/LightPortalAuthenticatorTest.java b/authhub/src/test/java/com/networknt/oauth/auth/LightPortalAuthenticatorTest.java index cfa4fc4a..65c41dc1 100644 --- a/authhub/src/test/java/com/networknt/oauth/auth/LightPortalAuthenticatorTest.java +++ b/authhub/src/test/java/com/networknt/oauth/auth/LightPortalAuthenticatorTest.java @@ -38,7 +38,7 @@ public void testAuthenticate() { } Authenticator authenticator = SingletonServiceFactory.getBean(Authenticator.class, clazz); Assert.assertTrue(authenticator != null); - Account account = authenticator.authenticate("stevehu@gmail.com", new LightPasswordCredential("123456".toCharArray(), null, null)); + Account account = authenticator.authenticate("stevehu@gmail.com", new LightPasswordCredential("123456".toCharArray(), null, null, null)); Assert.assertTrue(account != null); } } diff --git a/token/src/main/java/com/networknt/oauth/token/handler/Oauth2TokenPostHandler.java b/token/src/main/java/com/networknt/oauth/token/handler/Oauth2TokenPostHandler.java index e2e6749f..94c7ed8d 100644 --- a/token/src/main/java/com/networknt/oauth/token/handler/Oauth2TokenPostHandler.java +++ b/token/src/main/java/com/networknt/oauth/token/handler/Oauth2TokenPostHandler.java @@ -333,7 +333,7 @@ private Map handlePassword(HttpServerExchange exchange, Map