WORK IN PROGRESS
Introduction: A1-PMS Compliance with O-RAN Specifications
...
Code Block | ||||
---|---|---|---|---|
| ||||
# Create JWT header and payload !/bin/bash header='{"alg": "HS256", "typ": "JWT"}' payload='{"iss": "example_issuer", "sub": "1234567890", "aud": "myclient", "exp": 3000000000, "client_id": "myclient", "role": "user"}' # Base64 encode the header and payload without padding header_base64=$(echo -n "$header" | openssl base64 -e | tr -d '=' | tr '/+' '_-' ) payload_base64=$(echo -n "$payload" | openssl base64 -e -A | tr -d '=' | tr '/+' '_-') # Create a signature secret="your-256-bit-secretmysecret" signature_base64=$(echo -n "${header_base64}.${payload_base64}" | openssl dgst -sha256 -hmac $secret"${secret}" -binary | openssl base64 -e | tr -d '=' | tr '/+' '_-') # Combine to form the JWT jwt="${header_base64}.${payload_base64}.${signature_base64}" echo "JWT: $jwt" |
This script generates a JWT and prints it out. Replace "your-256-bit-secret" with a proper secret key.
...
Code Block | ||||
---|---|---|---|---|
| ||||
import java.util.Base64; import javaxcom.json.Json; import javax.json.google.gson.JsonObject; import javaxcom.json.JsonReader; import java.io.StringReadergoogle.gson.JsonParser; public class ParseJWT { public String parseClientIdparseServiceId(String token) { // Split token into its parts String[] chunks = token.split("\\."); Base64.Decoder decoder = Base64.getUrlDecoder(); // Decode payload String payload = new String(decoder.decode(chunks[1])); // Parse JSON using Gson JsonReader jsonReader = Json.createReader(new StringReader(payload)); JsonObject jsonObject = jsonReaderJsonParser.readObjectparseString(); jsonReader.closepayload).getAsJsonObject(); // Extract the client_id String clientId = jsonObject.getStringget("client_id").getAsString(); System.out.println("Client ID: "return + clientId); return clientId; } } |
In the create policy code check if there is an header and if there is a clientId use it as serviceId, other cases are covered having default serviceId (If there is no header, if there is an header but not a clientId)
Policy Creation Scenario
In this example I want to log the Bearer Token given to the call: PUT
In Postman I use the generated token I got from the bash script as Bearer Token:
It would be equivalent to:
Code Block | ||||
---|---|---|---|---|
| ||||
curl -v -X 'PUT' 'http://localhost:8081/a1-policy/v2/policies' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJleGFtcGxlX2lzc3VlciIsInN1YiI6IjEyMzQ1Njc4OTAiLCJhdWQiOiJteWNsaWVudCIsImV4cCI6MzAwMDAwMDAwMCwiY2xpZW50X2lkIjoibXljbGllbnQiLCJyb2xlIjoidXNlciJ9.O5QN_SWN4J1mWKyXk_-PCvOA6GF3ypv1rSdg2uTb_Ls' \
-d '
{
"ric_id": "ric1",
"policy_id": "aa8feaa88d944d919ef0e83f2172a51001",
"is_transient": true,
"service_id": "service-1",
"policy_data": {
"scope": {
"ueId": "ue5100",
"qosId": "qos5100"
},
"qosObjectives": {
"priorityLevel": 5100.0
}
},
"status_notification_uri": "http://callback-receiver:8090/callbacks/test",
"policytype_id": "1"
}' |
In org.onap.ccsdk.oran.a1policymanagementservice.controllers.v2.PolicyController
Code Block | ||||
---|---|---|---|---|
| ||||
private void logHeaders(ServerWebExchange exchange) {
HttpHeaders headers = exchange.getRequest().getHeaders();
String authHeader = headers.getFirst(HttpHeaders.AUTHORIZATION);
if (authHeader != null && authHeader.startsWith("Bearer ")) {
String token = authHeader.substring(7);
logger.info("Token: " + token);
logger.info("ServiceId: " + parseServiceId(token));
} else {
logger.info("Authorization header is missing or does not contain a Bearer token");
}
}
public String parseServiceId(String token) {
String[] chunks = token.split("\\.");
Base64.Decoder decoder = Base64.getUrlDecoder();
String payload = new String(decoder.decode(chunks[1]));
JsonObject jsonObject = JsonParser.parseString(payload).getAsJsonObject();
String clientId = jsonObject.get("client_id").getAsString();
return clientId;
} |
Output of the call:
Code Block | ||||
---|---|---|---|---|
| ||||
2024-07-30 13:32:55 2024-07-30 12:32:55.413 [INFO ] [http-nio-8081-exec-3] o.o.c.o.a.c.v.PolicyController - Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJleGFtcGxlX2lzc3VlciIsInN1YiI6IjEyMzQ1Njc4OTAiLCJhdWQiOiJteWNsaWVudCIsImV4cCI6MzAwMDAwMDAwMCwiY2xpZW50X2lkIjoibXljbGllbnQiLCJyb2xlIjoidXNlciJ9.O5QN_SWN4J1mWKyXk_-PCvOA6GF3ypv1rSdg2uTb_Ls
2024-07-30 13:32:55 2024-07-30 12:32:55.415 [INFO ] [http-nio-8081-exec-3] o.o.c.o.a.c.v.PolicyController - ServiceId: myclient |
TODO and topic to follow
- Evaluate the necessity of optional fields: Determine if certain optional fields can be removed or if their use can be better documented to avoid dead data.
- Consider adopting more specific schemas for critical operations: This can improve both the documentation and the generated code quality. Leverage OpenAPI Features: Use OpenAPI's advanced features like `allOf`,
- Prepare for code adaptations: Implement patterns like Adapter/Builder/Transformer to handle translations between similar objects, facilitating easier maintenance and adaptation to specification changes.
- Regular compliance checks.
...