Fetch access token from the EGL RUI

This section explains how to securely fetch an access token (JWT) from Keycloak using EGL REST in an EGL Rich UI (RUI) application.

package pkg.keycloak;
interface KeycloakAccessToken
      function getAccessToken(req KeycloakReqPayload in) returns (KeycloakResponse)
      {@PostRest {uriTemplate="", requestFormat=FORMDATA, responseFormat=JSON, summary = ""}}; 
end
Note:
Here, the requestFormat must be set to FORMDATA.
package pkg.keycloak;
record KeycloakReqPayload
       client_id string;
       grant_type string;
       password string;
       username string;
       refresh_token string;
end

package pkg.keycloak;
Record KeycloakResponse type Basicrecord
       access_token string;
       expires_in int;
       refresh_expires_in int;
       refresh_token string;
       token_type string;
       notBeforePolicy int {JSONName = "not-before-policy"};
       session_state string;
       scope string;
end      

At Handler1

keycloakAccessToken KeycloakAccessToken {@RestBinding {baseURI="http://localhost:8180//realms/jakarta-servlet-jwt/protocol/openid-connect/token"} };
username BSTextField{ layoutData = new GridLayoutData{ row = 2, column = 2 },
placeholder = "Enter User Name",
fieldType = BSLib.FIELD_TYPE_TEXT};
password BSTextField{ layoutData = new GridLayoutData{ row = 3, column = 2 },
placeholder = "Enter Password",
fieldType = BSLib.FIELD_TYPE_PASSWORD};
login BSButton{ layoutData = new GridLayoutData{ row = 4, column = 2 }, text = "Login", colorType=BSLib.COLOR_TYPE_PRIMARY, onClick ::= ui_onClick };
function ui_onClick(event Event in)
keycloakReqBody KeycloakReqPayload;
keycloakReqBody.client_id = "demo-jwt"; // this value is keycloak client-id
keycloakReqBody.grant_type = "password"; // this value should be “password” 
keycloakReqBody.username = username.value; // user name which is created at keycloak for particular client-id
keycloakReqBody.password = password.value; //// user password which is created at keycloak for particular client-id
call keycloakAccessToken.getAccessToken(keycloakReqBody) returning to resp onException servicelib.serviceExceptionHandler;
end
function resp(retResult KeycloakResponse in)
json string = ServiceLib.convertToJSON(retResult);
RUILib.setBrowserLocalStorage("keycloak_token", json);
end
Note:
This resp() function is important as you need to store the token in the local storage for further communications.
service1 service1 {@restBinding {baseUri="http://localhost:8181/sso-keycloak-rest-api/restservices/secured/service1"}};
function BSButton_service1_onClick(event Event in)
requestHeader dictionary = prepareBearerAuthHeader(requestHeader);
ServiceLib.setRestRequestHeaders(service1, requestHeader);
call service1.functionName() returning to resp1 onException noHandlerFound;
end
function resp1(retResult string in)
SysLib.writeStdout(retResult);
end
function prepareBearerAuthHeader(requestHeader0 dictionary in) returns (dictionary)
keycloak_token String = RUILib.getBrowserLocalStorage("keycloak_token");
keycloakResponse KeycloakResponse;
ServiceLib.convertFromJSON(keycloak_token, keycloakResponse);
requestHeader Dictionary{
Authorization = "Bearer "+keycloakResponse.access_token
};
requestHeader.insertAll(requestHeader);
requestHeader0 = requestHeader;
return (requestHeader0);
end
keycloakLogout KeycloakLogout {@RestBinding {baseURI="http://localhost:8180//realms/jakarta-servlet-jwt/protocol/openid-connect/logout"} };
logout BSButton{ layoutData = new GridLayoutData{ row = 4, column = 3 }, text = "Logout", colorType=BSLib.COLOR_TYPE_PRIMARY, onClick ::= logout_onClick };

function logout_onClick(event Event in)
keycloak_token String = RUILib.getBrowserLocalStorage("keycloak_token");
keycloakResponse KeycloakResponse;
ServiceLib.convertFromJSON(keycloak_token, keycloakResponse);
keycloakReqBody KeycloakReqPayload;
keycloakReqBody.client_id = "demo-jwt";
keycloakReqBody.refresh_token = keycloakResponse.refresh_token;
call keycloakLogout.logout(keycloakReqBody) returning to resp0 onException noHandlerFound;
end
function resp0()
SysLib.writeStdout("logged out");
RUILib.removeBrowserLocalStorage("keycloak_token");
end