Announcing the Saviynt Knowledge Exchange unifying the Saviynt forums, documentation, training,
and more in a single search tool across platforms. Read the announcement here.
100% helpful (1/1)
Vedanth_BK
Saviynt Employee
Saviynt Employee

Disclaimer

The integration was either created by Saviynt or by Saviynt community users. The integration is available “as is” and falls under standard connectors support for REST, SOAP, JDBC, LDAP, PowerShell, Jar, and Saviynt Connector Framework.

 

Preface

This guide describes the integration between Saviynt Enterprise Identity Cloud (EIC) and Blackline.

Audience

This guide is intended for administrators and target application integration teams responsible for implementing a secure integration service with Blackline.

Introduction

BlackLine’s cloud-based financial operations management platform and market-leading customer service help companies move to modern accounting by unifying their data and processes, automating repetitive work, and driving accountability through visibility. BlackLine provides solutions to manage and automate financial close, accounts receivable, and intercompany accounting processes, helping large enterprises and midsize companies across all industries do accounting work better, faster and with more control

The Blackline connector enables you to seamlessly integrate with Blackline to manage user lifecycle and govern access to their Teams, Entities, and Roles.

For more information about different connectors in EIC, see  Saviynt Enterprise Identity Cloud Connectors.

Note: This guide provides information about using the Blackline REST connector using REST API for performing operations listed in the Supported Features.

Supported Features

The Blackline integration supports the following features:

 
blackline_features.png
Note :
 The mapping for roles by product is performed using a CSV file containing the metadata.

Supported Software Versions

 

Software

Version

EIC

Release v4.5 and later

 

Understanding the Integration between EIC and Blackline

You must create an integration between EIC and the collaboration platform hosted by the target application to perform import, provisioning, and de-provisioning tasks. The following components are involved in the integration:

  • The Complete Service Management platform Blackline combines ITSM with ESM and SIAM capabilities, enabling all internal departments, such as IT, HR, and Facilities, as well as external service providers and customers, to collaborate securely and seamlessly on one complete platform, reducing complexity and improving productivity.

  • Objects are imported as entitlement types into EIC.

  • Security System represents the connection between EIC and the target application.

    • It comprises an endpoint, which is the target application for which you want EIC to manage the identity repository.

    • It provides application instance abstraction from connectivity including high-level metadata. For more information about creating a security system, see Creating a Security System.

  • Endpoint is an instance of an application within the context of a security system.

    • It is the target application or application from which the connector imports the data and performs provisioning or de-provisioning of identity objects, such as users, accounts, and entitlements.

    • It is mandatory to create an endpoint after creating the security system.
      You can associate a single security system with multiple endpoints if the deployment involves modeling multiple isolated virtual applications (based on sets of specific entitlements according to certain categories) within a single application instance. For more information about creating an endpoint, see Creating an Endpoint for the Security System.

  • The connector is a software component that enables communication between EIC and the target application. It provides a simplified integration mechanism where in some instances you only need to create a connection with minimal connectivity information for your target application. The REST connector is used for importing, provisioning accounts, and accessing through the REST APIs. For more information about creating a connection, see Creating a Connection.

  • Job Scheduler is a software component that executes a job based on the configured schedule to perform import or provisioning operations from EIC.
    When a provisioning job is triggered, it creates provisioning tasks in EIC. When these tasks are completed, the provisioning action is performed on the target application through the configured connector. If you want to instantly provision requests for completing the tasks without running the provisioning job, you must enable Instant Provisioning at the security system level and the Instant Provisioning Tasks global configuration. For more information about the jobs used by the connectors in the Blackline integration.

Integration Architecture

EIC uses a REST connection for integrating with Blackline for importing data and for performing provisioning and de-provisioning tasks.

The following diagram illustrates the integration architecture and communication with the target application.

 

blackline_diagram.png

 

Setting Up the Integration

Prerequisites

  • To get access to the Blackline application, please reach out to the Blackline application team for an API Installation form.

  • The application Team will provide the credentials once the below form is submitted.

newblackline prereq.png

 

Creating a Connection

Connection refers to the configuration setup for connecting EIC to target applications. For more information about the procedure to create a connection, see Creating a Connection.

