[keycloak-user] Jaxrs Client Example?

Peter Donald peter at realityforge.org
Mon May 22 21:56:27 EDT 2017


Great - thanks. Got it working with a combination of your code and the
admin-client code.

For anyone who wants to do this in future - I just pushed the code to
maven central.

See

https://github.com/realityforge/keycloak-jaxrs-client-authfilter


Thanks again Thomas!


On Mon, May 22, 2017 at 10:13 PM, Thomas Darimont
<thomas.darimont at googlemail.com> wrote:
> Hello Peter,
>
> have a look at the example below.
> The following example obtains an access token from the /token endpoint and
> uses it to call the /userinfo endpoint
> with the access token in the Authorization header. In real Keycloak
> integrations one would use the access token
> which is maintained by the Keycloak adapter via the KeycloakSecurityContext.
>
> HTH.
>
> Cheers,
> Thomas
>
> import javax.ws.rs.client.Client;
> import javax.ws.rs.client.ClientBuilder;
> import javax.ws.rs.client.ClientRequestContext;
> import javax.ws.rs.client.ClientRequestFilter;
> import javax.ws.rs.client.Entity;
> import javax.ws.rs.client.WebTarget;
> import javax.ws.rs.core.Form;
> import javax.ws.rs.core.MediaType;
> import javax.ws.rs.core.Response;
> import javax.ws.rs.core.UriBuilder;
> import java.io.IOException;
> import java.util.Map;
> import java.util.concurrent.Future;
> import java.util.function.Supplier;
>
> public class JaxRsKeycloakClientExample {
>
>   public static void main(String[] args) throws Exception {
>
>     String realmName = "token-test";
>     String tokenPath = "/protocol/openid-connect/token";
>     String userInfoPath = "/protocol/openid-connect/userinfo";
>
>     String authServerBaseUrl = "http://localhost:8081/auth/realms";
>
>     /* Dummy accessToken provider - in real Keycloak integrations you'd
> extract the current AccessToken
>      * from the KeycloakSecurity context which is accessible via:
>      *
> httpServletRequest.getAttribute(KeycloakSecurityContext.class.getName());
>      * or
>      *
> httpServletRequest.getSession().getAttribute(KeycloakSecurityContext.class.getName());
>      *
>      *   then do KeycloakSecurityContext#getTokenString()
>      */
>     Supplier<String> accessTokenProvider = () -> {
>
>       Client keycloakClient = ClientBuilder.newBuilder().build();
>       WebTarget target =
> keycloakClient.target(UriBuilder.fromUri(authServerBaseUrl).path(realmName).path(tokenPath).build());
>
>       Form getTokenForm = new Form() //
>         .param("client_id", "admin-cli") //
>         .param("client_secret", "") //
>         .param("username", "tester") //
>         .param("password", "test") //
>         .param("grant_type", "password") //
>         ;
>
>       Future<Map> response =
> target.request(MediaType.APPLICATION_FORM_URLENCODED) //
>         .accept(MediaType.APPLICATION_JSON_TYPE) //
>         .buildPost(Entity.form(getTokenForm)) //
>         .submit(Map.class);
>
>       try {
>         Map map = response.get();
>
>         return String.valueOf(map.get("access_token"));
>       } catch (Exception e) {
>         throw new RuntimeException(e);
>       }
>     };
>
>     Client client = ClientBuilder.newBuilder().build();
>     client.register(new KeycloakAuthRequestFilter(accessTokenProvider));
>
>     //Call UserInfo endpoint with AccessToken in Authorization Header
>     WebTarget target =
> client.target(UriBuilder.fromUri(authServerBaseUrl).path(realmName).path(userInfoPath).build());
>     Response response =
> target.request().accept(MediaType.APPLICATION_JSON_TYPE).get();
>
>     System.out.println(response.readEntity(Map.class));
>   }
>
>   public static class KeycloakAuthRequestFilter implements
> ClientRequestFilter {
>
>     private final Supplier<String> accessTokenProvider;
>
>     public KeycloakAuthRequestFilter(Supplier<String> accessTokenProvider) {
>       this.accessTokenProvider = accessTokenProvider;
>     }
>
>     @Override
>     public void filter(ClientRequestContext requestContext) throws
> IOException {
>       requestContext.getHeaders().putSingle("Authorization", "Bearer " +
> accessTokenProvider.get());
>     }
>   }
> }
>
> 2017-05-22 8:14 GMT+02:00 Peter Donald <peter at realityforge.org>:
>>
>> Hi,
>>
>> This is a really dumb question and I have tried to google+RTFM but
>> still can't seem to find the answer.
>>
>> I am looking for a simple example where I can use a jaxrs client to
>> access a service protected by keycloak. I have only really found
>> references to admin-client which seems to be more about admin of
>> keycloak and the JaxrsBearerTokenFilterImpl which seems like it may
>> work but can't find an example where it is used or how I would go
>> about it.
>>
>> Preferably I would like to do a .register( X ) when creating the jaxrs
>> client and have it handled automagically by a filter. I don't have
>> resteasy available atm if that makes a difference.
>>
>> Any hints on where to figure this out?
>>
>> --
>> Cheers,
>>
>> Peter Donald
>> _______________________________________________
>> keycloak-user mailing list
>> keycloak-user at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/keycloak-user
>
>



-- 
Cheers,

Peter Donald


More information about the keycloak-user mailing list