Hekmil
September 24, 2021, 12:45pm
1
Hi,
I’m looking for using the okta-sdk-api to create/update/delete entities that are not represented by a method in the library.
As said in the Readme of the GitHub page :
Not every API endpoint is represented by a method in this library. You can call any Okta management API endpoint using this generic syntax:
// Create an IdP, see: https://developer.okta.com/docs/api/resources/idps#add-identity-provider
ExtensibleResource resource = client.instantiate(ExtensibleResource.class);
ExtensibleResource protocolNode = client.instantiate(ExtensibleResource.class);
protocolNode.put("type", "OAUTH");
resource.put("protocol", protocolNode);
ExtensibleResource result = client.http()
.setBody(resource)
.post("/api/v1/idps", ExtensibleResource.class);
But I’m not getting how to build the ExtensibleResource to fit in the body method. For example for a TrustedOrigins API object I’ve tried something like that but I’m getting a ERROR::HTTP 400, Okta E0000003 (The request body was not well-formed.)
error. With :
JSONObject object = toCreate.getJSONObject(i);
String name = object.getString("name");
String origin = object.getString("origin");
JSONArray scopes = object.getJSONArray("scopes");
ExtensibleResource extensibleResource = okta.instantiate(ExtensibleResource.class);
extensibleResource.put("protocol", protocolNode);
extensibleResource.put("name", name);
extensibleResource.put("origin", origin);
extensibleResource.put("scopes", scopes);
TrustedOrigin trustedOrigin = okta.http()
.setBody(extensibleResource)
.post("/api/v1/trustedOrigins", TrustedOrigin.class);
Object is a JSONObject from a parsed JSON string of a GET request from Okta.
Could you help me see more clearly how to do this please ?
Thank you
phi1ipp
September 25, 2021, 5:11pm
2
Hekmil
September 27, 2021, 9:30am
3
That’s not helping me, because creating a TrustedOrigiun object is really complexe because it’s an interface and there are a ton of function to implement.
I’m not sure how to properly do it, just an example would be enough I guess.
(I’m having the same problem when integrating the /users API because I need to user setProvider(AuthenticationProvider provider)
but I can’t build the AuthenticationProvider Object for the same reason)
phi1ipp
September 27, 2021, 12:51pm
4
what is it for in a call to trustedOrigin?
phi1ipp
September 27, 2021, 12:53pm
5
val extensibleResource: ExtensibleResource = client.instantiate(ExtensibleResource::class.java)
extensibleResource["name"] = "Test"
extensibleResource["origin"] = "https://test.com"
extensibleResource["scopes"] = listOf(
client.instantiate(ExtensibleResource::class.java).also {
it["type"] = "CORS"
},
client.instantiate(ExtensibleResource::class.java).also {
it["type"] = "REDIRECT"
}
)
val trustedOrigin: TrustedOrigin = client.http()
.setBody(extensibleResource)
.post("/api/v1/trustedOrigins", TrustedOrigin::class.java)
Hekmil
September 27, 2021, 1:19pm
6
That looks like Javascript to me right ?
Also I’ve used this :
`extensibleResource.put("protocol", protocolNode);`
Because it is what’s written inside the documenation of the sdk : https://github.com/okta/okta-sdk-java#call-other-api-endpoints
A restranscription of what you’ve done should be :
JSONObject object = toCreate.getJSONObject(i);
String name = object.getString("name");
String origin = object.getString("origin");
JSONArray scopes = object.getJSONArray("scopes");
List<String> scopeList = new ArrayList<>();
for (int j = 0; j < scopes.length(); j++) {
scopeList.add(scopes.get(j).toString());
}
ExtensibleResource extensibleResource = okta.instantiate(ExtensibleResource.class);
extensibleResource.put("name", name);
extensibleResource.put("origin", origin);
extensibleResource.put("scopes", scopeList);
TrustedOrigin trustedOrigin = okta.http()
.setBody(extensibleResource)
.post("/api/v1/trustedOrigins", TrustedOrigin.class);
But I already tried this without success
phi1ipp
September 27, 2021, 1:53pm
7
for API call you should consult Okta API documentation, which tells what the request to /trustedOrigins
should look like.
your transcription is wrong, as my example shows that scopes
is an array of ExtensibleResource objects
Hekmil
September 27, 2021, 2:46pm
8
Are you saying something like that ?
JSONArray scopes = object.getJSONArray("scopes");
ArrayList<ExtensibleResource> scopeList = new ArrayList<>();
for (int j = 0; j < scopes.length(); j++) {
ExtensibleResource scope = okta.instantiate(ExtensibleResource.class);
scope.put("type", scopes.get(j));
scopeList.add(scope);
}
ExtensibleResource extensibleResource = okta.instantiate(ExtensibleResource.class);
extensibleResource.put("name", name);
extensibleResource.put("origin", origin);
extensibleResource.put("scopes", scopeList);
TrustedOrigin trustedOrigin = okta.http()
.setBody(extensibleResource)
.post("/api/v1/trustedOrigins", TrustedOrigin.class);
I’m getting the same error here. Building a JSON payload is way easier that this, or I’m not getting something obvious ?
phi1ipp
September 27, 2021, 2:52pm
9
what is the type of scopes.get(j)
in your code fragment? is it a String? Try to hard code, instead of extracting from JSONArray
and see if it’s the issue
Hekmil
September 27, 2021, 3:14pm
10
Ok you were right, hardcoding allowed me to find the issue. The use of a JSONObject caused the problem.
So now I’m converting my JSONObject to a Map to build my payload and it works now !
JSONArray scopes = object.getJSONArray("scopes");
ArrayList<ExtensibleResource> scopeList = new ArrayList<>();
for (int j = 0; j < scopes.length(); j++) {
HashMap<String, Object> scopeMap = new Gson().fromJson(scopes.getJSONObject(j).toString(), HashMap.class);
scopeMap.forEach((key, value) -> {
ExtensibleResource scope = okta.instantiate(ExtensibleResource.class);
scope.put(key,value);
scopeList.add(scope);
});
}
ExtensibleResource extensibleResource = okta.instantiate(ExtensibleResource.class);
extensibleResource.put("name", name);
extensibleResource.put("origin", origin);
extensibleResource.put("scopes", scopeList);
TrustedOrigin trustedOrigin = okta.http()
.setBody(extensibleResource)
.post("/api/v1/trustedOrigins", TrustedOrigin.class);
Thank you !
1 Like