Understanding the Configuration Parameters

While creating a connection, you must specify connection parameters that the connector uses to connect with the target application, define the type of operations to perform, the target application objects against which those operations are performed, and the frequency of performing them. In addition, you can view and edit attribute mappings between EIC and the target application, predefined correlation rules, and provisioning jobs and import jobs.

Configuration Parameters for Account and Access Import

The connector uses the following parameters for creating a connection and for importing account and access from the target application:

Connection Parameters
 

Parameter

Description

Example Configuration

Mandatory?

 

 

Connection Name 

Specify the name to identify the connection.

-

Yes

 

 

Connection Description

Specify the description for the connection.

-

No

 

 

Connection Type

  • Select the connection type as “Blackline (REST)”

  • If the “Blackline (REST) connection type is not present in your tenant then import the connection package using T2P

  • You can also create a new connection with type “REST” and use the JSONS specified in this document.

-

Yes

 

 

Default SAV Role 

Specify this parameter to assign the SAV role for the connection.

The SAV role is a role in EIC that assigns specific access to users.

This parameter is valid only for importing users.

Sample value: User assigned with the ROLE_ADMIN role, has access to all the sections of EIC.

-

No

 

 

Email Template

Specify this parameter to select an email template for sending notifications.

Email templates provide immediate trigger of emails to a user based on actions performed. Email informs user about the action performed and if critical, needs immediate action from the user.

-

No

 

 

ConnectionJSON

Specify this parameter to create a connection.

 

Note: Update TOKEN as per your Blackline details.

Use the following format to connect to the Blackline application:

 
{
"authentications": {
"accAuth": {
"authType": "oauth2",
"url": "@@HOST_URL@@/connect/token",
"httpMethod": "POST",
"httpParams": {
"client_id": "@@CLIENT_ID@@",
"grant_type": "password",
"client_secret": "@@CLIENT_SECRET@@",
"scope": "@@SCOPE@@",
"username": "@@USERNAME@@",
"password": "@@PASSWORD@@"
},
"httpHeaders": {
"Content-Type": "application/x-www-form-urlencoded"
},
"httpContentType": "application/x-www-form-urlencoded",
"expiryError": "ExpiredAuthenticationToken",
"authError": [
"USER_AUTHENTICATION_FAILED",
"PARTNER_AUTHENTICATION_FAILED",
"AuthenticationFailed"
],
"refreshType": "RefreshToken",
"refreshTokenResponsePath": "refresh_token",
"refreshToken": "<refresh token>",
"timeOutError": "Read timed out",
"errorPath": "errorCode",
"maxRefreshTryCount": 5,
"tokenResponsePath": "access_token",
"tokenType": "Bearer",
"retryFailureStatusCode": [
401
],
"accessToken": "Bearer abcd"
}
}
}

 

 

Yes

 
Import Parameters
 

Parameter

Description

 

Recommended Configuration

Mandatory?

AccountEntImport JSON

Specify this parameter to reconcile the accounts and entitlements

