Configure IBM Verify for agentic IAM
Enterprise
Appropriate Vault Enterprise license or HCP Vault Dedicated cluster required.
Configure users and OIDC applications in IBM Verify to use with Vault Enterprise agentic IAM.
The following diagram shows how the objects you configure in Verify work together.

The human user and agent user sign in to the authentication application, which issues a JWT access token for each of them. A separate token exchange application sends both tokens to Verify, where the STS client exchanges them for a delegated on-behalf-of (OBO) JWT.
The STS client uses the authorization detail type to validate the Rich Authorization Requests (RAR) claim in the delegated JWT. Vault validates the delegated JWT. The API client gives your application access to the Verify management APIs and is not part of the token flow.
Before you start
You must have an IBM Verify tenant. If you do not have a tenant, you can sign up for a free trial to evaluate the integration process.
You must have the
oauth2cCLI. You needoauth2cinstalled and in your systemPATHto interact with OAuth 2.0 authorization servers.You must have
curlor some other tool to make API calls.You must have
jqinstalled to use the example commands as written.
Step 1: Create users in Verify
You need to create accounts for the human user and agent user in Verify and note their user IDs.
Access your Verify tenant as an admin user.
Create and configure a user account for the human user that will use the AI agent or application.
- Click Directory in the navigation menu.
- Click Users & groups.
- Click Add user.
- Select an identity provider, such as IBMid or your preferred provider.
- In the User name field, enter a username value.
- In the Preferred e-mail field, enter a valid email address.
- Click Save.
Find and note the user ID:
- Click Directory.
- Click Users & groups.
- For the user you just created, click the User details icon.
- The user ID appears on the user profile page. You need this user ID value to later configure the external ID in the Vault entity alias.

Repeat the process to create a user account for the agent or other AI application that will act on behalf of a human user and note the agent user ID.
Step 2: Create an OIDC application in Verify
Configure a public or a confidential client OIDC application that issues JWT access tokens for the user and the agent or AI application that performs operations on behalf of the user.
Access your Verify tenant as an admin user.
In the navigation menu, click Applications → Applications.
Click Add an application.
For application type, click OpenID Connect.

Click Add Application.
Under OpenID Connect enter a name for the application. For example,
vault-authn-entry.Update the Description field as necessary.
For Company name, enter the required value.
Click Add owner to assign an admin user as the owner of this application.
Enter an admin username in the search field.
Click an admin user to highlight it.
Click OK to assign the admin user to this application.
Step 3: Configure sign-on for the application

Click Sign-on to configure the application sign on settings.
In the Application URL field, enter the main URL or home page of the app to add as the resource server. The application URL is the entry point of the user to interact with the application. You can configure the application URL to be appropriate for your AI application UI or chat interface.
Enable the necessary grant types. Browser driven flows use the Authorization code grant, and the resource server needs Client Credentials to authenticate with the authorization server to exchange the code for the security token.
For Grant types, click and enable the following:
- Authorization code.
- Client credentials.
- Resource owner password credentials (ROPC)
For Response types click the response of the Authorization server when the user authenticates. Click the checkbox for code to use an Authz Code Grant flow.
For Response modes uncheck every mode except for query.
Ensure that Public client (no client secret) is unchecked to enforce a private client application.

In the Redirect URIs field, enter a valid URI for the authorization server redirect to the URL containing the code as a query parameter.
Under Token settings > Access token format, select JWT.
Click the Generate refresh token checkbox.

Click Save to save the application settings.
After saving the application, you arrive at the Entitlements tab where you must click the Automatic access for all users and groups radio button to enable access.
Click Save to save the application settings.
When prompted to update the workflow, click OK.
Step 4: Configure an "on behalf of" relationship
Configure the on behalf of (OBO) relationship between the user/subject and the
agent or AI application. You must configure the act and may_act claims in
the configured OIDC application introspection endpoints.
Click Applications → Applications.
Click the gear icon next to your application name to open settings.
Click Sign-on.
Scroll down to Client ID and copy the value. Note and save the Client ID for configuring custom request rules later.

Scroll down to Endpoint configuration.
Next to the Introspect settings, click the edit icon that resembles a pencil.

Click the arrow next to Add attribute.
Click Add custom rule.
Within the Request rule text area, enter the following JSON which uses the client ID of the OIDC application. Paste the client ID value you just copied to replace the "CLIENT_ID" placeholder text.
{"client_id":"CLIENT_ID"}Click OK.
Map the custom rule to the Target attribute
may_act.
Click OK.
Scroll down to Custom scopes and API access.
Prevent the client from requesting unknown scopes by checking Restrict custom scopes.
Add
emailto a custom scope.Add
openidto a custom scope.Add
profileto a custom scope.Click Save.
Step 5: Configure API client access
Configure a new API client for the IBM Verify tenant for API access:
In the navigation menu, click Security.
Click Add API client.
Click the checkbox for each client access entitlement that your agent or AI application use case requires.
Click Next.
The client ID gets automatically generated. Choose the client authentication method your use case requires or leave at Default.
Click Next.
Leave the custom scopes which the client can request unchanged unless your use case requires changing them.
Click Next.
Leave the IP filtering setting unchanged unless you need to filter the client API access by IP address or CIDR.
Click Next.
If your use case requires additional properties, enter their names and values. The screenshot show just an example value. Use your actual values.
click Next.
In the Name field, enter a machine friendly name like
hashicups-print-agent. Add a description and any tags as well.Click Create API client.
For more detailed configuration options, refer to the Verify API documenation.
Step 6: Create authorization detail type in Verify
You need to create an authorization details schema to define how information gets structured, validated, and presented for consent during authentication flows.
Click Applications.
Click Authorization detail types.
Click Create.
Under General details, select the Custom radio button.
In the Name field, define a name for this authorization detail type, enter the string
vault:path_access.In the Description field, enter a description for the type.

In the Schema text area, paste the JSON schema defining the
authorization_detailsquery parameter:{ "type": "object", "required": [ "type", "path", "capabilities" ], "additionalProperties": false, "properties": { "type": { "const": "vault:path_access" }, "path": { "type": "string", "pattern": "^[A-Za-z0-9._/:-]+$" }, "capabilities": { "type": "array", "uniqueItems": true, "items": { "type": "string", "enum": [ "read", "create", "update", "delete", "sudo", "list", "deny" ] } } } }Leave Consent mapping settings unchanged, and click Next.
For Consent configuration method, select Inline HTML.
For Consent text, enter
<div>EXAMPLE CONSENT TEXT</div>.Click Create.
Step 7: Configure the secure token service client
Configure a security token service (STS) client for performing token exchange.
This STS client performs both the token exchange representing OBO semantics,
and the addition of an authorization_details Rich Authorization Requests
(RAR) claim.
Click Applications.
Click STS clients.
Click Add STS client.
Configure the general, authentication, token, proof-of-possession, and endpoint settings.
Leave the client authentication method at Default.
Click Next.
Define your custom scopes and API access:
Unless you need to relax any settings, you can leave everything except for Authorization detail types unchanged.
For Authorization detail types, select vault:path_access.
Check the box for all the user permissions your use case requires.
Click Next.
Click Complete setup. You do not need to apply an access policy.
Step 8: Create a token exchange application
Create a second OIDC application to request the delegated OBO token. Verify does not allow a client to exchange tokens that it issued itself.
In the navigation menu, click Applications → Applications.
Click Add an application.
For application type, click OpenID Connect.
Click Add Application.
Under OpenID Connect enter a name for the application. For example,
vault-obo-exchange.For Company name, enter the required value.
Click Add owner and assign an admin user as the owner of this application.
Click Sign-on.
For Grant types, click and enable Token exchange.
Ensure that Public client (no client secret) is unchecked.
Under Token settings > Access token format, select JWT.
Click Save.
On the Entitlements tab, click the Automatic access for all users and groups radio button.
Click Save.
Click Sign-on and note the Client ID and Client secret values. You need them to request the delegated token in Step 11.
Step 9: Validate token retrieval
Use the client ID and client secret of the authentication application from
Step 2 with the oauth2c tool to get a token from Verify as a validation step.
Get your application details:
Click Applications > Applications.
Click the gear icon next to the authentication application name, for example
vault-authn-entry, to open settings.Click Sign-on.
Scroll down to Client ID and copy the value; paste the value somewhere safe to use later.
Click the copy to clipboard icon next to Client secret and then paste the value somewhere safe to use later.
Open a new terminal.
Export your Verify tenant name, client ID, and secret as environment variables:
$ export IBM_VERIFY_TENANT="<tenant name>" \ IBM_VERIFY_CLIENT_ID="<authentication app client ID>" \ IBM_VERIFY_CLIENT_SECRET="<authentication app client secret>"Request an example token with the oauth2c command-line tool.
$ oauth2c https://"${IBM_VERIFY_TENANT}".verify.ibm.com/oauth2 \ --pkce \ --client-id "${IBM_VERIFY_CLIENT_ID}" \ --client-secret "${IBM_VERIFY_CLIENT_SECRET}" \ --response-types code \ --response-mode query \ --grant-type authorization_code \ --auth-method client_secret_basic --no-browserNote the URL under
Go to the following URL:in the output. Visit that URL in a browser to complete the authentication flow. The workflow then outputs more indicators of success....snip... SUCCESS Obtained authorization code ...snip... SUCCESS Exchanged authorization code for access token
The final output string after the SUCCESS messages represents the JWT value, which validates both the workflow and token issuance from Verify.
Step 10: Retrieve the human and agent tokens
Use the same oauth2c authorization code flow from Step 9 to get an access
token for each user. The human user token is the subject token, and the agent
user token is the actor token.
Run the
oauth2ccommand from Step 9.Visit the URL under
Go to the following URL:and sign in as the human user you created in Step 1.Copy the
access_tokenvalue from the token response in theoauth2coutput, and export it as theHUMAN_TOKENenvironment variable.$ export HUMAN_TOKEN="<human user access token>"Sign out of Verify, or open a private browser window, so that the next sign-in does not reuse the human user session.
Run the
oauth2ccommand again, and sign in as the agent user you created in Step 1.Copy the
access_tokenvalue from the output, and export it as theAGENT_TOKENenvironment variable.$ export AGENT_TOKEN="<agent user access token>"
Step 11: Validate token exchange
Exchange the human user (subject) and AI agent (actor) tokens for a delegated
token with a RAR authorization_details claim. Use the client ID and client
secret of the token exchange application from Step 8, not the authentication
application from Step 2.
Export the token exchange application client ID and client secret as environment variables.
$ export IBM_VERIFY_OBO_CLIENT_ID="<token exchange app client ID>" \ IBM_VERIFY_OBO_CLIENT_SECRET="<token exchange app client secret>"Request the token exchange and export the result as the
DELEGATED_JWTenvironment variable. The request uses theIBM_VERIFY_TENANTenvironment variable from Step 9 to build your tenant token endpoint URL. Replace thepathvalue inauthorization_detailswith the Vault path your use case requires.$ export DELEGATED_JWT=$(curl --request POST \ --url "https://${IBM_VERIFY_TENANT}.verify.ibm.com/oauth2/token" \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data grant_type=urn:ietf:params:oauth:grant-type:token-exchange \ --data subject_token="${HUMAN_TOKEN}" \ --data subject_token_type=urn:ietf:params:oauth:token-type:access_token \ --data actor_token="${AGENT_TOKEN}" \ --data actor_token_type=urn:ietf:params:oauth:token-type:access_token \ --data client_id="${IBM_VERIFY_OBO_CLIENT_ID}" \ --data client_secret="${IBM_VERIFY_OBO_CLIENT_SECRET}" \ --data 'authorization_details=[{"type":"vault:path_access","path":"secret-v2/data/shared-secret/foo", "capabilities":["create"]}]' | jq -r '.access_token')Confirm that
DELEGATED_JWTcontains a token rather thannull.$ echo "${DELEGATED_JWT}"
Step 12: Save your provider information
Confirm your subject and actor details from Verify. To configure agentic IAM, you must have the following information:
| Value | Environmental variable | Description |
|---|---|---|
| Delegated JWT | DELEGATED_JWT | The OBO with authorization details JWT as obtained after token exchange via the STS client. |
| Issuer URL | ISSUER | URL identifying the authentication entry point app itself |
| Human (subject) user ID | SUBJECT_EXT_ID | User ID of the subject user from your IdP application |
| AI (actor) user ID | ACTOR_EXT_ID | User ID of the actor user from your IdP application |
| Key endpoint | JWKS_URI | URL where clients can download public keys (JWKS) from your Verify instance |
We recommend setting the following environment variables to make Vault configuration more convenient:
$ export \
VAULT_ADDR="<your_vault_server_url>" \
VAULT_TOKEN="<token_string>" \
DELEGATED_JWT="<idp-issued-jwt>" \
SUBJECT_EXT_ID="<human_user_id>" \
ACTOR_EXT_ID="<ai_user_id>" \
JWKS_URI="<jwks_uri>" \
ISSUER="<issuer_uid>"
For example:
$ export \
VAULT_ADDR="http://127.0.0.1:8200" \
VAULT_TOKEN="hvs.000000000000000000000000" \
DELEGATED_JWT="000000...000000...signature_bytes_here..." \
SUBJECT_EXT_ID="0000000000" \
ACTOR_EXT_ID="0000000000" \
JWKS_URI="mydomain.verify.ibm.com/oauth2/jwks" \
ISSUER="mydomain.verify.ibm.com/oauth2"
Next steps
- Configure Vault to secure agentic workflows
- Configure Vault to secure OBO workflows
- Configure additional identity provides and authentication servers:

