All pages
Powered by GitBook
1 of 4

Loading...

Loading...

Loading...

Loading...

Custom Identity Provider

Template for pushing IdP domain, user, and group metadata

Veza will handle federated identities just as those in supported IdPs such as Okta or Entra ID, enabling search and access review for OAA entities alongside the rest of your data catalog.

Sample Template and Features

The metadata payload describes the Identity Provider domain, users, and groups to add to the Veza authorization graph:

Simple Custom Identity Provider
{
  "name": "My IdP",
  "idp_type": "custom_idp",
  "domains": [
    {
      "name": "example.com",
      "tags": [],
    }
  ],
  "users": [
    {
      "name": "m_richardson",
      "email": "mrichardson@example.com",
      "identity": "m_richardson",
      "full_name": "Michelle Richardson",
      "department": null,
      "is_active": true,
      "is_guest": false,
      "groups": [
        {
          "identity": "everyone"
        },
        {
          "identity": "developers"
        }
      ],
      "assumed_role_arns": [
        {
          "identity": "arn:aws:iam::123456789012:role/role001"
        },
        {
          "identity": "arn:aws:iam::123456789012:role/role002"
        }
      ],
      "tags": [],
    },
    {
      "name": "evargas",
      "email": "evargas@example.com",
      "identity": "evargas",
      "full_name": "Elizabeth Vargas",
      "department": null,
      "is_active": true,
      "is_guest": false,
      "groups": [
        {
          "identity": "everyone"
        },
        {
          "identity": "developers"
        },
        {
          "identity": "sec-ops"
        }
      ],
      "assumed_role_arns": [],
      "tags": [],
    },
    {
      "name": "willis",
      "email": "willis@example.com",
      "identity": "c_williams",
      "full_name": null,
      "department": null,
      "is_active": true,
      "is_guest": false,
      "groups": [
        {
          "identity": "everyone"
        }
      ],
      "assumed_role_arns": [],
      "tags": []
    }
  ],
  "groups": [
    {
      "name": "developers",
      "identity": "developers",
      "full_name": null,
      "is_security_group": null,
      "tags": []
    },
    {
      "name": "sec-ops",
      "identity": "sec-ops",
      "full_name": null,
      "is_security_group": null,
      "tags": []
    },
    {
      "name": "everyone",
      "identity": "everyone",
      "full_name": "All Company Employees",
      "is_security_group": null,
      "tags": []
    }
  ],
  "identity_mapping_configuration": {
    "mappings": [
      {
        "destination_datasource_type": "GITHUB_USERS",
        "property_matchers": [
          {
            "source_property": "EMAIL",
            "destination_property": "UNIQUE_ID"
          }
        ]
      },
      {
        "destination_datasource_type": "SQL_SERVER",
        "property_matchers": [
          {
            "source_property": "EMAIL",
            "destination_property": "EMAIL"
          }
        ],
        "transformations": [
          "IGNORE_DOMAIN"
        ]
      }
    ]
  }
}

Modeling Assumable Amazon Web Services Roles

For cases where federated IdP entities are granted AWS permissions via IAM roles, the template supports defining assumable roles per-user. Binding a custom IdP user or group to an AWS role or group ARN enables Veza to parse and display the resource-level actions permitted within AWS.

{
      "name": "Custom User",
      "assumed_role_arns": {
        "identity": [
          "arn:aws:iam::123456789012:role/S3Access"
          ]
        },
    }

Source Identity Assignments

For use cases where a custom IdP is federated with another identity provider user identities can be linked between the two. Authorizations granted to the user will also be granted the source identity. The link is created by providing the unique identity ID and provider type as part of the user entry.

{
  "name": "Custom User",
  "identity": "00001",
  "source_identity": {
    "identity": "user0001@corp.example.com",
    "provider_type": "okta"
  }
}

For provider_type the following values are accepted:

Provider

provider_type string

Active Directory

active_directory

Any

any

AzureAD

azure_ad

OAA

custom

Google Workspace

google_workspace

Okta

okta

One Login

one_login

Resource Manager Assignments

New in Veza release 2022.2.1

To assign an IdP user or group as the manager of any resource Veza has discovered, list the node type and node id in the entities_owned field, for example:

{
  "name": "Custom User",
  "identity": "000011",
  "entities_owned": [
    {
      "node_type": "S3Bucket",
      "id": "arn:aws:s3:::amazon-connect-53f87966654d"
    }
  ]
}

When parsing the payload, resources in the data catalog will be updated with a SYSTEM_resource_managers tag to enable entitlement reviews. The owner(s) will be suggested as reviewers for Veza Workflows that target an individual named resource with the correct tag.

Manager Assignments

Users and groups can be mapped to the identity of another user they report to. When configured, the manager will be suggested as a review for Workflow certifications where the assigned reporter is the single query target "named entity."

{
  "name": "Custom User",
  "identity": "000013",
  "manager_id": "000011"
}

Custom Properties and Tags

"tags": [
  {
    "key": "Tag1key",
    "value": "optional_Tag1Val"
  }
]

Incremental Updates

Custom Identity Provider definition

The identity provider object models one instance of the custom IdP:

Field
Type
Description

name

string

Name to associate with the provider in Veza.

custom_property_definition

Defines the key and types for properties that can be applied to other objects in the push payload

idp_type

string

Type descriptor for IdP, can be unique or share across multiple IdP (for example ldap, IPA)

idp_description

string

Any notes to add as entity details (optional)

domains

Domain model

users

Dictionary of CustomIdPUser class instances

groups

Dictionary of CustomIdPGroup class instances

incremental_change

boolean

identity_mapping_configuration

Configuration for mapping identities between IdP User and other User types from external data sources

IdP Domain