Use the following format to import accounts and entitlements using the Blackline application:

 
{
"accountParams": {
"unsuccessResponses": {
"message": "",
"response": "",
"statusCode": [
null,
400,
401,
403,
404,
405,
409,
429,
500,
503
]
},
"includeExistingInActiveAccounts": true,
"doNotChangeIfFailed": true,
"connection": "accAuth",
"processingType": "SequentialAndIterative",
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "@@HOST_URL@@/v1/users?pageSize=10000&filter=isActive%20eq%20true",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"keyField": "name",
"colsToPropsMap": {
"status": "isActive~#~char",
"name": "loginId~#~char",
"accountID": "id~#~char",
"displayName": "fullName~#~char",
"customproperty1": "email~#~char",
"customproperty2": "isActive~#~bool",
"customproperty3": "defaultRoleId~#~char",
"customproperty4": "id~#~char",
"customproperty5": "annualHours~#~char",
"customproperty6": "jobTitle~#~char",
"customproperty7": "phoneNumber~#~char",
"customproperty8": "referenceField1~#~char",
"customproperty9": "referenceField2~#~char",
"customproperty10": "referenceField3~#~char",
"customproperty11": "supervisor~#~char",
"customproperty12": "timeZoneId~#~char",
"customproperty13": "allowUserMentions~#~bool"
}
}
}
},
"entitlementParams": {
"connection": "accAuth",
"doNotChangeIfFailed": true,
"processingType": "SequentialAndIterative",
"entTypes": {
"Roles and Products": {
"entTypeOrder": 0,
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "@@HOST_URL@@/v1/roles",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"keyField": "entitlementID",
"colsToPropsMap": {
"entitlementID": "id~#~char",
"entitlement_value": "name~#~char"
}
}
}
},
"Teams": {
"entTypeOrder": 1,
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "@@HOST_URL@@/v1/teams",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"keyField": "entitlementID",
"colsToPropsMap": {
"entitlementID": "id~#~char",
"entitlement_value": "name~#~char",
"customproperty1": "uniqueCode~#~char"
}
}
}
},
"Entities": {
"entTypeOrder": 2,
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "@@HOST_URL@@/v1/mdm/entities",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"keyField": "entitlementID",
"colsToPropsMap": {
"entitlementID": "id~#~char",
"entitlement_value": "name~#~char",
"customproperty1": "uniqueCode~#~char"
}
}
}
}
}
},
"acctEntParams": {
"connection": "accAuth",
"entTypes": {
"Teams": {
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"processingType": "httpAcctToEnt",
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "@@HOST_URL@@/v1/users/${id}/teams",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"entKeyField": "entitlementID",
"entIdPath": "id",
"acctKeyField": "accountID"
}
}
},
"Entities": {
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"processingType": "httpAcctToEnt",
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "@@HOST_URL@@/v1/users/${id}/entities",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"entKeyField": "entitlement_value",
"entIdPath": "name",
"acctKeyField": "accountID"
}
}
}
}
}
}

 

Yes

 
Configuration Parameter for Provisioning
 

Parameter

Description

 

Recommended Configuration

Support for Binding Variables?

Support for Java Ternary Operations?

CreateAccountJSON

Specify this parameter to create an account in the target application.

 

Use the following format to create accounts using the Blackline application:

 
{
"accountIdPath": "call1.message.id",
"call": [
{
"name": "call1",
"connection": "accAuth",
"url": "@@HOST_URL@@/v1/users",
"httpMethod": "POST",
"httpParams": "{ \"loginId\":\"${user?.email}\",\"firstName\":\"${user?.firstname}\",\"lastName\":\"${user?.lastname}\",\"email\":\"${user?.email}\",\"isActive\":false,\"allowUserMentions\":true,\"allowUserToEditJournalConfig\":true,\"allowUserToEditIntercompanyConfig\":true,\"allowAdhocMatching\":true,\"allowIntercompanySettlement\":true,\"requiresJournalReviewer\":true,\"jobTitle\":\"${user?.title}\",\"timeZoneId\":11,\"phoneNumber\":\"${user?.phonenumber}\",\"referenceField2\":\"${requestAccessAttributes.Teams}\"}",
"httpHeaders": {
"Content-Type": "application/json",
"Authorization": "${access_token}"
},
"httpContentType": "application/json",
"successResponses": {
"statusCode": [
200,
201
]
}
}
]
}

The bindings supported are:

  • ServiceAccountOwnerMap

  • endpoints

  • accountName

  • userManager

  • approvers

  • arsTasks/task

  • managerAccount

  • password

  • requestid

  • response

  • connection

  • userAccount

  • requestAccessAttributes/reqAttrs

  • businessJustification

  • user

Yes

Update Account JSON

Specify this parameter to update an account in the target application.

Use the following format to update accounts using the Blackline application:

 {
"accountIdPath": "accountName",
"call": [
{
"name": "call1",
"connection": "accAuth",
"url": "@@HOST_URL@@/v1/users",
"httpMethod": "POST",
"httpParams": "{ \"loginId\":\"${user?.email}\",\"firstName\":\"${user?.firstname}\",\"lastName\":\"${user?.lastname}\",\"email\":\"${user?.email}\",\"isActive\":true,\"allowUserMentions\":true,\"allowUserToEditJournalConfig\":true,\"allowUserToEditIntercompanyConfig\":true,\"allowAdhocMatching\":true,\"allowIntercompanySettlement\":true,\"requiresJournalReviewer\":true,\"jobTitle\":\"${user?.title}\",\"timeZoneId\":11,\"phoneNumber\":\"6162276245\"}",
"httpHeaders": {
"Content-Type": "application/json",
"Authorization": "${access_token}"
},
"httpContentType": "application/json",
"successResponses": {
"statusCode": [
200,
201
]
}
}
]
}

The bindings supported are:

  • ServiceAccountOwnerMap

  • endpoints

  • accountName

  • userManager

  • approvers

  • arsTasks/task

  • managerAccount

  • password

  • requestid

  • response

  • connection

  • userAccount

  • requestAccessAttributes/reqAttrs

  • businessJustification

  • user

Yes

AddAccessJSON

Specify this parameter to add access to an account.

 

Use the following format to add access using the Blackline application:

 
{
"call": [
{
"name": "Entities",
"connection": "accAuth",
"url": "@@HOST_URL@@/v1/users/${account.accountID}/entities",
"httpMethod": "POST",
"httpHeaders": {
"Authorization": "${access_token}",
"Content-Type": "application/json"
},
"httpContentType": "application/json",
"httpParams": "[${entitlementValue.entitlementID}]",
"successResponses": {
"statusCode": [
200,
201,
204
]
}
},
{
"name": "Teams",
"connection": "accAuth",
"url": "@@HOST_URL@@/v1/users/${account.accountID}/teams",
"httpMethod": "POST",
"httpHeaders": {
"Authorization": "${access_token}",
"Content-Type": "application/json"
},
"httpContentType": "application/json",
"httpParams": "[${entitlementValue.entitlementID}]",
"successResponses": {
"statusCode": [
200,
201,
204
]
}
},
{
"name": "Roles and Products",
"connection": "accAuth",
"url": "@@HOST_URL@@/v1/users/${account.accountID}/roles-products",
"httpMethod": "POST",
"httpHeaders": {
"Authorization": "${access_token}",
"Content-Type": "application/json"
},
"httpContentType": "application/json",
"httpParams": "[{\"roleId\": ${entitlementValue.customproperty2},\"productId\": \"${entitlementValue.customproperty1}\"}]",
"successResponses": {
"statusCode": [
200,
201,
204
]
}
}
]
}

The bindings supported are:

  • ServiceAccountOwnerMap

  • endpoints

  • accountName

  • userManager

  • approvers

  • arsTasks/task

  • managerAccount

  • password

  • requestid

  • response

  • connection

  • userAccount

  • requestAccessAttributes/reqAttrs

  • businessJustification

  • user

Yes

RemoveAccessJSON

Specify this parameter to remove access from an account.

Use the following format to remove access using the Blackline application:

{
"call": [
{
"name": "Teams",
"connection": "accAuth",
"url": "@@HOST_URL@@/v1/users/${account.accountID}/teams/${entitlementValue.entitlementID}",
"httpMethod": "DELETE",
"httpHeaders": {
"Authorization": "${access_token}",
"Content-Type": "application/json"
},
"httpContentType": "application/json",
"successResponses": {
"statusCode": [
200,
201,
204
]
}
},
{
"name": "Roles and Products",
"connection": "accAuth",
"url": "@@HOST_URL@@/v1/users/${account.accountID}/roles-products?roleId=${entitlementValue.customproperty2}&productId=${entitlementValue.customproperty1}",

"httpMethod": "DELETE",
"httpHeaders": {
"Authorization": "${access_token}",
"Content-Type": "application/json"
},
"httpContentType": "application/json",
"successResponses": {
"statusCode": [
200,
201,
204
]
}
},
{
"name": "Entities",
"connection": "accAuth",
"url": "@@HOST_URL@@/v1/users/${account.accountID}/entities/${entitlementValue.entitlementID}",
"httpMethod": "DELETE",
"httpHeaders": {
"Authorization": "${access_token}",
"Content-Type": "application/json"
},
"httpContentType": "application/json",
"successResponses": {
"statusCode": [
200,
201,
204
]
}
}
]
}
  • ServiceAccountOwnerMap

  • endpoints

  • accountName

  • userManager

  • approvers

  • arsTasks/task

  • managerAccount

  • password

  • requestid

  • response

  • connection

  • userAccount

  • requestAccessAttributes/reqAttrs

  • businessJustification

  • user

