JsonFileRegisteredClientService now writes out entire client registration to disk, closes #651

pull/653/head
Justin Richer 2014-08-01 00:01:56 -04:00
parent 78f3e68e8b
commit b0cce924a2
3 changed files with 32 additions and 41 deletions

View File

@ -199,19 +199,25 @@ public class DynamicRegistrationClientConfigurationService implements ClientConf
return client; return client;
} else { } else {
// load this client's information from the server if (knownClient.getClientId() == null) {
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", String.format("%s %s", OAuth2AccessToken.BEARER_TYPE, knownClient.getRegistrationAccessToken())); // load this client's information from the server
headers.setAccept(Lists.newArrayList(MediaType.APPLICATION_JSON)); HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", String.format("%s %s", OAuth2AccessToken.BEARER_TYPE, knownClient.getRegistrationAccessToken()));
HttpEntity<String> entity = new HttpEntity<String>(headers); headers.setAccept(Lists.newArrayList(MediaType.APPLICATION_JSON));
String registered = restTemplate.exchange(knownClient.getRegistrationClientUri(), HttpMethod.GET, entity, String.class).getBody(); HttpEntity<String> entity = new HttpEntity<String>(headers);
// TODO: handle HTTP errors
String registered = restTemplate.exchange(knownClient.getRegistrationClientUri(), HttpMethod.GET, entity, String.class).getBody();
RegisteredClient client = ClientDetailsEntityJsonProcessor.parseRegistered(registered); // TODO: handle HTTP errors
return client; RegisteredClient client = ClientDetailsEntityJsonProcessor.parseRegistered(registered);
return client;
} else {
// it's got a client ID from the store, don't bother trying to load it
return knownClient;
}
} }
} }

View File

@ -25,11 +25,11 @@ import java.io.FileReader;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.mitre.oauth2.model.RegisteredClient; import org.mitre.oauth2.model.RegisteredClient;
import org.mitre.openid.connect.ClientDetailsEntityJsonProcessor;
import org.mitre.openid.connect.client.service.RegisteredClientService; import org.mitre.openid.connect.client.service.RegisteredClientService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -40,7 +40,6 @@ import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer; import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException; import com.google.gson.JsonParseException;
import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer; import com.google.gson.JsonSerializer;
@ -57,38 +56,16 @@ public class JsonFileRegisteredClientService implements RegisteredClientService
.registerTypeAdapter(RegisteredClient.class, new JsonSerializer<RegisteredClient>() { .registerTypeAdapter(RegisteredClient.class, new JsonSerializer<RegisteredClient>() {
@Override @Override
public JsonElement serialize(RegisteredClient src, Type typeOfSrc, JsonSerializationContext context) { public JsonElement serialize(RegisteredClient src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject obj = new JsonObject(); return ClientDetailsEntityJsonProcessor.serialize(src);
obj.addProperty("token", src.getRegistrationAccessToken());
obj.addProperty("uri", src.getRegistrationClientUri());
if (src.getClientIdIssuedAt() != null) {
obj.addProperty("issued", src.getClientIdIssuedAt().getTime());
}
if (src.getClientSecretExpiresAt() != null) {
obj.addProperty("expires", src.getClientSecretExpiresAt().getTime());
}
return obj;
} }
}) })
.registerTypeAdapter(RegisteredClient.class, new JsonDeserializer<RegisteredClient>() { .registerTypeAdapter(RegisteredClient.class, new JsonDeserializer<RegisteredClient>() {
@Override @Override
public RegisteredClient deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { public RegisteredClient deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json.isJsonObject()) { return ClientDetailsEntityJsonProcessor.parseRegistered(json);
JsonObject src = json.getAsJsonObject();
RegisteredClient rc = new RegisteredClient();
rc.setRegistrationAccessToken(src.get("token").getAsString());
rc.setRegistrationClientUri(src.get("uri").getAsString());
if (src.has("issued") && !src.get("issued").isJsonNull()) {
rc.setClientIdIssuedAt(new Date(src.get("issued").getAsLong()));
}
if (src.has("expires") && !src.get("expires").isJsonNull()) {
rc.setClientSecretExpiresAt(new Date(src.get("expires").getAsLong()));
}
return rc;
} else {
return null;
}
} }
}) })
.setPrettyPrinting()
.create(); .create();
private File file; private File file;

View File

@ -58,6 +58,10 @@ public class ClientDetailsEntityJsonProcessor {
*/ */
public static ClientDetailsEntity parse(String jsonString) { public static ClientDetailsEntity parse(String jsonString) {
JsonElement jsonEl = parser.parse(jsonString); JsonElement jsonEl = parser.parse(jsonString);
return parse(jsonEl);
}
public static ClientDetailsEntity parse(JsonElement jsonEl) {
if (jsonEl.isJsonObject()) { if (jsonEl.isJsonObject()) {
JsonObject o = jsonEl.getAsJsonObject(); JsonObject o = jsonEl.getAsJsonObject();
@ -149,10 +153,14 @@ public class ClientDetailsEntityJsonProcessor {
JsonElement jsonEl = parser.parse(jsonString); JsonElement jsonEl = parser.parse(jsonString);
return parseRegistered(jsonEl);
}
public static RegisteredClient parseRegistered(JsonElement jsonEl) {
if (jsonEl.isJsonObject()) { if (jsonEl.isJsonObject()) {
JsonObject o = jsonEl.getAsJsonObject(); JsonObject o = jsonEl.getAsJsonObject();
ClientDetailsEntity c = parse(jsonString); ClientDetailsEntity c = parse(jsonEl);
RegisteredClient rc = new RegisteredClient(c); RegisteredClient rc = new RegisteredClient(c);
// get any fields from the registration // get any fields from the registration