One domain is supported for each custom IdP. Users and groups are mapped to the IdP domain, and connected in Veza Search:

Field
Type
Description

name

string

IdP Domain name

custom_properties

Each element of the push payload can have property_values, validated against the custom_property_definition.

dynamic_properties

Dynamic Properties

tags

Any tags to create and apply to the domain.

operation

enum

IdP Users

Each IdP user object contains the display name, login email, and identity, along with other identity-related properties:

{
      "name": "willis",
      "email": "willis@example.com",
      "identity": "000001",
      "full_name": "Charles Willis",
      "department": "Sales",
      "is_active": true,
      "is_guest": false,
      "groups": [
        {
          "identity": "everyone"
        }
      ],
      "assumed_role_arns": {
        "identity": [
          "arn:aws:iam::123456789012:role/S3Access"
          ]
      },
      "source_identity": {
        "identity": "user0001@corp.example.com",
        "provider_type": "okta"
      },
      "tags": [],
      "custom_properties": {},
      "manager_id": "string",
      "entities_owned": {
        "node_type": "S3Bucket",
        "id": "arn:aws:s3:::amazon-connect-53f87966654d"
        }
    }
Field
Type
Description

name

string

Primary ID for user

email

string

Optional email for user

identity

string

Optional unique identifier for user

groups

string list

Assign groups memberships by group identity (optional)

full_name

string

Full name to display in Veza

department

string list

Any departments to apply as a searchable property (optional).

is_active

boolean

If available, will be applied to the entity as a searchable property (optional).

is_guest

boolean

If available, will be applied to the entity as a searchable property (optional).

assumed_role_arns

array

AWS IAM roles that can be assumed by the IdP user, in the format {"identity": ["arn:aws:iam::123456789012:role/S3Access"]} (optional).

tags

Any tags to create and apply to the user.

dynamic_properties

Dynamic Properties

custom_properties

Each element of the push payload can have property_values, validated against the custom_property_definition.

manager_id

string

entities_owned

If another resource is specified by entity type and entity id, a Veza tag will be created on the resource to indicate the owner.

operation

enum

source_identity

Optionally link IdP user to user from another IdP for federation use cases.

IdP Groups

Add a group by name in the groups section of the template to enable mapping IdP users to those groups:

"groups": [
  {
    "name": "developers",
    "identity": "developers",
    "full_name": null,
    "is_security_group": null,
    "assumed_role_arns": {
      "identity": ["arn:aws:iam::123456789012:role/S3Access"]
    },
    "tags": [],
    "groups": [
      { "group_1_identity": "parent" },
      { "group_2_identity": "parent" }
    ],
    "custom_properties": {}
  }
]
Field
Type
Description

name

string

IdP group name.

identity

string

Unique ID used for user-group assignments.

full_name

string

Optional display name for group

groups

string list

other custom IdP groups this group is a member of

is_security_group

boolean

Sets the is security group searchable property for the entity in Veza (optional).

tags

Veza Tags list

custom_properties

Each element of the push payload can have property_values, validated against the custom_property_definition.

dynamic_properties

Dynamic Properties

operation

enum

assumed_role_arns

array

AWS IAM roles the group can assume, in the format {"identity": ["arn:aws:iam::123456789012:role/S3Access"]} (optional).

IdP Apps

Use the apps section to define any applications used to manage access within the identity provider. Apps can be associated with users and groups to model application assignments across your organization.

  "apps": [
    {
      "id": "app1",
      "name": "Application 1",
      "description": "This is a sample application",
      "assumed_role_arns": [
        {
          "identity": "arn:aws:iam::1234567890:role/DevAppRole"
        }
      ],
      "custom_properties": {
        "owner_org": "engineering"
      },
      "tags": []
    }
  ]
Field
Type
Description

id

string

App unique identifier.

name

string

IdP app name.

description

string

Description for the App (optional).

assumed_role_arns

array

AWS IAM roles the app can assume, in the format {"identity": ["arn:aws:iam::123456789012:role/S3Access"]} (optional).

custom_properties

Each element of the payload can have property_values, validated against the custom_property_definition.

tags

Veza Tags list

operation

enum

Users and Groups can be assigned to an application by setting the app_assignments in the user or group.

    {
      "name": "willis",
      "email": "willis@example.com",
      "identity": "cwilliams",
      "groups": [
        {
          "identity": "everyone"
        }
      ],
      "custom_properties": {
        "region": "NorthAmerica",
        "is_contractor": true
      },
      "app_assignments": [
        {
          "id": "assignment1",
          "name": "Assignment",
          "app_id": "app1",
          "custom_properties": {
            "assigned_on": "2024-12-05T12:42:25+00:00"
          }
        }
      ]
    }
Field
Type
Description

id

string

Assignment unique identifier.

name

string

Display name for the assignment.

app_id

string

Unique ID of the App to assign the identity to.

custom_properties

Each element of the payload can have property_values, validated against the custom_property_definition.

Creating and Updating a Custom Identity Provider

The steps to add a custom IdP are the same as for any other OAA provider: you will need to register the new provider and data source, and then push the domain, user, and group descriptions in a JSON payload.

Register a custom identity provider

To create a new custom provider using the identity_provider template, POST the name and template type to /providers/custom:

curl -X POST 'https://<veza_url>/api/v1/providers/custom' \
-H 'authorization: Bearer '<access_token> \
--data-binary '{"name":"SimpleIdP","custom_template":"identity_provider"}'

The response will return the custom IdP ID, which you will need when pushing the metadata payload:

{
  "value": {
    "id": "532f6fe3-189f-4576-afdf-8913088961e4",
    "name": "Simple IdP",
    "custom_template": "identity_provider",
    "state": "ENABLED",
    "application_types": [],
    "resource_types": [],
    "idp_types": []
  }
}

Push a data source for the custom identity provider

curl -X POST 'https://<veza_url>/api/v1/providers/custom/532f6fe3-189f-4576-afdf-8913088961e4/datasources' \
-H 'authorization: Bearer '<access_token> \
--data-binary '{"id":"532f6fe3-189f-4576-afdf-8913088961e4", "name":"SimpleDataSource"}'

Note that the provider id is required in both the path and body of the request. The response will include the new data source ID.

{"value":{"id":"b6a32af6-b854-47e1-8325-e5984f78bb4d","name":"SimpleDataSource"}}

Push metadata for the data source

curl -X POST 'https://<veza_url>/api/v1/providers/custom/532f6fe3-189f-4576-afdf-8913088961e4/datasources/b6a32af6-b854-47e1-8325-e5984f78bb4d:push' \
-H 'authorization: Bearer '<access_token> \
--compressed --data-binary @payload.json

The payload file must contain the provider and data source ID, and the authorization metadata as a single string, for example:

payload.json
{
  "id": "532f6fe3-189f-4576-afdf-8913088961e4",
  "data_source_id": "b6a32af6-b854-47e1-8325-e5984f78bb4d",
  "json_data": "{\n\"name\":\"CustomIdentityProvider\",\n\"idp_type\": ... "
}

Identity Mapping Configuration

The identity_mapping_configuration parameter defines rules for connecting users in a custom IdP to users from other data sources in the Veza graph.

This is useful when:

  • The connected data source does not natively support returning information about external identities

  • A correlation between IdP identities and local users can be assumed based on values like username, email, or another property value.

The identity_mapping_configuration is a top-level property of the Custom IDP submission, and is optional. The mapping configuration can include multiple mappings to connect IDP users to users from different data source types, each based on its own mappings.

{
  "identity_mapping_configuration": {
    "mappings": [
      {
        "destination_datasource_type": "OKTA",
        "property_matchers": [
          {
            "source_property": "EMAIL",
            "destination_property": "EMAIL"
          }
        ],
        "transformations": [
          "IGNORE_SPECIAL"
        ]
      },
      {
        "destination_datasource_type": "AZURE_AD",
        "property_matchers": [
          {
            "source_property": "EMAIL",
            "destination_property": "EMAIL"
          }
        ],
        "transformations": [
          "IGNORE_DOMAIN"
        ]
      },
      {
        "destination_datasource_type": "GITHUB_USERS",
        "property_matchers": [
          {
            "source_property": "EMAIL",
            "destination_property": "UNIQUE_ID"
          }
        ]
      }
    ]
  }
}

Identity Mapping Configuration

Field
Type
Description

mappings

IdentityMappingSubmission

List of mappings to create between IDP Users and external data sources

operation

enum

Identity Mapping Submission

Field
Type
Description

destination_datasource_type

string

Veza Type for the destination data source, GITHUB_USERS, SQL_SERVER, CUSTOM_APPLICATION

destination_datasource_oaa_app_type

string

Optional specifically for mapping to OAA Custom Application to provide a specific App Type

property_matchers

IdentityMappingPropertyMatchersSubmission

List of properties to match on

transformations

list enum

Optional transformations to perform on the property values, available values: ignore_special, ignore_domain

Supported transformations:

  • IGNORE_SPECIAL: Ignore special characters (_, -, .) when matching identities

  • IGNORE_DOMAIN: Match identities after removing domain portions (e.g., "@example.com")

IdentityMappingPropertyMatchersSubmission

Field
Type
Description

source_property

enum

IDP User property to match on, unique_id, email, property or custom_property

destination_property

enum

Destination User property to match on, unique_id, email, property or custom_property

custom_source_property

string

When using property or custom_propert the property name to match on

custom_destination_property

string

When using property or custom_propert the property name to match on

Use this template to model authorization metadata for custom identity providers using the .

This document includes an example template and notes for designing and a model of your IdP.

A can define additional properties, used to add supplemental metadata to entities in the payload.

Custom IdP users and groups can be assigned permissions in other OAA applications by setting the principal type to idp in identity_to_permissions in the payload.

are the recommended method for adding additional metadata to custom identities and resources.

Additionally, can be applied to the IdP domain, users, and groups:

Use incremental updates to remove tags: Resubmitting a payload with different tags will apply any new tags, but not remove existing ones. To remove a tag already applied to an entity, you will need to use the remove_tag operation.

After the initial metadata push (which must contain the full payload), you can modify, add, or remove the domain, users, and groups without resubmitting other entities. An is enabled by setting "incremental_change": true in the json_data push payload, and specifying the update operation for each entity to change.

When true, enables operations (optional).

Up to 5 attributes to apply to the domain (deprecated, use instead)

list

For , the operation to use.

list

Up to 5 attributes to apply to the user (deprecated, use instead)

If the same as another user's identity, that user will be recommended for reviews. Entity details for the user will be updated on push to include the manager as a searchable property.

array

For , the operation to use (optional).

Any to create and apply to the group.

Up to 5 attributes to apply to the domain. (deprecated, use instead)

For , the operation to use (optional).

IdP entities can be granted permissions on custom applications in the identity_to_permissions section of the .

Any to create and apply to the group.

For , the operation to use (optional).

For , the operation to use.

Open Authorization API
custom property definition
custom application
Custom Properties
Veza tags
incremental update
incremental update
custom app metadata payload
publishing
domain
users
groups
apps
identity_mapping_configuration
Custom Property Definition
incremental update
Custom Properties
custom properties
Veza Tags
incremental updates
Veza Tags
custom properties
Custom Properties
governance
incremental updates
tags
Custom Properties
custom properties
incremental updates
Custom Properties
tags
incremental updates
Custom Properties
incremental updates
IdP Domain
IdP Users
IdP Group
Identity Mapping Configuration
Entities Owned
Source Identity

Custom HRIS Provider

OAA Template for Human Resources Information Systems

Overview

Use this Open Authorization API template to publish employee metadata for Human Resources Information Systems (HRIS) platforms, typically used by organizations as a single source of truth for employee information.

Unlike an Identity Provider, HR platforms typically do not provide access to other systems. Employee profiles within an HRIS platform are instead used to store important details such as employment status, who individuals report to, department, and country. Veza can use this metadata to:

  • Correlate employees in the HRIS system with identities in your identity provider (IdP).

  • Enrich Access Reviews with details about linked HRIS employees for users under review.

The template supports:

  • A top-level System entity representing the HRIS tenant, organization, or account.

  • Employee entities representing current and inactive workers

  • Group entities representing teams, departments, cost centers, or other units to which users are assigned.

HRIS template example

{
  "System": {
    "URL": "https://examplehris.com"
  },
  "Employees": [
    {
      "Employee Number": "123456",
      "Company": "Example Corp",
      "First Name": "John",
      "Last Name": "Doe",
      "Preferred Name": "Johnny",
      "Display Full Name": "Johnny Doe",
      "Canonical Name": "John Doe",
      "Username": "john.doe",
      "Email": "john.doe@examplecorp.com",
      "IDP ID": "1234-5678-9012",
      "Personal Email": "johndoe@gmail.com",
      "Home Location": "City A",
      "Work Location": "City B",
      "Cost Center": "001",
      "Department": "002",
      "Managers": ["987654"],
      "Groups": ["team-1", "dept-1"],
      "Employment Status": "ACTIVE",
      "Is Active": true,
      "Start Date": "2021-05-01T00:00:00Z",
      "Termination Date": null,
      "Job Title": "Software Engineer",
      "Employment Types": ["FULL_TIME"],
      "Primary Time Zone": "America/New_York"
    }
  ],
  "Groups": [
    {
      "Group Type": "TEAM",
      "Parent": "dept-1"
    }
  ]
}

Custom properties

{
  "name": "BambooHR",
  "hris_type": "BambooHR",
  "custom_property_definition": {
    "employee_properties": {
      "division": "STRING",
      "office_extension": "STRING"
    },
    "group_properties": {
      "headquarters_location": "STRING"
    }
  },
  "system": {
    "name": "BambooHR",
    "id": "BambooHR",
    "url": "https://vezai.bamboohr.com",
    "idp_providers": ["okta"]
  },
  "employees": [
    {
      "name": "Charlotte Abbott",
      "id": "1",
      "custom_properties": {
        "division": "North America",
        "office_extension": "1234"
      },
      "employee_number": "1",
      "email": "cabbott@efficientoffice.com",
      "work_location": "Lindon, Utah",
      "job_title": "Sr. HR Administrator"
    },
    {
      "name": "Cheryl Barnet",
      "id": "10",
      "custom_properties": {
        "division": "North America",
        "office_extension": "5678"
      },
      "employee_number": "10",
      "email": "cbarnet@efficientoffice.com",
      "work_location": "Lindon, Utah",
      "job_title": "VP of Customer Success"
    }
  ],
  "groups": [
    {
      "name": "North America-Human Resources",
      "id": "North America-Human Resources",
      "group_type": "Department",
      "custom_properties": {
        "headquarters_location": "Lindon, Utah"
      }
    }
  ]
}

Identity mappings

Veza maps HRIS employees to identities from integrated Identity Providers (IdPs) such as Okta by matching the idp_id, email, or id value in the HRIS payload with the IdP entity's Name, Principal Name, or Identity. The matching process checks these fields in the following sequence:

  1. idp_id

  2. email

  3. id

If the idp_id is unset, Veza uses the email field for matching. If the email field is also absent, the id is used. Veza issues a warning if no matching entity is found.

Custom HRIS System

The account/tenant/etc. that contains the HR information.

Property
Type
Required
Unique
Description

URL

String

Y

N

The url for this HRIS system.

Custom HRIS Employee

Used to represent any person who has been employed by a company.

Property
Type
Required
Unique
Description

Employee Number

String

Y

Y

The employee's number that appears in the third-party integration.

Company

String

N

N

The company (or subsidiary) the employee works for.

First Name

String

Y

N

The employee's first name

Last Name

String

Y

N

The employee's last name

Preferred Name

String

N

N

The employee's preferred first name.

Display Full Name

String

N

N

The employee's full name, to use for display purposes. If a preferred first name is available, the full name will include the preferred first name.

Canonical Name

String

N

N

The employee's canonical name.

Username

String

N

N

The employee's username that appears in the integration UI.

Email

String

N

Y

The employee's work email.

IDP ID

String

N

N

The ID for this employee on the destination IDP provider used to automatically connect to it, if not supplied email is used

Personal Email

String

N

N

The employee's personal email.

Home Location

String

N

N

The employee's home location.

Work Location

String

N

N

The employee's work location.

Cost Center

String

N

N

The cost center ID (Group ID) that the employee is in.

Department

String

N

N

The department ID (Group ID) that the employee is in.

Managers

STRINGLIST

N

N

The employee IDs of the employee's managers.

Groups

STRINGLIST

N

N

The IDs of groups this user is in

Employment Status

String

Y

N

The employment status of the employee. Possible values include - ACTIVE, PENDING, INACTIVE.

Is Active

BOOLEAN

Y

N

If the employee is active or not.

Start Date

TIMESTAMP

N

N

The date that the employee started working. If an employee was rehired, the most recent start date will be returned.

Termination Date

TIMESTAMP

N

N

The employee's termination date.

Job Title

String

N

N

The title of the employee.

Employment Types

STRINGLIST

N

N

The employee's type of employment. Possible values include - FULL_TIME, PART_TIME, INTERN, CONTRACTOR, FREELANCE.

Primary Time Zone

String

N

N

The time zone which the employee primarily lives.

Custom HRIS Group

Used to represent any subset of employees, such as PayGroup or Team. Employees can be in multiple Groups.

Property
Type
Required
Unique
Description

Group Type

String

Y

N

The type of group, possible values include - TEAM, DEPARTMENT, COST_CENTER, BUSINESS_UNIT, GROUP. This is intended as to not have each type as their own nodes.

Parent

String

N

N

The group ID of its parent group.

OAA Templates

JSON schemas for describing custom applications and identity providers

OAA utilizes templates (JSON schema) for structuring authorization and identity metadata, combined with a REST API to register, update and manage the data. Once uploaded, Veza processes the template payload and incorporates the entities and permissions into the Authorization Metadata Graph.

Choosing the appropriate template (application or identity provider) is the first step in creating a new integration with OAA. The template provides a schema for describing the identities, resources, and authorization relationships local to the OAA data source.

Custom Application

A custom application is structured with the following main entities:

  • Application

    • Resource

      • Sub-resource

        • Sub-resource

          • Additional sub-resources

    • Local Users

    • Local Groups

    • Local Roles

  • Local Permissions

  • Identity-to-permissions binding

Custom Identity Provider

A Custom Identity Provider can have the following entities:

  • Domains

  • Users

  • Groups

The Custom IdP template also includes the option to define AWS Roles that are assumable by users and groups and can work with Access Review Workflows to auto-assign resource managers.

Custom Application

Template for pushing custom data source entities and authorization

Overview

The Custom Application Template can be used to model most applications and services. It can describe many common entity types (such as users, groups, and resources), and should be the starting point for most custom connectors.

The template has three primary elements, covered in detail in this document:

  • Applications - describes one or more application instances for the custom data source. An application may consist of any of the following entities:

    • Local Users - defines the users of the application. The local user entity can be used to store the properties of the user specific to the application (such as last_login_at) and can be linked to a source identity like Okta or AzureAD.

    • Local Groups - defines a group of users, permissions to the application or resources can be assigned to a group.

    • Local Roles - defines a collection of permissions. A role can be used to link an identity (local user, group, or IdP) to an application or resource. An identity assigned to a role will be assigned all permissions from that role.

    • Resources - for more fine grain authorization tracking resources can be used to represent components of the application that have their own authorization. Users and groups can be assigned permission or roles to resources.

      • Sub Resources - resources can additionally have sub-resources for additional levels of depth.

  • Permissions - define the applications specific permissions and map to Veza canonical permissions.

  • Identity to Permissions - Assign local and federated users and groups to permissions or roles to the application and resources.

To use the generic app template, set the template type to application when creating a new data provider:

Sample Payload

Simple Custom Application

This example demonstrates using local users and groups to assign permissions directly to the application and resources.

Sample Application using Roles

Custom Properties and Tags

Define custom properties

Set custom properties

In the rest of the payload, for each object that should have additional properties, add a custom_properties array containing the property keys and values:

Validation and Troubleshooting

The API response will provide information for invalid data submission. You can check Veza events for updates on parsing status. Errors won't typically occur during parsing, as the metadata is validated upon push. To ensure a valid payload, you should:

  • Confirm all string fields are are valid UTF-8 strings no larger than 256 bytes.

  • Check that all required fields are present. Tags and properties are optional. You can null empty groups, roles, and other "empty" but required keys.

  • A 200 OK response may include warnings when matching IDP identities can't be found

Applications

The OAA payload must contain at least one top-level application. To model data systems with multiple components (such as different servers or repositories), applications can have resources and sub-resources.

You can also specify more than one application in the OAA payload, each with its own identities, permissions, roles, and resources.

The application_typeis applied to all application resources and identities, and can be used as a filterable property in Veza search.

Application Properties

Optional fields: some values in the schema are optional. When submitting a payload without a required field, an error message will help identify the issue. The following guidelines apply:

  • Any type of data in a JSON payload can be null (not set).

  • Unused optional arrays and objects should be empty {} or [].

  • Unused optional strings, numbers, and booleans should be null.

  • Strings and string lists intended to have constant values (enums) such as identity_type may have a default value when not set.

Resources

Each application can contain one or more resources that users can access. Resources can have additional searchable properties and may contain additional sub-resources.

Sub-resources describe additional layers of the application principals can have authorization to, and support the same properties as resources, including additionally nested sub-resources.

Resource Properties

An application can have any number of nested sub resources.

* A specific resource type must have only resources with an id, or only resources without an id. When used identity_to_permissions assignments are made by the id value and name functions as a display name.

Resource Connections

In the system being modeled, application resources and sub-resources (such as virtual machines or Looker views) have access to other entities in the Veza authorization graph.

If an application resource or sub-resource is able to assume the permissions of a local user, IAM role, or Enterprise application, you can specify the connections to another graph entity node_type and id:

The following node types are currently available:

  • SnowflakeUser

  • GoogleCloudServiceAccount

  • AwsIamRole

  • AzureADEnterpriseApplication

  • TrinoUser

Identities

Applications can have local users and groups for identities. For users and groups that correlate to an external Identity Provider (for example accounts automatically provisioned by the IdP), you can map the principal to the IdP entity name or login email in identities.

Local Users

Contains any users whose profiles and authentication are handled and stored by the custom application. Local users include their group assignments and any federated identities that should be mapped to the local user:

local Groups

If the application has any groups, describe each one in the local_groups array.

Group assignments for entities are defined in identity_to_permissions.

*Must match a discovered Okta or Azure entity Name, PrincipalName, or Identity

Local Roles

Local roles define collections of local permissions that can be assigned to multiple resources. In the applications section, roles are named and mapped to permissions. Role assignments are defined in identity_to_permissions.

permissions

Bind local permissions to the corresponding Veza canonical permission(s). Each native application permission should be included as an object, mapped to the corresponding data/non-data actions it allows.

Canonical permission types are:

  • DataRead

  • DataWrite

  • MetadataRead

  • MetadataWrite

  • NonData

  • DataCreate

  • DataDelete

  • MetadataCreate

  • MetadataDelete

  • Uncategorized

To better model systems where roles can contain different permissions to different types of resources, permissions can apply to individual resource_types.

  • When the payload is parsed, individual permissions are created for each type of resource the permission applies to.

  • Without resource_types specified, the permission will function normally. When directly connecting principals and resources, resource_type is ignored.

identity_to_permissions

Contains an object for each local and IdP identity, and the individual permissions to applications and resources.

  • You can bind permissions to federated users and groups by providing the principal’s IDP login email or group name as the identity, and setting the identity_type to idp.

  • Permissions and role assignments can apply to the entire application or scoped to specific resources.

  • For each identity (matching a local user, group, or IdP identity), state the identity type and add the assigned permissions/roles:

  • Each identity can be either a local_user, local_role, or local_group name, or the identifier of an IdP user, group, or role (email address or group name).

  • identity_type must be one of (idp (default), local_group, local_role, or local_user.

application_permissions

Binds the identity (IdP entity, local user, or local group) to local permission, by application and resources.

role_assignments

Local roles are assigned to identities in the role_assignments array. Roles can apply to the entire application or only to specific (sub) resources.

Identities to Permissions mapping

Trigger events when there is a change in the integrated HRIS data source.

To enable this payload format, specify the hris custom template when with the API.

The HRIS template supports . After specifying a custom property definition in the payload, you can assign additional attributes to entities. These enable attribute filters for searches and access reviews in Veza, and enrich results with entity metadata unique to the source system or your organization.

For most applications, SaaS Apps and systems the provides a generic and flexible model to capture authorization data for users and groups to the system and its resources.

Intended for modeling sources of users, group, and federated identity metadata, the can be used to enumerate users and groups that access other external applications and resources, similar to built-in connectors for Okta and AzureAD. These users and groups typically represent the top-level corporate identities within an organization.

Additionally, a may describe user-configured key:pair values that can be applied to entities in the payload.

and can be applied to most objects in the OAA payload: the application and its local_users, local_groups, local_roles and resources/sub_resources.

Use incremental updates to remove tags: Resubmitting a payload with different tags will apply any new tags, but not remove existing ones. To remove a tag already applied to an entity, you will need to use the remove_tag operation.

Field
Type
Description

OAA apps need to contain at least one identity, which could be a local_group, local_role, or an IdP identity. Role assignments are made in the section.

Field
Type
Description
Field
Type
Description
Field
Type
Description
Field
Type
Description
Field
Type
Description
Field
Type
Description
Field
Type
Description
Field
Type
Description
Lifecycle Management
custom properties
curl -X POST "https://{VEZA_URL}/api/v1/providers/custom" \
-H "authorization: Bearer {API_KEY}" \
--compressed --data-binary '{"name":"DemoApp","custom_template":"application"}'
{
  "custom_property_definition": {
    "applications": [
      {
        "application_type": "sample",
        "application_properties": {},
        "local_user_properties": {},
        "local_group_properties": {},
        "local_role_properties": {},
        "resources": []
      }
    ]
  },
  "applications": [
    {
      "name": "Sample App",
      "application_type": "sample",
      "description": "This is a sample app",
      "local_users": [
        {
          "name": "bob",
          "identities": [
            "bob@example.com"
          ],
          "is_active": true,
          "created_at": "2022-01-26T20:48:12.460Z",
          "id": "0000000001"
        },
        {
          "name": "jane",
          "identities": [
            "jane@example.com"
          ],
          "groups": [
            "admins"
          ],
          "created_at": "2021-08-13T06:28:13.250Z",
          "id": "0000000002"
        }
      ],
      "local_groups": [
        {
          "name": "admins"
        }
      ],
      "local_roles": [],
      "tags": [],
      "custom_properties": {},
      "resources": [
        {
          "id": "0001",
          "name": "Entity1",
          "resource_type": "thing",
          "description": "Some entity in the application",
          "sub_resources": [
            {
              "name": "Child 1",
              "resource_type": "child",
              "description": "My information about resource"
            }
          ]
        },
        {
          "id": "0002",
          "name": "Entity2",
          "resource_type": "thing",
          "description": "Another entity in the application"
        }
      ]
    }
  ],
  "permissions": [
    {
      "name": "admin",
      "permission_type": [
        "DataRead",
        "DataWrite"
      ],
      "apply_to_sub_resources": false,
      "resource_types": []
    },
    {
      "name": "operator",
      "permission_type": [
        "DataRead",
        "MetadataRead"
      ],
      "apply_to_sub_resources": false,
      "resource_types": []
    },
    {
      "name": "manager",
      "permission_type": [
        "MetadataWrite"
      ],
      "apply_to_sub_resources": false,
      "resource_types": []
    }
  ],
  "identity_to_permissions": [
    {
      "identity": "0000000001",
      "identity_type": "local_user",
      "application_permissions": [
        {
          "application": "Sample App",
          "permission": "operator",
          "apply_to_application": true
        },
        {
          "application": "Sample App",
          "resources": [
            "0001"
          ],
          "permission": "manager"
        }
      ]
    },
    {
      "identity": "admins",
      "identity_type": "local_group",
      "application_permissions": [
        {
          "application": "Sample App",
          "permission": "admin",
          "apply_to_application": true
        }
      ]
    }
  ]
}
{
  "applications": [
    {
      "name": "Sample App",
      "application_type": "sample",
      "description": "This is a sample app",
      "local_users": [
        {
          "name": "bob",
          "identities": [
            "bob@example.com"
          ],
          "is_active": true,
          "created_at": "2022-01-26T20:48:12.460Z",
          "id": "0000000001"
        },
        {
          "name": "jane",
          "identities": [
            "jane@example.com"
          ],
          "created_at": "2021-08-13T06:28:13.250Z",
          "id": "0000000002"
        }
      ],
      "local_groups": [],
      "local_roles": [
        {
          "name": "admin",
          "permissions": [
            "manage_users"
          ],
          "tags": [],
          "custom_properties": {}
        },
        {
          "name": "user",
          "permissions": [
            "view_tickets",
            "close_tickets"
          ],
          "tags": [],
          "custom_properties": {}
        }
      ],
      "tags": [],
      "custom_properties": {},
      "resources": []
    }
  ],
  "permissions": [
    {
      "name": "manage_users",
      "permission_type": [
        "MetadataWrite"
      ],
      "apply_to_sub_resources": false,
      "resource_types": []
    },
    {
      "name": "view_tickets",
      "permission_type": [
        "DataRead"
      ],
      "apply_to_sub_resources": false,
      "resource_types": []
    },
    {
      "name": "close_tickets",
      "permission_type": [
        "MetadataWrite"
      ],
      "apply_to_sub_resources": false,
      "resource_types": []
    }
  ],
  "identity_to_permissions": [
    {
      "identity": "0000000001",
      "identity_type": "local_user",
      "role_assignments": [
        {
          "application": "Sample App",
          "role": "user",
          "apply_to_application": true,
          "resources": []
        }
      ]
    },
    {
      "identity": "0000000002",
      "identity_type": "local_user",
      "role_assignments": [
        {
          "application": "Sample App",
          "role": "user",
          "apply_to_application": true,
          "resources": []
        },
        {
          "application": "Sample App",
          "role": "admin",
          "apply_to_application": true,
          "resources": []
        }
      ]
    }
  ]
}
  "custom_property_definition": {
    "applications": [
      {
        "application_type": "sample",
        "application_properties": {},
        "local_user_properties": {
          "license_type": "STRING",
          "license_expires": "TIMESTAMP"
        },
        "local_group_properties": {},
        "local_role_properties": {},
        "resources": []
      }
    ]
  }
      "local_users": [
        {
          "name": "bob",
          "identities": [
            "bob@example.com"
          ],
          "groups": null,
          "is_active": true,
          "created_at": "2022-01-26T20:48:12.460Z",
          "last_login_at": null,
          "deactivated_at": null,
          "password_last_changed_at": null,
          "tags": [],
          "custom_properties": {
            "license_type": "pro",
            "license_expires": "2023-01-01T00:00:00.000Z"
          }
        }
      ]
{
  "applications": [
    {
      "name": "Custom App",
      "application_type": "Source Control",
      "description": "Has a resource for each repository",
      "custom_properties": {},
      "tags": [],
      "local_users": [],
      "local_groups": [],
      "local_roles": [],
      "resources": []
    }
  ]
}
"resources": [
  {
    "name": "Entity1",
    "id": "Unique ID",
    "resource_type": "thing",
    "description": "Some entity in the application",
    "sub_resources": [
      {
        "name": "Child 1",
        "resource_type": "child",
        "description": "My information about resource",
        "sub_resources": [],
        "custom_properties": {},
        "tags": []
      }
    ],
    "custom_properties": {},
    "tags": []
  },
  {
    "name": "Entity2",
    "id": "Another Unique ID",
    "resource_type": "thing",
    "description": "Another entity in the application",
    "sub_resources": [],
    "custom_properties": {},
    "tags": []
  }
]
{
  "name": "cog1",
  "resource_type": "cog",
  "connections": [
    {
      "id": "service_account@some-project.iam.gserviceaccount.com",
      "node_type": "GoogleCloudServiceAccount"
     }
  ]
}
"local_users": [
  {
    "name": "Evan Gray",
    "unique_id": "egray",
    "identities": ["egray@idp.net"],
    "groups": ["contractors"],
    "is_active": true,
    "created_at": "2020-12-19T16:39:57-08:00",
    "last_login_at": "2021-11-19T14:19:30-08:00",
    "password_last_changed_at": null,
    "deactivated_at": null,
    "custom_properties": {},
    "tags": []
   }
]
"local_groups": [
  {
    "name": "US Contractors",
    "unique_id": "us-contractors",
    "identities": ["user1@company.com"],
    "groups": [
      "all-contractors",
      "all-workers"
    ],
    "tags": []
  }
]
"local_roles": [
    {
        "name": "administrator",
        "unique_id": "0001",
        "permissions": ["create","destroy"]
    },
    {
        "name": "operator",
        "permissions": ["pull", "read"],
        "tags": []
    }
]

name

string

Name of the local role. Primary ID for mapping role to permissions.

unique_id

string

Optional identifier to use for permissions mapping

permissions

array

Permissions associated with the role. Must exist in permissions

tags

array

Specify tags with a key and optional value (optional)

"permissions": [
   {
     "name": "Admin",
     "permission_type": [
       "DataRead",
       "DataWrite",
       "MetadataRead",
       "MetadataWrite"
     ]
   },
   {
     "name": "Operator",
     "permission_type": [
       "MetadataRead",
       "DataRead"
     ]
   },
   {
     "name": "Inactive",
     "permission_type": [
       "NonData"
     ]
   }
 ]

name

string

Native permission name, such as “Push” (used to bind local and IdP identities to native permissions).

permission_type

enum

List of canonical privilege(s) the permission represents.

application_type

enum

Optional list of custom application application_type the permission applies to.

apply_to_sub_resources

bool

To more accurately model applications where permissions should apply to any children of a resource, set TRUE to define the permission as inheritable. This eliminates the need to include the permission at each sub level.

"identity_to_permissions": [
     {
       "identity": "Evan Gray",
       "identity_type": "local_user",
       "application_permissions": [
          {
           "application": "Veza AI",
           "resources": ["terraform-dev", "prod"],
           "permission": "pull"
         },
         {
           "application": "Veza AI",
           "resources": ["terraform-dev", "prod"],
           "permission": "push"
         }
       ]
     }
   ]

identity

string

Principal name or email address. Maps to IdP login email or group name.

identity_type

string

Sets whether the identity corresponds to an IdP identity, or is local to the application

application_permissions

array

List each local permission available to the identity (must be a valid permission name from the previous section).

role_assignments

array

Any roles assigned to the identity, and the resources they apply to (role/resource must exist in applications).

{
    "identity": "idpuser@org.co",
    "identity_type": "idp",
    "application_permissions":
    [
        {
            "application": "source control",
            "resources": ["util-tools", "terraform"],
            "apply_to_application": false,
            "permission": "write"
        },
        {
            "application": "source control",
            "resources": [],
            "apply_to_application": true,
            "permission": "read"
        }
    ]
}

application

string

Maps to an application name from the first section. Must exist in applications

resources

array

List of application resource or sub-resource names to apply the permission. Must exist in applications

apply_to_application

boolean

Set to true to model environments where permissions apply to the top-level application as well as its resources.

permission

string

Maps to a permission name from the second section. Must exist in permissions

{
    "identity": "john_smith",
    "identity_type": "local_user",
    "role_assignments":[
        {
            "application": "custom application",
            "role": "administrator",
            "apply_to_application": true,
            "resources": []
        },
        {
            "application": "custom application",
            "role": "ops",
            "apply_to_application": false,
            "resources": ["oaa-vm-1"]
        }
    ]
}

application

string

The application where the role applies. Must exist in applications

role

string

The role name. Must exist in local_roles

apply_to_application

boolean

Set to true to model environments where the role applies to the top-level application and all its resources.

resources

array

List of resources and sub-resources where the role applies. Must exist in applications

  "identity_to_permissions": [
    {
      "identity": "0000000001",
      "identity_type": "local_user",
      "role_assignments": [
        {
          "application": "Sample App",
          "role": "user",
          "apply_to_application": true,
          "resources": []
        }
      ]
    },
    {
      "identity": "0000000002",
      "identity_type": "local_user",
      "role_assignments": [
        {
          "application": "Sample App",
          "role": "user",
          "apply_to_application": true,
          "resources": []
        },
        {
          "application": "Sample App",
          "role": "admin",
          "apply_to_application": true,
          "resources": []
        }
      ]
    }
  ]
Custom Application Template
Custom Identity Provider Template
custom property definition
Custom properties
Veza Tags
incremental update
identity_to_permissions
creating an OAA provider

name

string

Identifies the app in Veza Search. Used to bind permissions to the application

application_type

string

Applied to all entities within the application as a searchable property. Multiple instances of an application can share the same type

description

string

Any additional notes to show in the entity details, limit 256 characters

custom_properties

dictionary

tags

array

Specify tags with a key and optional value (optional)

local_users

array

local_groups

array

local_roles

array

resources

array

name

string

Resource name. Primary ID for mapping users to individual resource permissions.

id

string

Optional value to use as the unique ID, instead of the resource name*.

resource_type

string

Searchable label for the resource type. The application entity details in Veza will show the contained resource types as properties.

description

string

Shown in Veza entity details, max 255 characters.

custom_properties

dictionary

sub_resources

array

Used for additional resource layers, nested data sources, services, and so on.

connections

Optional list of resource connections to external entities discovered by Veza

tags

array

Specify tags with a key and optional value (optional)

name

string

Name of the local user, shown in the Veza UI.

unique_id

string

Optional identifier to use for mapping users to groups, roles, and permissions.

identities

identities array

Maps the user to a federated identity by login email or group name. Use when your IdP provisions local accounts, or if the local user can be assumed by an external group. Must match a discovered Okta, Google Workspace, or Azure AD entity Name, PrincipalName, or Identity.

groups

groups array

is_active

boolean

If activity state is available from the provider, use this field to make the value available as a searchable property (optional).

created_at

RFC3339 string

User creation date (optional), for example 1996-12-19T16:39:57-08:00

last_login_at

RFC3339 string

(optional)

password_last_changed_at

RFC3339 string

(optional)

deactivated_at

RFC3339 string

(optional)

custom_properties

dictionary

tags

Specify tags with a key and optional value (optional)

name

string

Name of the local group. Primary ID for mapping group to permissions.

unique_id

string

Optional identifier to use for permissions mapping

custom_properties

dictionary

identities

array

If IdP users are members of the local group, or if the local group directly maps to an IdP group, list them here.*

groups

array

List of local group this group is a member of (for applications that support adding groups to other groups)

tags

array

Specify tags with a key and optional value (optional)

contain property_values validated against the custom_property_definition

Contains zero or more local users (see ).

Contains zero or more (collections of users).

Defines permissions for any within the application.

Contains any and sub-resources.

See .

list of any memberships as strings. Must exist in local groups.

See .

array

See .

Custom Properties
Custom Properties
Custom Properties
Custom Properties
local_identities
local groups
roles
resources
Resource Connections
group
tags