Yes

DisableAccountJSON

Specify this parameter to Disable an account in the target application.

Use the following format to disable accounts 

{
"call": [
{
"name": "call1",
"connection": "accAuth",
"url": "@@HOST_URL@@/v1/users/${account.accountID}/entities",
"httpMethod": "GET",
"httpHeaders": {
"Authorization": "${access_token}",
"Accept": "application/json"
},
"httpContentType": "application/json",
"successResponses": {
"statusCode": [
200,
201
]
}
},
{
"name": "call2",
"connection": "accAuth",
"url": "@@HOST_URL@@/v1/users/${account.accountID}/entities/${childresponse.id}",
"httpMethod": "DELETE",
"httpHeaders": {
"Authorization": "${access_token}",
"Content-Type": "application/json"
},
"httpContentType": "application/json",
"callCondition": "${response.call1.message.items.size()>0}",
"callListPath": "response.call1.message.items",
"successResponses": {
"statusCode": [
200,
201,
204
]
}
}
]
}

 

The bindings supported are:

  • ServiceAccountOwnerMap

  • endpoints

  • accountName

  • userManager

  • approvers

  • arsTasks/task

  • managerAccount

  • password

  • requestid

  • response

  • connection

  • userAccount

  • requestAccessAttributes/reqAttrs

  • businessJustification

  • user

Yes

RemoveAccountJSON

Specify this parameter to remove an account. 

 

Use the following format to remove an account using the Blackline application:

 
{
"call": [
{
"name": "call1",
"connection": "accAuth",
"url": "@@HOST_URL@@/v1/users/${account.accountID}/entities",
"httpMethod": "GET",
"httpHeaders": {
"Authorization": "${access_token}",
"Accept": "application/json"
},
"httpContentType": "application/json",
"successResponses": {
"statusCode": [
200,
201
]
}
},
{
"name": "call2",
"connection": "accAuth",
"url": "@@HOST_URL@@/v1/users/${account.accountID}/entities/${childresponse.id}",
"httpMethod": "DELETE",
"httpHeaders": {
"Authorization": "${access_token}",
"Content-Type": "application/json"
},
"httpContentType": "application/json",
"callCondition": "${response.call1.message.items.size()>0}",
"callListPath": "response.call1.message.items",
"successResponses": {
"statusCode": [
200,
201,
204
]
}
}
]
}

The bindings supported are:

  • ServiceAccountOwnerMap

  • endpoints

  • accountName

  • userManager

  • approvers

  • arsTasks/task

  • managerAccount

  • password

  • requestid

  • response

  • connection

  • userAccount

  • requestAccessAttributes/reqAttrs

  • businessJustification

  • user

Yes

 


Importing Connection Package

connection package helps you build the connection with pre-defined JSONs, this can be used if your tenant does not already have out-of-the-box connection templates available. Here are the steps to import the Blackline connection package.

 

  • Navigate to Admin → Transport → select Import Package.

  • Browse the downloaded package and Import.

  • Navigate to Admin → Connections → Select “Blackline ” Connection.

  • Edit the connection with your Blackline tenant details.

Creating a Security System

The security system represents the connection between EIC and the target application. For more information on creating a security system, see Creating a Security System.

Creating an Endpoint for the Security System

Endpoint refers to the target application used to provision accounts and entitlements (access). For more information on creating an endpoint, see Creating Endpoints.

Using the Blackline Integration

You can use the Blackline integration for performing import and provisioning operations after configuring it to meet your requirements. 

Guidelines for Using the Integration

You must apply the following guidelines for configuring import: 

  • Run the account import before running the access import.

  • Map all Blackline attributes to EIC account attributes using ImportAccountEntJSON.

You must apply the following guidelines for configuring provisioning:

  • Use Java ternary operators if you want to add conditions in the provisioning parameters. You can use Java operations to tweak any attributes by using if-else conditions, substrings, or operators in the JSON for provisioning.

Configuring Import Operations

  • Full account import: When configuring the connection for the first time, first perform the full import to import all existing accounts from the target application to EIC. To perform a full import, the invoke API gets the response from the target application and maps the attributes in the target application with attributes in EIC. As part of this process, the deleted accounts are also identified and marked as suspended from import service.

  • Full Access import: When configuring the connection for the first time, first perform the full import to import all existing access from the target application to EIC. To perform a full import, the invoke API gets a response from the target application and maps the attributes in the target application with attributes in EIC. As part of this process, the deleted entitlements are also identified and marked as inactive.

The import jobs are automatically created in EIC after you create a connection for the Blackline integration. For more information about creating jobs, see Data Jobs.

Importing Accounts and Accesses

You must import accounts after the users are available in EIC.

To import accounts: 

  1. Specify the connection and import parameters. For more information, see Account and Access import.
    Note: Ensure that the connection type is selected as REST.

  2. Configure the Application Data Import (Single Threaded) job to import accounts and access. For more information, see Data Jobs.

Configuring Provisioning and Deprovisioning

Provisioning is automatically enabled when a connection is configured. For detailed information about performing provisioning tasks, see Access Request System.

To provision objects to the target application:

  1. Specify the connection and provisioning parameters. For more information, see Configuration Parameters for Provisioning.
    Note: Ensure that the connection type is selected as REST.

  2. Configure the Provisioning job (WSRETRY). For more information, see Provisioning Jobs.

When a provisioning job is triggered, it creates provisioning tasks in EIC. When these tasks are completed, the provisioning action is performed on the target application through the connector.

Troubleshooting

To troubleshoot common problems with connectors, answer frequently asked questions, and provide solutions to a few common issues you might encounter while configuring or working with connectors, see Common Troubleshooting Guide for Connectors.

To troubleshoot common problems or obtain answers for frequently asked questions for REST connectors, see the REST Connector Guide.

Note: Ensure that you record the token expiry duration during the initial token generation. The connection may fail if the token is not refreshed.

Comments
rushikeshvartak
All-Star
All-Star

links not working

Vedanth_BK
Saviynt Employee
Saviynt Employee

@rushikeshvartak thanks for pointing it out. It is fixed now. 

rushikeshvartak
All-Star
All-Star

Do you have postman collection on hitting login API from postman i am getting login page 

rushikeshvartak_0-1683170324520.png

 

rushikeshvartak
All-Star
All-Star

Please change connection name in zip & document to "accAuth" from "userAuth"

rushikeshvartak_0-1683176439685.png

 

Vedanth_BK
Saviynt Employee
Saviynt Employee

Hi @rushikeshvartak,  Appreciate you for testing and pointing this out. I've made the necessary changes in the JSON and the connection package.
@ravidave  and @barathkk92 If you have any thoughts on the above ask, please share


@rushikeshvartak -
If you are able to resolve the issue, kindly let me know so that I can update our troubleshooting section.


rushikeshvartak
All-Star
All-Star

Steps 

  1. Blackline Team create Client ID and secret for DataIngestionAPI 
  2. For User Management. Please remove "DataIngestionAPI" so it looks like the following

    bl.mdm bl.users instance_BA670679-7035-4E1B-930C-C6F901A4749C

  3. Client ID should be lower case
  4. Once Client ID & Secret Created User should be created with API Access 
  5. User created on blackline portal should not have special characters 
  6. In case of any change to access new API key needs to be generated 
  7. User created in blackline should be granted api access & system admin role
rushikeshvartak
All-Star
All-Star
Jyoti1
Regular Contributor
Regular Contributor

hi 

I am using same json but account entitlement mapping is not working.

Attached json below

 

I am using below json for accountent import. I am able to import accounts and entitlements but account entitlement mapping is not working

 

