JOSE Implementation Policy
General Information
Policy Type
policy-jose-implementation
Endpoints
List Policies
GET /apiops/projects/{projectName}/apiProxies/{apiProxyName}/policies/
Add Policy
POST /apiops/projects/{projectName}/apiProxies/{apiProxyName}/policies/{policyName}/
Update Policy
PUT /apiops/projects/{projectName}/apiProxies/{apiProxyName}/policies/{policyName}/
Delete Policy
DELETE /apiops/projects/{projectName}/apiProxies/{apiProxyName}/policies/{policyName}/
List Policies
Endpoint
GET /apiops/projects/{projectName}/apiProxies/{apiProxyName}/policies/
Request
Headers
| Header | Value |
|---|---|
| Authorization | Bearer {token} |
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectName | string | Yes | Project name |
| apiProxyName | string | Yes | API Proxy name |
Response
Success Response (200 OK)
{
"status": "SUCCESS",
"resultList": [
{
"apiProxy": {
"name": "MyAPI",
"requestPolicyList": [],
"responsePolicyList": [
{
"type": "policy-jose-implementation",
"name": "jose-implementation-policy",
"description": "Generate JOSE tokens",
"active": true,
"joseTarget": "BODY",
"joseTargetVariable": null,
"jwtClaimsClaim": null,
"escapeJsonString": false,
"addIssueTime": true,
"addJWTID": true,
"addIssuer": true,
"issuer": "https://myapi.com",
"addAudience": true,
"audienceList": ["api://myapi"],
"addSubject": true,
"subject": "user123",
"addTypeToHeader": true,
"typeValue": "JWT",
"addExpirationTime": true,
"expirationTimeValue": 3600,
"expirationTimeUnit": "SECONDS",
"additionalClaimMap": {
"role": {
"value": "admin",
"valueType": "STRING"
}
},
"sign": true,
"signByIssuer": true,
"jwkIdForValidationAndSign": null,
"encrypt": true,
"encryptByIssuer": true,
"jwkIdForDecryptionAndEncryption": null,
"encryptionMethod": "A128CBC_HS256",
"encodedClaimsTargetForDataManipulation": "BODY",
"decodedClaimsTargetVariableForDataManipulation": null
}
],
"errorPolicyList": []
}
}
],
"resultCount": 1
}
cURL Example
curl -X GET \
"https://demo.apinizer.com/apiops/projects/MyProject/apiProxies/MyAPI/policies/" \
-H "Authorization: Bearer YOUR_TOKEN"
Add Policy
Endpoint
POST /apiops/projects/{projectName}/apiProxies/{apiProxyName}/policies/{policyName}/
Request
Headers
| Header | Value |
|---|---|
| Authorization | Bearer {token} |
| Content-Type | application/json |
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectName | string | Yes | Project name |
| apiProxyName | string | Yes | API Proxy name |
| policyName | string | Yes | Policy name |
Request Body
Full JSON Body Example - Basic JWT Generation
{
"operationMetadata": {
"targetScope": "ALL",
"targetPipeline": "RESPONSE",
"deploy": true,
"deployTargetEnvironmentNameList": ["production"],
"order": 1
},
"policy": {
"type": "policy-jose-implementation",
"description": "Generate signed JWT tokens",
"active": true,
"joseTarget": "BODY",
"joseTargetVariable": null,
"jwtClaimsClaim": null,
"escapeJsonString": false,
"addIssueTime": true,
"addJWTID": true,
"addIssuer": true,
"issuer": "https://myapi.com",
"addAudience": true,
"audienceList": ["api://myapi"],
"addSubject": true,
"subject": "user123",
"addTypeToHeader": true,
"typeValue": "JWT",
"addExpirationTime": true,
"expirationTimeValue": 3600,
"expirationTimeUnit": "SECONDS",
"additionalClaimMap": {
"role": {
"value": "admin",
"valueType": "STRING"
},
"permissions": {
"value": "read,write",
"valueType": "STRING_LIST"
}
},
"sign": true,
"signByIssuer": true,
"jwkIdForValidationAndSign": null,
"encrypt": false,
"encryptByIssuer": true,
"jwkIdForDecryptionAndEncryption": null,
"encryptionMethod": null,
"encodedClaimsTargetForDataManipulation": "BODY",
"decodedClaimsTargetVariableForDataManipulation": null
}
}
Full JSON Body Example - Signed and Encrypted JWE
{
"operationMetadata": {
"targetScope": "ALL",
"targetPipeline": "RESPONSE",
"deploy": true,
"deployTargetEnvironmentNameList": ["production"],
"order": 1
},
"policy": {
"type": "policy-jose-implementation",
"description": "Generate signed and encrypted JWE tokens",
"active": true,
"joseTarget": "AUTHORIZATION_HEADER",
"joseTargetVariable": null,
"jwtClaimsClaim": null,
"escapeJsonString": false,
"addIssueTime": true,
"addJWTID": true,
"addIssuer": true,
"issuer": "https://myapi.com",
"addAudience": true,
"audienceList": ["api://myapi"],
"addSubject": true,
"subject": "user123",
"addTypeToHeader": true,
"typeValue": "JWT",
"addExpirationTime": true,
"expirationTimeValue": 3600,
"expirationTimeUnit": "SECONDS",
"additionalClaimMap": {
"role": {
"value": "admin",
"valueType": "STRING"
}
},
"sign": true,
"signByIssuer": true,
"jwkIdForValidationAndSign": null,
"encrypt": true,
"encryptByIssuer": true,
"jwkIdForDecryptionAndEncryption": null,
"encryptionMethod": "A128CBC_HS256",
"encodedClaimsTargetForDataManipulation": "BODY",
"decodedClaimsTargetVariableForDataManipulation": null
}
}
Full JSON Body Example - Using Proxy JWK
{
"operationMetadata": {
"targetScope": "ALL",
"targetPipeline": "RESPONSE",
"deploy": true,
"deployTargetEnvironmentNameList": ["production"],
"order": 1
},
"policy": {
"type": "policy-jose-implementation",
"description": "Generate JWT using proxy JWK",
"active": true,
"joseTarget": "BODY",
"joseTargetVariable": null,
"jwtClaimsClaim": null,
"escapeJsonString": false,
"addIssueTime": true,
"addJWTID": true,
"addIssuer": true,
"issuer": "https://myapi.com",
"addAudience": true,
"audienceList": ["api://myapi"],
"addSubject": true,
"subject": "user123",
"addTypeToHeader": true,
"typeValue": "JWT",
"addExpirationTime": true,
"expirationTimeValue": 3600,
"expirationTimeUnit": "SECONDS",
"additionalClaimMap": {},
"sign": true,
"signByIssuer": false,
"jwkIdForValidationAndSign": "my-signing-jwk-id",
"encrypt": true,
"encryptByIssuer": false,
"jwkIdForDecryptionAndEncryption": "my-encryption-jwk-id",
"encryptionMethod": "A256GCM",
"encodedClaimsTargetForDataManipulation": "BODY",
"decodedClaimsTargetVariableForDataManipulation": null
}
}
Full JSON Body Example - Minimal Configuration
{
"operationMetadata": {
"targetScope": "ALL",
"targetPipeline": "RESPONSE",
"deploy": true,
"deployTargetEnvironmentNameList": ["production"],
"order": 1
},
"policy": {
"type": "policy-jose-implementation",
"description": "Generate minimal JWT",
"active": true,
"joseTarget": "BODY",
"joseTargetVariable": null,
"jwtClaimsClaim": null,
"escapeJsonString": false,
"addIssueTime": false,
"addJWTID": false,
"addIssuer": false,
"issuer": null,
"addAudience": false,
"audienceList": [],
"addSubject": false,
"subject": null,
"addTypeToHeader": false,
"typeValue": null,
"addExpirationTime": false,
"expirationTimeValue": null,
"expirationTimeUnit": null,
"additionalClaimMap": {
"custom": {
"value": "value",
"valueType": "STRING"
}
},
"sign": false,
"signByIssuer": true,
"jwkIdForValidationAndSign": null,
"encrypt": false,
"encryptByIssuer": true,
"jwkIdForDecryptionAndEncryption": null,
"encryptionMethod": null,
"encodedClaimsTargetForDataManipulation": "BODY",
"decodedClaimsTargetVariableForDataManipulation": null
}
}
Full JSON Body Example - Variable Target
{
"operationMetadata": {
"targetScope": "ALL",
"targetPipeline": "RESPONSE",
"deploy": true,
"deployTargetEnvironmentNameList": ["production"],
"order": 1
},
"policy": {
"type": "policy-jose-implementation",
"description": "Generate JWT to variable",
"active": true,
"joseTarget": "CHOOSE_FROM_VARIABLE",
"joseTargetVariable": {
"type": "HEADER",
"headerName": "X-JWT-Token"
},
"jwtClaimsClaim": null,
"escapeJsonString": false,
"addIssueTime": true,
"addJWTID": true,
"addIssuer": true,
"issuer": "https://myapi.com",
"addAudience": true,
"audienceList": ["api://myapi"],
"addSubject": true,
"subject": "user123",
"addTypeToHeader": true,
"typeValue": "JWT",
"addExpirationTime": true,
"expirationTimeValue": 3600,
"expirationTimeUnit": "SECONDS",
"additionalClaimMap": {},
"sign": true,
"signByIssuer": true,
"jwkIdForValidationAndSign": null,
"encrypt": false,
"encryptByIssuer": true,
"jwkIdForDecryptionAndEncryption": null,
"encryptionMethod": null,
"encodedClaimsTargetForDataManipulation": "CHOOSE_FROM_VARIABLE",
"decodedClaimsTargetVariableForDataManipulation": {
"type": "HEADER",
"headerName": "X-Encoded-Claims"
}
}
}
Full JSON Body Example - DPoP Proof Generation
{
"operationMetadata": {
"targetScope": "ALL",
"targetPipeline": "REQUEST",
"deploy": true,
"deployTargetEnvironmentNameList": ["production"],
"order": 1
},
"policy": {
"type": "policy-jose-implementation",
"description": "Generate DPoP proof for sender-constrained token protection",
"active": true,
"enableDpop": true,
"dpopProofHeaderName": "DPoP",
"dpopHtuSource": "MANUAL",
"dpopHtu": "https://upstream-api.example.com/v1/resource",
"dpopHtm": null,
"dpopAddAth": true,
"dpopAccessTokenSource": "AUTHORIZATION_HEADER",
"dpopAccessTokenVariable": null,
"dpopRewriteAuthorizationScheme": true,
"dpopNonceVariable": null,
"joseTarget": "EMPTY",
"joseTargetVariable": null,
"jwtClaimsClaim": null,
"escapeJsonString": false,
"addIssueTime": false,
"addJWTID": false,
"addIssuer": false,
"issuer": null,
"addAudience": false,
"audienceList": [],
"addSubject": false,
"subject": null,
"addTypeToHeader": false,
"typeValue": null,
"addExpirationTime": false,
"expirationTimeValue": null,
"expirationTimeUnit": null,
"additionalClaimMap": {},
"sign": true,
"signByIssuer": false,
"jwkIdForValidationAndSign": "dpop-key-id",
"encrypt": false,
"encryptByIssuer": true,
"jwkIdForDecryptionAndEncryption": null,
"encryptionMethod": null,
"encodedClaimsTargetForDataManipulation": "BODY",
"decodedClaimsTargetVariableForDataManipulation": null
}
}
Request Body Fields
operationMetadata
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| targetScope | string | Yes | - | Policy scope: ALL or ENDPOINT |
| targetEndpoint | string | No* | - | Endpoint path (required if targetScope=ENDPOINT) |
| targetEndpointHTTPMethod | string | No* | - | HTTP method (required if targetScope=ENDPOINT) |
| targetPipeline | string | Yes | - | Pipeline: REQUEST, RESPONSE, or ERROR |
| deploy | boolean | No | true | Whether to deploy after adding policy |
| deployTargetEnvironmentNameList | array | No | [] | List of environment names to deploy to |
| order | integer | No | null | Policy execution order (starts from 1) |
Enum: targetScope
ALL- Policy applies to all endpointsENDPOINT- Policy applies only to specified endpoint
Enum: targetPipeline
REQUEST- Executes in request pipeline (generates tokens for requests)RESPONSE- Executes in response pipeline (generates tokens for responses)ERROR- Executes in error pipeline
Enum: targetEndpointHTTPMethod
GET,POST,PUT,DELETE,PATCH,OPTIONS,HEAD
policy
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| type | string | Yes | - | Policy type: policy-jose-implementation |
| description | string | No | - | Policy description |
| active | boolean | No | true | Whether policy is active |
| joseTarget | string | Yes | BODY | JOSE target location. See EnumJoseImplementationSignedTarget |
| joseTargetVariable | object | No* | null | Variable for JOSE target (required if joseTarget=CHOOSE_FROM_VARIABLE). See VariableDTO |
| jwtClaimsClaim | string | No | null | JWT claims claim name (for nested claims) |
| escapeJsonString | boolean | No | false | Whether to escape JSON string values |
| addIssueTime | boolean | No | true | Whether to add issue time (iat) to JWT |
| addJWTID | boolean | No | true | Whether to add JWT ID (jti) to JWT |
| addIssuer | boolean | No | true | Whether to add issuer (iss) to JWT |
| issuer | string | No* | null | Issuer value (required if addIssuer=true) |
| addAudience | boolean | No | true | Whether to add audience (aud) to JWT |
| audienceList | array | No* | [] | Audience list (required if addAudience=true, at least one required) |
| addSubject | boolean | No | true | Whether to add subject (sub) to JWT |
| subject | string | No* | null | Subject value (required if addSubject=true) |
| addTypeToHeader | boolean | No | true | Whether to add type (typ) to header |
| typeValue | string | No* | null | Type value (required if addTypeToHeader=true) |
| addExpirationTime | boolean | No | true | Whether to add expiration time (exp) to JWT |
| expirationTimeValue | integer | No* | null | Expiration time value (required if addExpirationTime=true, must be > 0) |
| expirationTimeUnit | string | No* | null | Expiration time unit (required if addExpirationTime=true). See EnumTimeUnit |
| additionalClaimMap | object | No | Map of additional claims. See MapValue | |
| sign | boolean | No | true | Whether to sign JWT |
| signByIssuer | boolean | No | true | Sign by issuer (true) or by proxy's JWK (false) |
| jwkIdForValidationAndSign | string | No* | null | JWK ID for validation and signing (required if sign=true and signByIssuer=false) |
| encrypt | boolean | No | true | Whether to encrypt JWT |
| encryptByIssuer | boolean | No | true | Encrypt by issuer (true) or by proxy's JWK (false) |
| jwkIdForDecryptionAndEncryption | string | No* | null | JWK ID for decryption and encryption (required if encrypt=true and encryptByIssuer=false) |
| dynamicKeyForValidationAndSign | object | No | - | Dynamic HTTP key fetching configuration for the signing/validation key (see JoseDynamicKeyConfig Object) |
| dynamicKeyForDecryptionAndEncryption | object | No | - | Dynamic HTTP key fetching configuration for the encryption/decryption key (see JoseDynamicKeyConfig Object) |
| encryptionMethod | string | No* | null | Encryption method (required if encrypt=true). See EnumJwkEncryptionMethod |
| enableDpop | boolean | No | false | Enable DPoP proof generation for sender-constrained token protection |
| dpopProofHeaderName | string | No | "DPoP" | Header name for DPoP proof (RFC 9449). Default is the RFC 9449 header name (DPoP). |
| dpopHtuSource | string | No | "MANUAL" | Source for DPoP proof target URI: MANUAL (use dpopHtu) or BACKEND_ROUTING_ADDRESS (derive from backend routing) |
| dpopHtu | string | No* | null | DPoP proof target URI (required if dpopHtuSource=MANUAL). Supports variable substitution; query string and fragment are stripped |
| dpopHtm | string | No | null | DPoP proof HTTP method override (optional; defaults to request method). Supports variable substitution |
| dpopAddAth | boolean | No | true | Add access token hash to DPoP proof (RFC 9449 recommends true for token binding) |
| dpopAccessTokenSource | string | No | "AUTHORIZATION_HEADER" | Source of access token for DPoP: AUTHORIZATION_HEADER, BODY, or VARIABLE |
| dpopAccessTokenVariable | object | No* | null | Variable containing access token (required if dpopAccessTokenSource=VARIABLE). See VariableDTO |
| dpopRewriteAuthorizationScheme | boolean | No | true | Rewrite Authorization scheme from Bearer to DPoP (DPoP-protected servers require this) |
| dpopNonceVariable | object | No | null | Variable for DPoP nonce claim (server-provided replay protection, optional). See VariableDTO |
| encodedClaimsTargetForDataManipulation | string | No | BODY | Target for encoded claims data manipulation. See EnumJoseTarget |
| decodedClaimsTargetVariableForDataManipulation | object | No* | null | Variable for encoded claims target (required if encodedClaimsTargetForDataManipulation=CHOOSE_FROM_VARIABLE). See VariableDTO |
JoseDynamicKeyConfig Object
Configuration for fetching a JOSE key over HTTP. Present twice on the policy: dynamicKeyForValidationAndSign (signing/validation key) and dynamicKeyForDecryptionAndEncryption (encryption/decryption key). Used when keySourceMode is DYNAMIC_HTTP; ignored for an embedded JWK.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| keySourceMode | string | No | - | EMBEDDED for a stored JWK, DYNAMIC_HTTP to fetch over HTTP |
| httpRequest | object | No* | - | Key request definition (required when keySourceMode=DYNAMIC_HTTP) |
| keyExtractionVariable | object | No* | - | Variable that extracts the key from the response (required when keySourceMode=DYNAMIC_HTTP) |
| keyFormat | string | No | - | AUTO_DETECT, PUBLIC_KEY, PRIVATE_KEY, CERTIFICATE or JWK_JSON |
| keyAlgorithm | string | No | NONE | Key algorithm; NONE lets Apinizer auto-detect |
| keyKid | string | No | - | Key id (kid) to select from a JWK Set |
| enableCache | boolean | No | false | Cache the fetched key |
| cacheByVariable | object | No* | - | Variable used to build the key cache entry (required when enableCache=true) |
| keyCacheTtl | integer | No | 3600 | Key cache time-to-live in seconds |
| keyCacheCapacity | integer | No | - | Maximum number of cached key entries |
| keyRespectCacheInvalidationHeaders | boolean | No | true | Honour Cache-Control headers returned by the key endpoint |
| keyCacheStorageType | string | No | DISTRIBUTED | LOCAL or DISTRIBUTED |
| keyCacheConnectionTimeout | integer | No | 3 | Distributed key cache connection timeout in seconds |
| keyCacheErrorHandlingType | string | No | CONTINUE | Action when the cache service is unreachable: CONTINUE or FAIL |
| retryOnKeyError | boolean | No | true | On a cryptographic key error, invalidate the cache and fetch the key once more |
| invalidateCacheOnValidationError | boolean | No | - | Invalidate the cached key when validation fails |
| httpRetrySettings | object | No | - | Retry settings for the key-fetch HTTP call itself (see RetrySettings Object) |
httpRequest fields:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| endpointUrl | string | No* | - | Full endpoint URL (endpointUrl or baseUrl is required) |
| baseUrl | string | No* | - | Base URL, used when endpointUrl is relative |
| httpMethod | string | No | - | HTTP method of the key request |
| headerList | array | No | [] | Request headers as { "name": "...", "value": "..." } |
| parameterList | array | No | [] | Query parameters as { "name": "...", "value": "..." } |
| bodyType | string | No | - | NONE, RAW, FORM_DATA, URL_ENCODED or BINARY |
| requestBody | string | No | - | Raw request body (used when bodyType=RAW) |
| formDataList | array | No | [] | Form-data fields (key, value, fieldType, fileName, contentType) |
| urlEncodedList | array | No | [] | x-www-form-urlencoded fields, same shape as formDataList |
| timeout | integer | No | - | Request timeout in seconds |
RetrySettings Object (httpRetrySettings):
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| enabled | boolean | No | false | Enable retry for the key request |
| retryCount | integer | No | 0 | Additional attempts after the first one |
| retryDelayType | string | No | NO_DELAY | NO_DELAY, FIXED or EXPONENTIAL |
| retryFixedDelayMs | integer | No | 500 | Fixed wait before each retry |
| retryInitialDelayMs | integer | No | 500 | Wait before the first retry (EXPONENTIAL) |
| retryMaxDelayMs | integer | No | 10000 | Upper bound for the growing wait |
| retryBackoffMultiplier | number | No | 2.0 | Growth factor per step, must be greater than 1 |
| retryOnStatusCodeList | array | No | [502, 503, 504] | HTTP status codes that trigger a retry |
| retryNonIdempotent | boolean | No | false | Allow retry for POST/PATCH on server responses |
retryOnKeyError and httpRetrySettings are different layers. retryOnKeyError clears the cached key and fetches it once more when the key itself is cryptographically unusable; httpRetrySettings retries the key request when it fails at the network level. Both can be enabled together — each fetch stays within its own retry limit.
Certificate and mTLS settings of the key request are not carried over the APIops API. They hold installation-specific secret material or ID references, so they are configured on the target installation; when an existing policy is updated, its current values are preserved.
Example — fetching the signing key over HTTP with cache and retry:
{
"name": "jose-dynamic-key-example",
"sign": true,
"signByIssuer": false,
"jwkIdForValidationAndSign": null,
"dynamicKeyForValidationAndSign": {
"keySourceMode": "DYNAMIC_HTTP",
"httpRequest": {
"endpointUrl": "https://idp.example.com/.well-known/jwks.json",
"httpMethod": "GET",
"headerList": [
{ "name": "Accept", "value": "application/json" }
],
"parameterList": [],
"bodyType": "NONE",
"timeout": 10
},
"keyExtractionVariable": {
"type": "BODY",
"bodyExpression": "$.keys[0]"
},
"keyFormat": "JWK_JSON",
"keyAlgorithm": "NONE",
"keyKid": "signing-key-1",
"enableCache": true,
"cacheByVariable": {
"type": "CONTEXT_VALUE",
"contextValue": "API_PROXY_NAME"
},
"keyCacheTtl": 3600,
"keyCacheCapacity": 100,
"keyRespectCacheInvalidationHeaders": true,
"keyCacheStorageType": "DISTRIBUTED",
"keyCacheConnectionTimeout": 3,
"keyCacheErrorHandlingType": "CONTINUE",
"retryOnKeyError": true,
"httpRetrySettings": {
"enabled": true,
"retryCount": 2,
"retryDelayType": "EXPONENTIAL",
"retryInitialDelayMs": 500,
"retryMaxDelayMs": 10000,
"retryBackoffMultiplier": 2.0,
"retryOnStatusCodeList": [502, 503, 504],
"retryNonIdempotent": false
}
}
}
In this example the key is fetched from a JWKS endpoint and cached for an hour. If the endpoint cannot be reached, the request is retried up to two more times with an exponentially growing wait. If the fetched key later turns out to be cryptographically unusable, retryOnKeyError clears the cache and fetches it once more.
EnumJoseImplementationSignedTarget
BODY- Place JOSE token in request/response bodyAUTHORIZATION_HEADER- Place JOSE token in Authorization headerCHOOSE_FROM_VARIABLE- Place JOSE token location specified by variable (requiresjoseTargetVariable)EMPTY- Do not place token (for internal use only)
EnumTimeUnit
MILLI_SECONDS- MillisecondsSECONDS- SecondsMINUTES- MinutesHOURS- HoursDAYS- DaysWEEKS- WeeksMONTHS- MonthsYEARS- Years
EnumJwkEncryptionMethod
A128CBC_HS256- AES-128-CBC with HMAC-SHA-256 (recommended)A192CBC_HS384- AES-192-CBC with HMAC-SHA-384A256CBC_HS512- AES-256-CBC with HMAC-SHA-512A128CBC_HS256_DEPRECATED- AES-128-CBC with HMAC-SHA-256 (deprecated)A256CBC_HS512_DEPRECATED- AES-256-CBC with HMAC-SHA-512 (deprecated)A128GCM- AES-128-GCMA192GCM- AES-192-GCMA256GCM- AES-256-GCM (recommended for GCM)XC20P- XChaCha20-Poly1305
EnumDpopHtuSource
MANUAL- Use dpopHtu value (recommended for reverse proxy / TLS termination scenarios)BACKEND_ROUTING_ADDRESS- Derive htu from gateway's routed backend address (best-effort; may differ in load-balancer / failover scenarios)
EnumDpopAccessTokenSource
AUTHORIZATION_HEADER- Fetch access token from Authorization headerBODY- Fetch access token from request/response bodyVARIABLE- Fetch access token from variable (requiresdpopAccessTokenVariable)
EnumJoseTarget
BODY- Place encoded claims in request/response bodyAUTHORIZATION_HEADER- Place encoded claims in Authorization headerCHOOSE_FROM_VARIABLE- Place encoded claims in variable (requiresdecodedClaimsTargetVariableForDataManipulation)
Note
- If
enableDpop: true, JWT claim fields (addIssueTime,addJWTID,addIssuer,addAudience,addSubject,addExpirationTime,additionalClaimMap,encrypt) are ignored; only proof generation is active.sign: trueand asymmetric JWK (signByIssuer: false+jwkIdForValidationAndSign) are mandatory. - If
enableDpop: trueanddpopHtuSource: MANUAL,dpopHtuis required. - If
dpopAccessTokenSource: VARIABLE,dpopAccessTokenVariableis required. - If
dpopAddAth: true, access token must be available from specified source. - If
joseTarget: CHOOSE_FROM_VARIABLE,joseTargetVariableis required. - If
addIssuer: true,issueris required. - If
addAudience: true,audienceListis required and must contain at least one value. - If
addSubject: true,subjectis required. - If
addTypeToHeader: true,typeValueis required. - If
addExpirationTime: true, bothexpirationTimeValue(must be > 0) andexpirationTimeUnitare required. - If
sign: trueandsignByIssuer: false,jwkIdForValidationAndSignis required. - If
encrypt: true,encryptionMethodis required. - If
encrypt: trueandencryptByIssuer: false,jwkIdForDecryptionAndEncryptionis required. - If
encodedClaimsTargetForDataManipulation: CHOOSE_FROM_VARIABLE,decodedClaimsTargetVariableForDataManipulationis required.
VariableDTO
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | No | - | Variable ID (if referencing existing variable) |
| projectId | string | No | - | Project ID (if referencing existing variable) |
| name | string | No* | - | Variable name (required if id not provided) |
| description | string | No | - | Variable description |
| type | string | Yes | - | Variable type: HEADER, PARAMETER, BODY, CONTEXT_VALUES, CUSTOM |
| headerName | string | No* | - | Header name (required if type=HEADER) |
| paramType | string | No* | - | Parameter type: QUERY, PATH, FORM (required if type=PARAMETER) |
| paramName | string | No* | - | Parameter name (required if type=PARAMETER) |
| paramPath | string | No | - | Parameter path |
| formName | string | No | - | Form name (for form parameters) |
| xpathValue | string | No* | - | XPath value (required if type=BODY and content is XML) |
| jsonPathValue | string | No* | - | JSONPath value (required if type=BODY and content is JSON) |
| bodyJsonPath | string | No* | - | JSONPath value (alternative to jsonPathValue) |
| messageContentType | string | No* | - | Message content type: JSON, XML, FORM (required if type=BODY) |
| contextValue | string | No* | - | Context value (required if type=CONTEXT_VALUES) |
| zoneId | string | No | - | Zone ID (for date context values) |
| initWithScript | boolean | No | false | Initialize with script |
| scriptLanguage | string | No | - | Script language: GROOVY, JAVASCRIPT (required if initWithScript=true) |
| scriptBody | string | No | - | Script body (required if initWithScript=true) |
EnumVariableType
HEADER- HTTP headerPARAMETER- Query/path/form parameterBODY- Request/response bodyCONTEXT_VALUES- Context values (e.g., current time, IP address)CUSTOM- Custom variable (script-based)
EnumVariableParameterType
QUERY- Query parameterPATH- Path parameterFORM- Form parameter
EnumMessageContentType
JSON- JSON contentXML- XML contentFORM- Form content
EnumVariableContextValue
CURRENT_TIME- Current timestampCURRENT_DATE- Current dateCLIENT_IP- Client IP addressCLIENT_PORT- Client portSERVER_IP- Server IP addressSERVER_PORT- Server portREQUEST_METHOD- HTTP request methodREQUEST_URI- Request URIREQUEST_PATH- Request pathREQUEST_QUERY_STRING- Query stringREQUEST_PROTOCOL- Request protocolREQUEST_HOST- Request hostREQUEST_SCHEME- Request schemeRESPONSE_STATUS_CODE- Response status codeRESPONSE_STATUS_TEXT- Response status textAPI_PROXY_NAME- API Proxy nameAPI_PROXY_ID- API Proxy IDENDPOINT_NAME- Endpoint nameENDPOINT_ID- Endpoint IDENVIRONMENT_NAME- Environment nameENVIRONMENT_ID- Environment IDPROJECT_NAME- Project namePROJECT_ID- Project IDUSER_NAME- User nameUSER_ID- User IDORGANIZATION_NAME- Organization nameORGANIZATION_ID- Organization IDZONE_ID- Zone IDTIMEZONE_ID- Timezone ID
EnumScriptType
GROOVY- Groovy scriptJAVASCRIPT- JavaScript script
MapValue
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| value | string | Yes | - | Claim value |
| valueType | string | No | STRING | Value type. See MapValueType |
MapValueType
STRING- String valueBOOLEAN- Boolean valueINTEGER- Integer valueLONG- Long valueDOUBLE- Double valueFLOAT- Float valueSTRING_LIST- String list (comma-separated)URI- URI value
Response
Success Response (200 OK)
{
"status": "SUCCESS",
"deploymentResult": {
"success": true,
"deploymentResults": [
{
"environmentName": "production",
"success": true,
"message": "Deployment successful"
}
]
}
}
cURL Example
curl -X POST \
"https://demo.apinizer.com/apiops/projects/MyProject/apiProxies/MyAPI/policies/jose-implementation-policy/" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operationMetadata": {
"targetScope": "ALL",
"targetPipeline": "RESPONSE",
"deploy": true,
"deployTargetEnvironmentNameList": ["production"],
"order": 1
},
"policy": {
"type": "policy-jose-implementation",
"description": "Generate signed JWT tokens",
"active": true,
"joseTarget": "BODY",
"addIssueTime": true,
"addJWTID": true,
"addIssuer": true,
"issuer": "https://myapi.com",
"addAudience": true,
"audienceList": ["api://myapi"],
"addSubject": true,
"subject": "user123",
"addTypeToHeader": true,
"typeValue": "JWT",
"addExpirationTime": true,
"expirationTimeValue": 3600,
"expirationTimeUnit": "SECONDS",
"sign": true,
"signByIssuer": true,
"encrypt": false
}
}'
Update Policy
Endpoint
PUT /apiops/projects/{projectName}/apiProxies/{apiProxyName}/policies/{policyName}/
Request
Headers
| Header | Value |
|---|---|
| Authorization | Bearer {token} |
| Content-Type | application/json |
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectName | string | Yes | Project name |
| apiProxyName | string | Yes | API Proxy name |
| policyName | string | Yes | Policy name |
Request Body
Full JSON Body Example
{
"operationMetadata": {
"targetScope": "ALL",
"targetPipeline": "RESPONSE",
"deploy": true,
"deployTargetEnvironmentNameList": ["tester"],
"order": 1
},
"policy": {
"type": "policy-jose-implementation",
"description": "Updated: Generate signed JWT tokens with encryption",
"active": true,
"joseTarget": "BODY",
"joseTargetVariable": null,
"jwtClaimsClaim": null,
"escapeJsonString": false,
"addIssueTime": true,
"addJWTID": true,
"addIssuer": true,
"issuer": "https://myapi.com",
"addAudience": true,
"audienceList": ["api://myapi", "api://partners"],
"addSubject": true,
"subject": "user123",
"addTypeToHeader": true,
"typeValue": "JWT",
"addExpirationTime": true,
"expirationTimeValue": 7200,
"expirationTimeUnit": "SECONDS",
"additionalClaimMap": {
"role": {
"value": "admin",
"valueType": "STRING"
},
"permissions": {
"value": "read,write,delete",
"valueType": "STRING_LIST"
},
"department": {
"value": "engineering",
"valueType": "STRING"
}
},
"sign": true,
"signByIssuer": true,
"jwkIdForValidationAndSign": null,
"encrypt": true,
"encryptByIssuer": true,
"jwkIdForDecryptionAndEncryption": null,
"encryptionMethod": "A256GCM",
"encodedClaimsTargetForDataManipulation": "BODY",
"decodedClaimsTargetVariableForDataManipulation": null
}
}
Note: Request body structure is the same as Add Policy. All fields should be provided for update.
Response
Success Response (200 OK)
{
"status": "SUCCESS",
"deploymentResult": {
"success": true,
"deploymentResults": [
{
"environmentName": "production",
"success": true,
"message": "Deployment successful"
}
]
}
}
Delete Policy
Endpoint
DELETE /apiops/projects/{projectName}/apiProxies/{apiProxyName}/policies/{policyName}/
Request
Headers
| Header | Value |
|---|---|
| Authorization | Bearer {token} |
| Content-Type | application/json |
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectName | string | Yes | Project name |
| apiProxyName | string | Yes | API Proxy name |
| policyName | string | Yes | Policy name |
Request Body
Full JSON Body Example
{
"operationMetadata": {
"targetScope": "ALL",
"targetPipeline": "RESPONSE",
"deploy": false
}
}
Response
Success Response (200 OK)
{
"status": "SUCCESS",
"deploymentResult": {
"success": true,
"deploymentResults": []
}
}
Notes and Warnings
-
DPoP (RFC 9449) Proof Generation:
- Sender-constrained token protection: DPoP binds access tokens to the client's cryptographic key, preventing token theft/replay. Proof structure is fixed (htm, htu, iat, jti, typ=dpop+jwt); JWT claim fields are not used when
enableDpop: true. - Access token hash (ath): Include via
dpopAddAth: true(RFC recommends true). Hash is SHA-256 of base64url-encoded token. - Asymmetric signing required:
signByIssuer: false+jwkIdForValidationAndSignrequired (RSA/EC/EdDSA only; HMAC rejected). - Target URI (htu): Use
dpopHtuSource: MANUALand setdpopHtuexplicitly for reverse proxy / TLS termination scenarios.BACKEND_ROUTING_ADDRESSis best-effort; actual backend address may differ under load-balancer failover. - Authorization rewrite: Set
dpopRewriteAuthorizationScheme: trueto changeBearer <token>→DPoP <token>(DPoP-protected servers require DPoP scheme). - Nonce (server-provided replay protection): Optional; capture server's
DPoP-Nonceresponse header into a variable, then reference viadpopNonceVariableon next request.
- Sender-constrained token protection: DPoP binds access tokens to the client's cryptographic key, preventing token theft/replay. Proof structure is fixed (htm, htu, iat, jti, typ=dpop+jwt); JWT claim fields are not used when
-
JOSE Target:
BODY- Token is placed in request/response bodyAUTHORIZATION_HEADER- Token is placed in Authorization header (standard Bearer token)CHOOSE_FROM_VARIABLE- Token location is dynamic (specified by variable)EMPTY- Token is not placed (for internal use only; used in DPoP proof generation)
-
Standard Claims:
iat(Issue Time) - Added whenaddIssueTime: truejti(JWT ID) - Added whenaddJWTID: trueiss(Issuer) - Added whenaddIssuer: true(requiresissuer)aud(Audience) - Added whenaddAudience: true(requiresaudienceList)sub(Subject) - Added whenaddSubject: true(requiressubject)exp(Expiration Time) - Added whenaddExpirationTime: true(requiresexpirationTimeValueandexpirationTimeUnit)typ- Added to header whenaddTypeToHeader: true(requirestypeValue)
-
Signing:
- JWT can be signed for integrity and authenticity
- Signing key can come from issuer credentials or proxy JWK
- When
signByIssuer: false,jwkIdForValidationAndSignis required
-
Encryption:
- JWT can be encrypted to create JWE (JSON Web Encryption)
- Encryption method must be specified when
encrypt: true - Encryption key can come from issuer credentials or proxy JWK
- When
encryptByIssuer: false,jwkIdForDecryptionAndEncryptionis required
-
Encryption Methods:
A128CBC_HS256,A192CBC_HS384,A256CBC_HS512- AES-CBC with HMAC (recommended)A128GCM,A192GCM,A256GCM- AES-GCM (recommended for GCM)XC20P- XChaCha20-Poly1305 (modern, secure)- Deprecated methods should be avoided
-
Additional Claims:
- Custom claims can be added via
additionalClaimMap - Claims support various value types (STRING, BOOLEAN, INTEGER, LONG, DOUBLE, FLOAT, STRING_LIST, URI)
- Custom claims can be added via
-
Escape JSON String:
- When
escapeJsonString: true, JSON string values are escaped - Useful for nested JSON structures
- When
-
Performance: JOSE token generation adds cryptographic processing overhead. Use for necessary security only.
-
Pipeline:
REQUESTpipeline generates tokens for outgoing requestsRESPONSEpipeline generates tokens for outgoing responses
-
Error Handling: Invalid configuration or JWK failure causes policy to fail
-
Deployment: Policy changes require deployment to take effect. Set
deploy: trueor deploy manually.
Related Documentation
- List Policies - List all policies
- Add Policy - General policy addition guide
- Update Policy - General policy update guide
- Delete Policy - General policy deletion guide
- JOSE Validation Policy - Validate JOSE tokens