> ## Documentation Index
> Fetch the complete documentation index at: https://bloodhound.specterops.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Okta App Registration

> Create an API service application in Okta to authenticate the OpenHound Okta collector.

<img noZoom src="https://mintcdn.com/specterops/tTIczgde9H07oLXf/assets/enterprise-AND-community-edition-pill-tag.svg?fit=max&auto=format&n=tTIczgde9H07oLXf&q=85&s=ad49a576589f4d2a8081df77d07fdf56" alt="Applies to BloodHound Enterprise and CE" width="482" height="45" data-path="assets/enterprise-AND-community-edition-pill-tag.svg" />

The OpenHound Okta collector authenticates to the Okta API using an OAuth 2.0 service application with a public/private key pair.

To create the Okta application registration for the OpenHound Okta collector, follow the steps below.

<Steps>
  <Step title="Open the Applications page">
    In the Okta Admin Console, navigate to **Applications > Applications** and click **Create App Integration**.

    <Frame>
      <img src="https://mintcdn.com/specterops/vLZ2lUIRm_HibFmq/images/extensions/okta/okta-app-registration/app-registration1.png?fit=max&auto=format&n=vLZ2lUIRm_HibFmq&q=85&s=a92dad199d8319d6f0210fbec2727c45" alt="Okta Admin Console - Applications page" width="1206" height="762" data-path="images/extensions/okta/okta-app-registration/app-registration1.png" />
    </Frame>
  </Step>

  <Step title="Select API Services">
    In the **Create a new app integration** dialog, select **API Services** and click **Next**.

    <Frame>
      <img src="https://mintcdn.com/specterops/vLZ2lUIRm_HibFmq/images/extensions/okta/okta-app-registration/app-registration2.png?fit=max&auto=format&n=vLZ2lUIRm_HibFmq&q=85&s=7e11dc27f307556fecd1fb5ad91dda3a" alt="Create a new app integration - select API Services" width="1396" height="788" data-path="images/extensions/okta/okta-app-registration/app-registration2.png" />
    </Frame>
  </Step>

  <Step title="Name the application">
    Enter a name for the app integration and click **Save**.

    <Frame>
      <img src="https://mintcdn.com/specterops/qNfIJ1tRHGvzCfpH/images/extensions/okta/okta-app-registration/app-registration3.png?fit=max&auto=format&n=qNfIJ1tRHGvzCfpH&q=85&s=ae14f1a937ecf3dbb68dbc3074f5d4ab" alt="New API Services App Integration - name" width="1380" height="382" data-path="images/extensions/okta/okta-app-registration/app-registration3.png" />
    </Frame>
  </Step>

  <Step title="Configure public key authentication">
    After the application is created, you are taken to the **General** tab. Make a note of the newly created application's Client ID for the collector.

    <Frame>
      <img src="https://mintcdn.com/specterops/qNfIJ1tRHGvzCfpH/images/extensions/okta/okta-app-registration/app-registration4.png?fit=max&auto=format&n=qNfIJ1tRHGvzCfpH&q=85&s=8898af39f1a40ef134fc5cf6dcab0dcc" alt="OktaHound app - Client Credentials" width="1106" height="688" data-path="images/extensions/okta/okta-app-registration/app-registration4.png" />
    </Frame>

    Under **Client Credentials**, click **Edit** and change **Client authentication** from **Client secret** to **Public key / Private key**.

    <Frame>
      <img src="https://mintcdn.com/specterops/qNfIJ1tRHGvzCfpH/images/extensions/okta/okta-app-registration/app-registration5.png?fit=max&auto=format&n=qNfIJ1tRHGvzCfpH&q=85&s=5d11803201b3878472548cd9424322ba" alt="Switch to Public key / Private key authentication" width="996" height="1012" data-path="images/extensions/okta/okta-app-registration/app-registration5.png" />
    </Frame>
  </Step>

  <Step title="Generate a key pair">
    Under **PUBLIC KEYS**, click **Add key**, then click **Generate new key**.

    <Frame>
      <img src="https://mintcdn.com/specterops/qNfIJ1tRHGvzCfpH/images/extensions/okta/okta-app-registration/app-registration6.png?fit=max&auto=format&n=qNfIJ1tRHGvzCfpH&q=85&s=18be0d45ce99e111a8a758f68f7fcfdf" alt="Add a public key dialog" width="1006" height="580" data-path="images/extensions/okta/okta-app-registration/app-registration6.png" />
    </Frame>

    <Frame>
      <img src="https://mintcdn.com/specterops/qNfIJ1tRHGvzCfpH/images/extensions/okta/okta-app-registration/app-registration7.png?fit=max&auto=format&n=qNfIJ1tRHGvzCfpH&q=85&s=779e8c610ddd72de607a3f3d45e82ef8" alt="Generated key pair - copy the private key" width="1010" height="1250" data-path="images/extensions/okta/okta-app-registration/app-registration7.png" />
    </Frame>

    <Warning>Copy the private key (JSON) and store it securely — it is only displayed once.</Warning>

    Click **Done** to close the key dialog.
  </Step>

  <Step title="Save the credentials">
    Verify the key appears in the **PUBLIC KEYS** table, then click **Save**.

    <Frame>
      <img src="https://mintcdn.com/specterops/qNfIJ1tRHGvzCfpH/images/extensions/okta/okta-app-registration/app-registration8.png?fit=max&auto=format&n=qNfIJ1tRHGvzCfpH&q=85&s=ddbc7d6dae077d7230518d4b5e4b47a2" alt="Public key listed in credentials" width="1012" height="994" data-path="images/extensions/okta/okta-app-registration/app-registration8.png" />
    </Frame>

    Confirm the prompt that existing client secrets will no longer be used.

    <Frame>
      <img src="https://mintcdn.com/specterops/qNfIJ1tRHGvzCfpH/images/extensions/okta/okta-app-registration/app-registration9.png?fit=max&auto=format&n=qNfIJ1tRHGvzCfpH&q=85&s=2c136819c24915a97c43c21e605c38df" alt="Confirm client secret removal" width="690" height="316" data-path="images/extensions/okta/okta-app-registration/app-registration9.png" />
    </Frame>
  </Step>

  <Step title="Disable DPoP requirement">
    Uncheck the **Require Demonstrating of Proof of Possession (DPoP)** option and click **Save**.

    <Frame>
      <img src="https://mintcdn.com/specterops/vLZ2lUIRm_HibFmq/images/extensions/okta/okta-app-registration/app-registration10.png?fit=max&auto=format&n=vLZ2lUIRm_HibFmq&q=85&s=ea978901f72a265a82692c022b0614f1" alt="App General Settings" width="1032" height="876" data-path="images/extensions/okta/okta-app-registration/app-registration10.png" />
    </Frame>
  </Step>

  <Step title="Grant OAuth 2.0 scopes">
    Navigate to the **Okta API Scopes** tab and grant the scopes required by the OpenHound Okta collector.

    The Okta application registration used by the OpenHound Okta collector requires the following [OAuth 2.0 scopes](https://developer.okta.com/docs/api/oauth2/) for data collection to function correctly:

    | OAuth 2.0 Scope                                                                                                        | Description                                                                                  |
    | ---------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
    | `okta.agentPools.read`                                                                                                 | Allows the app to read agent pools in your Okta organization.                                |
    | `okta.apiTokens.read`                                                                                                  | Allows the app to read API Tokens in your Okta organization.                                 |
    | `okta.appGrants.read`                                                                                                  | Allows the app to read grants in your Okta organization.                                     |
    | [okta.apps.read](https://developer.okta.com/docs/api/openapi/okta-management/guides/permissions/#oktaappsread)         | Allows the app to read information about Apps in your Okta organization.                     |
    | `okta.authorizationServers.read`                                                                                       | Allows the app to read information about Authorization Servers in your Okta organization.    |
    | [okta.devices.read](https://developer.okta.com/docs/api/openapi/okta-management/guides/permissions/#oktadevicesread)   | Allows the app to read the existing device's profile and search devices.                     |
    | `okta.features.read`                                                                                                   | Allows the app to read information about features in your Okta organization.                 |
    | [okta.groups.read](https://developer.okta.com/docs/api/openapi/okta-management/guides/permissions/#oktagroupsread)     | Allows the app to read information about groups and their members in your Okta organization. |
    | `okta.idps.read`                                                                                                       | Allows the app to read information about Identity Providers in your Okta organization.       |
    | `okta.logs.read`                                                                                                       | Allows the app to read system log events in your Okta organization.                          |
    | `okta.oauthIntegrations.read`                                                                                          | Allows the app to read API service Integration instances in your Okta organization.          |
    | `okta.orgs.read`                                                                                                       | Allows the app to read organization-specific details about your Okta organization.           |
    | [okta.policies.read](https://developer.okta.com/docs/api/openapi/okta-management/guides/permissions/#oktapoliciesread) | Allows the app to read information about policies in your Okta organization.                 |
    | `okta.realmAssignments.read`                                                                                           | Allows a user to read realm assignments.                                                     |
    | [okta.realms.read](https://developer.okta.com/docs/api/openapi/okta-management/guides/permissions/#oktarealmsread)     | Allows the app to read the existing realms and their details.                                |
    | `okta.roles.read`                                                                                                      | Allows the app to read administrative role assignments for users in your Okta organization.  |
    | [okta.users.read](https://developer.okta.com/docs/api/openapi/okta-management/guides/permissions/#oktausersread)       | Allows the app to read the existing users' profiles and credentials.                         |

    <Note>
      Realm scopes are only available for tenants with the Okta Identity Governance add-on.
    </Note>
  </Step>

  <Step title="Assign admin role">
    Navigate to the **Admin roles** tab and assign the [**Super Administrator**](https://help.okta.com/en-us/content/topics/security/administrators-super-admin.htm) role.

    <Note>
      Less privileged Okta roles currently cannot be used to read role assignments and OAuth 2.0 grants.
      Due to the OAuth 2.0 scopes defined above, the OpenHound Okta collector will not be able to modify any data in the Okta organization.
    </Note>
  </Step>
</Steps>