{
"accountParams": {
"unsuccessResponses": {
"message": "",
"response": "",
"statusCode": [
null,
400,
401,
403,
404,
405,
409,
429,
500,
503
]
},
"includeExistingInActiveAccounts": true,
"doNotChangeIfFailed": true,
"connection": "userAuth",
"processingType": "SequentialAndIterative",
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "https://xxxx.api.blackline.com/v1/users?pageSize=10000&filter=isActive%20eq%20true ",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"keyField": "name",
"colsToPropsMap": {
"status": "isActive~#~char",
"name": "loginId~#~char",
"accountID": "id~#~char",
"displayName": "fullName~#~char",
"customproperty1": "email~#~char",
"customproperty2": "isActive~#~bool",
"customproperty3": "defaultRoleId~#~char",
"customproperty4": "id~#~char",
"customproperty5": "annualHours~#~char",
"customproperty6": "jobTitle~#~char",
"customproperty7": "phoneNumber~#~char",
"customproperty8": "referenceField1~#~char",
"customproperty9": "referenceField2~#~char",
"customproperty10": "referenceField3~#~char",
"customproperty11": "supervisor~#~char",
"customproperty12": "timeZoneId~#~char",
"customproperty13": "allowUserMentions~#~bool"
}
}
}
},
"entitlementParams": {
"connection": "userAuth",
"doNotChangeIfFailed": true,
"processingType": "SequentialAndIterative",
"entTypes": {
"Roles and Products": {
"entTypeOrder": 0,
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "https://xxxxx.api.blackline.com/v1/roles ",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"keyField": "entitlementID",
"colsToPropsMap": {
"entitlementID": "id~#~char",
"entitlement_value": "name~#~char"
}
}
}
},
"Teams": {
"entTypeOrder": 1,
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "https://xxxx.api.blackline.com/v1/teams ",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"keyField": "entitlementID",
"colsToPropsMap": {
"entitlementID": "id~#~char",
"entitlement_value": "name~#~char",
"customproperty1": "uniqueCode~#~char"
}
}
}
},
"Entities": {
"entTypeOrder": 2,
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "https://xxxx.api.blackline.com/v1/mdm/entities",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"keyField": "entitlementID",
"colsToPropsMap": {
"entitlementID": "id~#~char",
"entitlement_value": "name~#~char",
"customproperty1": "uniqueCode~#~char"
}
}
}
}
}
},
"acctEntParams": {
"connection": "userAuth",
"entTypes": {
"Teams": {
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"processingType": "httpAcctToEnt",
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "https://xxxx.api.blackline.com/v1/users/${id}/teams ",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"entKeyField": "entitlementID",
"entIdPath": "id",
"acctKeyField": "id"
}
}
},
"Entities": {
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"processingType": "httpAcctToEnt",
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "https://xxxx.api.blackline.com/v1/users/${id}/entities ",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"entKeyField": "entitlement_value",
"entIdPath": "name",
"acctKeyField": "id"
}
}
},
"Roles and Products": {
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"processingType": "httpAcctToEnt",
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "https://xxxx.api.blackline.com/v1/users/${id}/roles-products ",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"entKeyField": "entitlementID",
"entIdPath": "name",
"acctKeyField": "id"
}
}
}
}
}
}

[This post has been edited by a Moderator to remove sensitive information.]

Vedanth_BK
Saviynt Employee
Saviynt Employee

Hi @Jyoti1,

Please let me know which entitlementType does not have the mapping. To check this further can you share the complete debug logs in a text file after adding {"showLogs": true} in the ConfigJSON

Thank you 
Vedanth B.K

Jyoti1
Regular Contributor
Regular Contributor

None of them getting mapped to accounts.

Vedanth_BK
Saviynt Employee
Saviynt Employee

@Jyoti1 Please share the complete debug logs in a text file for access recon job. Also make sure you have added {"showLogs": true} in the ConfigJSON.
Thanks 

Jyoti1
Regular Contributor
Regular Contributor

Hi Vedanth

 

All the entitlement types got mapped. Only there is an issue with roles-product mapping.

With below code roles are getting mapped. Is there a way we can map product also.

"entIdPath": "role.name+' '+ product.name"

"Roles and Products": {
"call": {
"call1": {
"callOrder": 0,
"stageNumber": 0,
"processingType": "httpAcctToEnt",
"http": {
"httpHeaders": {
"Authorization": "${access_token}"
},
"url": "https://xxxxxx.api.blackline.com/v1/users/${id}/roles-products ",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"entKeyField": "entitlement_value",
"entIdPath": "role.name",
"acctKeyField": "accountID"
}
}
}

 

postman response-

Jyoti1_0-1686560676836.png

 

Shilpa_B
New Contributor II
New Contributor II

Hi @Vedanth_BK ,

Blackline - We are actually looking for "Roles and Products" to manage account and access. However, I observed below discrepancies in integration guide. 

1. AccountEntImport JSON - "Roles and Products"  the url is importing only roles but we need information on roles-products

"url": "@@HOST_URL@@/v1/roles",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"keyField": "entitlementID",
"colsToPropsMap": {
"entitlementID": "id~#~char",
"entitlement_value": "name~#~char"
}

2. Add and Remove AccessJSONs' expecting customproperty1 value but for Import role-products, this mapping is missing.

 

"url": "@@HOST_URL@@/v1/users/${account.accountID}/roles-products",
"httpMethod": "POST",
"httpHeaders": {
"Authorization": "${access_token}",
"Content-Type": "application/json"
},
"httpContentType": "application/json",
"httpParams": "[{\"roleId\": ${entitlementValue.customproperty2},\"productId\": \"${entitlementValue.customproperty1}\"}]",

it would be great help if you could provide more details on this.

Thanks,

Shilpa

KG
New Contributor
New Contributor

Hi @Vedanth_BK 

 

Can you please help with below ?

 

Blackline - We are actually looking for "Roles and Products" to manage account and access. However, I observed below discrepancies in integration guide. 

1. AccountEntImport JSON - "Roles and Products"  the url is importing only roles but we need information on roles-products

"url": "@@HOST_URL@@/v1/roles",
"httpContentType": "application/json",
"httpMethod": "GET"
},
"listField": "items",
"keyField": "entitlementID",
"colsToPropsMap": {
"entitlementID": "id~#~char",
"entitlement_value": "name~#~char"
}

2. Add and Remove AccessJSONs' expecting customproperty1 value but for Import role-products, this mapping is missing.

 

"url": "@@HOST_URL@@/v1/users/${account.accountID}/roles-products",
"httpMethod": "POST",
"httpHeaders": {
"Authorization": "${access_token}",
"Content-Type": "application/json"
},
"httpContentType": "application/json",
"httpParams": "[{\"roleId\": ${entitlementValue.customproperty2},\"productId\": \"${entitlementValue.customproperty1}\"}]",

it would be great help if you could provide more details on this.

Thanks,

Gaurav

 

 

 

Vedanth_BK
Saviynt Employee
Saviynt Employee

Hi @KG 

Could you please help me with the API response to import roles and products.let me check the response  and get back to you 

Thank you 

ravidave
Saviynt Employee
Saviynt Employee

Hi @KG 

For entitlement import, Blackline does not have an API which can give you a result of all roles by product. It was imported through a CSV by receiving metadata for products from vendor and by importing roles through API.

Roles needs to be made non requestable entitlements post importing.

Account to Entitlement mapping for Roles by product also needs to be done through CSV import or schema job.

Shilpa_B
New Contributor II
New Contributor II

Hi @ravidave 

User should be able to request for roles and products from saviynt. As in current system roles and product mapping is as below. How this can be achieved from Saviynt?

Shilpa_B_0-1688564763581.png

 

ravidave
Saviynt Employee
Saviynt Employee

@Shilpa_B 

Create an entitlement per customer need. For example, Role by Module, Role by Product etc. Create entitlements for all permutation and combination and set roleid and productid in any separate custom properties. If you do that, above JSONs per your need should be able to provision/deprovision roles by product.

Let me know if you still have any outstanding question.

rushikeshvartak
All-Star
All-Star

@Rishi  As discussed over call,

There is no API from Product for Roles to Product Mapping and clearly its not call out that it needs to be imported from Schema Import ,etc

Version history
Last update:
‎07/16/2023 09:56 PM
Updated by: