Steps for Integrating Identity using OIDC

This chapter describes generic steps to integrate an identity provider with the Trillo Workbench using OIDC authorization code.

Trillo Workbench supports seamless integration with external IdPs like Okta, OneLogin, and Google, using the industry-standard OpenID Connect (OIDC) authorization code flow. This guide outlines the straightforward 3-step process to enable this integration, empowering you to leverage your existing identity systems for Trillo Workbench logins.

  1. Enter IdP settings into Trillo Workbench using UI.

  2. Map user profile returned by IdP onto Trillo Workbench user schema.

  3. Start using it for login through Trillo Workbench.

Enter IdP settings into Trillo Workbench using UI

When you register with an IdP, you will receive a number of parameters that need to be used in the application (i.e. Trillo Workbench as your application platform). These parameters are listed in the table below.

When you add an IdP to the Trillo Workbench you create a record with the following information.

  1. Name - some user friendly name for reference.

  2. Service Name - a service name that is used in the API by the client (UI).

  3. Grant type, it is set as Authorization Code.

  4. IdP and Trillo Workbench related parameters listed in the following table.

Map user profile returned by IdP onto Trillo Workbench user schema

Trillo Workbench aligns user profiles received from your IdP with its own user schema, ensuring effortless data synchronization. The intuitive nature of this mapping is clearly illustrated in the following example.

public class GoogleUserProfileMapper implements Loggable, TrilloFunction {

  public Object handle(ScriptParameter scriptParameter) {

    try {
      return _handle(scriptParameter);
    } catch (Exception e) {
      log().error("Failed", e);
      return Result.getFailedResult(e.getMessage());
    }
  }

  @SuppressWarnings("unchecked")
  private Object _handle(ScriptParameter scriptParameter) {
    Map<String, Object> idpUser = (Map<String, Object>)scriptParameter.getV();
    Map<String, Object> trilloUser = mapUserProfile(idpUser);
    return trilloUser;
  }
  
  private Map<String, Object> mapUserProfile(Map<String, Object> idpUser) {
    Map<String, Object> trilloUser = new LinkedHashMap<String, Object>();
    trilloUser.put("firstName", idpUser.get("given_name"));
    trilloUser.put("lastName", idpUser.get("family_name"));
    trilloUser.put("externalId", "" + idpUser.get("id"));
    trilloUser.put("pictureUrl", idpUser.get("picture"));
    trilloUser.put("emailAddress", idpUser.get("email"));
    return trilloUser;
 }
}

In order to make this code available to the Trillo Workbench, simply add the above function to the Trillo Workbench. (For convenience, the above function is added to the Trillo Workbench and you can view it by turning on Show system function.

Start using it for login through Trillo Workbench

Once you follow the above steps are completed, you can integrate external IdP with the login button using the following steps.

  1. Add a Button: Add button with a label such a Login Using Google Identity.

  2. Fetch IdP Url and point the browse to it: When user clicks on the login button the following actions should take place.

    • Use /_oauth2/url endpoint to get a url with a new "state" parameter (generated and recorded by the Trillo Workbench).

    • Point browser to the URL returned by the above call. This will take the user to IdP UI, which will present a login dialog to the user.

    • Once user logs in successfully, the browser will be redirected to the Trillo Workbench UI with a code. The code will be used by the Trillo Workbench to fetch the access token using the token endpoint. This will happen behind the scene and you don't have to do anything for it.

    • Sample code for the above interaction is as follows:

    Endpoint:

    POST /_oauth2/url

    Headers:

    'Content-Type':'application/json'

    Body:

    {
      appName : "auth",  // required by Trillo, its value is always "auth"
      serviceName : <serviceName given to IdP in Trillo Workbench form>   
     }

    Response:

    {
        "status": "success",
        "message": "Success",
        "data": "https://<idp url>/oidc/2/auth?response_type=code&
            client_id=<client_id of IdP>&
            redirect_uri=<WB URL>/_oauth2/callback&
            state=<a unique string generated by Trillo Workbenc>&
            scope=openid",
        "code": 200,
        "_rtag": "_r_",
        "taskStatus": "task_status_not_set",
        "failed": false,
        "detailMessage": "Success",
        "success": true
    }
    
    "data" above is the value of IdP URL for login.
  3. After obtaining access token, Trillo Workbench redirect the browser to "Post Authentication URL", which is a UI URL. This URL will have a query parameter called a_t_nonce. Using the value of this URL, the UI will invoke a API (/_oauth2/nonceLogin) of Trillo Workbench to get the access token recently acquired by the Trillo Workbench.

Endpoint:

GET /_oauth2/nonceLogin

Headers:

'Content-Type':'application/json'

Query Parameters: none

Response:

{
    "accessToken": "<value of access token recenly acquired>",
    "user" : <user profile>
}

Once the UI receives recently generated access token and the user's profile, it is logged in. It can use access token in other API calls.

Last updated