I started a Docker Compose cluster with a multitenant configuration of Camunda 8.8.1.
I followed this guide: https://docs.camunda.io/docs/apis-tools/web-modeler-api/authentication/
to create an application that can search all projects in Web Modeler.
I’m able to obtain the JWT token with the following call:
curl --location --request POST ‘http://localhost:18080/auth/realms/camunda-platform/protocol/openid-connect/token’
–header ‘Content-Type: application/x-www-form-urlencoded’
–data-urlencode “client_id=${CLIENT_ID}”
–data-urlencode “client_secret=${CLIENT_SECRET}”
–data-urlencode ‘grant_type=client_credentials’
My decoded JWT looks like this:
{
"exp": 1762180456,
"iat": 1762180156,
"jti": "trrtcc:bad662ac-f005-38cd-6d31-b3e012f41566",
"iss": "http://localhost:18080/auth/realms/camunda-platform",
"aud": [
"webmodelerconfigurator",
"web-modeler-api",
"camunda-identity-resource-server",
"account"
],
"sub": "519465b1-f09f-4dab-a52c-e8140cf467b0",
"typ": "Bearer",
"azp": "webmodelerconfigurator",
"acr": "1",
"allowed-origins": [],
"realm_access": {
"roles": [
"Default user role"
]
},
"resource_access": {
"web-modeler-api": {
"roles": [
"write:*",
"admin:*"
]
},
"camunda-identity-resource-server": {
"roles": [
"read:users",
"read",
"write"
]
},
"account": {
"roles": [
"manage-account",
"manage-account-links",
"view-profile"
]
}
},
"scope": "profile email",
"clientHost": "172.19.0.1",
"email_verified": false,
"permissions": {
"web-modeler-api": [
"write:*",
"admin:*"
],
"camunda-identity-resource-server": [
"read:users",
"read",
"write"
],
"account": [
"manage-account",
"manage-account-links",
"view-profile"
]
},
"preferred_username": "service-account-webmodelerconfigurator",
"clientAddress": "172.19.0.1",
"client_id": "webmodelerconfigurator"
}
But when I use it in my Swagger (at http://localhost:8070/swagger-ui/index.html#/Projects/searchProjects), I get an UNAUTHORIZED error.
The web-modeler-restapi cotainer say:
2025-11-03 14:31:32.710 WARN 1 --- [ XNIO-1 task-2] [311d2908-4e96-4c4b-a925-8e363f0cb8fe] s.a.j.SelfManagedPublicApiTokenConverter : Failed to verify audience claim for token: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJkOGFfZUp3QVFOd1l2LWNYVVY4RVBUczZ3STdHLXhaS1BGQXFsNnZrZWhNIn0.eyJleHAiOjE3NjIxODA1NDIsImlhdCI6MTc2MjE4MDI0MiwianRpIjoidHJydGNjOjlmNmJjYTZjLTFiYmUtNGYyZC1jYTliLTlkYzJlZGU5NTEyNyIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6MTgwODAvYXV0aC9yZWFsbXMvY2FtdW5kYS1wbGF0Zm9ybSIsImF1ZCI6WyJ3ZWJtb2RlbGVyY29uZmlndXJhdG9yIiwid2ViLW1vZGVsZXItYXBpIiwiY2FtdW5kYS1pZGVudGl0eS1yZXNvdXJjZS1zZXJ2ZXIiLCJhY2NvdW50Il0sInN1YiI6IjUxOTQ2NWIxLWYwOWYtNGRhYi1hNTJjLWU4MTQwY2Y0NjdiMCIsInR5cCI6IkJlYXJlciIsImF6cCI6IndlYm1vZGVsZXJjb25maWd1cmF0b3IiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIkRlZmF1bHQgdXNlciByb2xlIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsid2ViLW1vZGVsZXItYXBpIjp7InJvbGVzIjpbIndyaXRlOioiLCJhZG1pbjoqIl19LCJjYW11bmRhLWlkZW50aXR5LXJlc291cmNlLXNlcnZlciI6eyJyb2xlcyI6WyJyZWFkOnVzZXJzIiwicmVhZCIsIndyaXRlIl19LCJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJjbGllbnRIb3N0IjoiMTcyLjE5LjAuMSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicGVybWlzc2lvbnMiOnsid2ViLW1vZGVsZXItYXBpIjpbIndyaXRlOioiLCJhZG1pbjoqIl0sImNhbXVuZGEtaWRlbnRpdHktcmVzb3VyY2Utc2VydmVyIjpbInJlYWQ6dXNlcnMiLCJyZWFkIiwid3JpdGUiXSwiYWNjb3VudCI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19LCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJzZXJ2aWNlLWFjY291bnQtd2VibW9kZWxlcmNvbmZpZ3VyYXRvciIsImNsaWVudEFkZHJlc3MiOiIxNzIuMTkuMC4xIiwiY2xpZW50X2lkIjoid2VibW9kZWxlcmNvbmZpZ3VyYXRvciJ9.MMu7qXqKr4hftQsdSOUJNN_NAsuaAjOe0KXUzqb4BOyfWpjbMzrUV6NP4tsNLU8yaga-yVuZuriFUy_RCgK6cXCdEC0fZ3NBuc-hvdtDrc06ALgtPP5GpLwXQJfVkZxdG6rOR_yxZe9N1kIgLS2n2sdZZ7K4esBolZgjA6285H7nnGPYkAMzJvvmVNaYCFoOD6gxtwe79xNtzJsnrNQ9pEHFxST-O71-2jzO7hQZvkusclTfL2-4uh_Nv_-19x6VPLIwZNvih0oi3bb2rTVZopJ-FTM_bU1MkdH6vrUz-I4Ter1NEgvBD6kAYR9d4TxdFlk7C32zkP3HIMlcWHQecQ
2025-11-03 14:31:32.711 INFO 1 --- [ XNIO-1 task-2] [311d2908-4e96-4c4b-a925-8e363f0cb8fe] i.c.m.util.logging.RequestLoggingFilter : "POST /api/v1/projects/search, headers=[sec-fetch-mode:"cors", referer:"http://localhost:8070/swagger-ui/index.html", content-length:"50", sec-fetch-site:"same-origin", accept-language:"en,it-IT;q=0.9,it;q=0.8,en-US;q=0.7", origin:"http://localhost:8070", Connection:"keep-alive", x-correlation-id:"311d2908-4e96-4c4b-a925-8e363f0cb8fe", Host:"web-modeler-restapi:8081", accept:"application/json", accept-charset:"utf-8", authorization:"masked", sec-ch-ua:""Chromium";v="142", "Google Chrome";v="142", "Not_A Brand";v="99"", sec-ch-ua-mobile:"?0", sec-ch-ua-platform:""Windows"", accept-encoding:"gzip, deflate, br, zstd", user-agent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36", sec-fetch-dest:"empty", Content-Type:"application/json;charset=UTF-8"]" - 401 UNAUTHORIZED
I get the same behavior with a cURL call like this:
curl --request POST \
--url "http://localhost:8070/api/v1/projects/search" \
--header 'accept: application/json' \
--header "authorization: Bearer ${CAMUNDA_OAUTH_TOKEN}" \
--header 'content-type: application/json' \
--data "$PAYLOAD"
What is the problem?

