ojeker opened a new issue, #13408:
URL: https://github.com/apache/apisix/issues/13408

   ### Description
   
   Hi 
   
   After several tries, I am struck im making the two plugins talk to each 
other. Using a serverless-pre-function, I succeeded to extract the claim "sub" 
and put it the header "X-Userinfo-Sub".  authz-casbin does not read this 
header, it always reports the sub to be "anonymous" and blocks access to the 
upstream. I tried to tweak by setting the priorities (_meta.prirotity) of the 
plugins and function, but to no avail. Any help appreciated!
   
   My apisix.yaml:
   ```yaml
   routes:
     - id: users
       uris:
         - /
         - /*
       plugins:
         openid-connect:
           client_id: apisix
           client_secret: secret
           discovery: 
http://authz_srv:8080/default/.well-known/openid-configuration
           bearer_only: true
           use_jwks: true
           ssl_verify: false
   
         serverless-pre-function:
           phase: access
           functions:
           - |
             return function(conf, ctx)
               local core = require("apisix.core")
               local cjson = require("cjson.safe")
   
               local userinfo = core.request.header(ctx, "X-Userinfo")
               local claims = userinfo and 
cjson.decode(ngx.decode_base64(userinfo))
   
               if claims and claims.sub then
                 core.request.set_header(ctx, "X-Userinfo-Sub", claims.sub)
               end
             end
             
         authz-casbin:
           model_path: casbin/acl_model.conf
           policy_path: casbin/acl_perm.csv
           username: X-Userinfo-Sub
   
       upstream:
         type: roundrobin
         nodes:
           "upstream:80": 1
   
   #END
   ```
   
   Log entry telling me that casbin does not receive the header X-Userinfo-Sub: 
   
   `apisix    | 2026/05/21 06:05:19 [notice] 56#56: *155827 [lua] Log.lua:29: 
info(): INFORequest: anonymous, /your-route, GET ---> false`
   
   Full debug log of a failing request:
   
   ```
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] ctx.lua:281: 
__index(): serving ctx value from cache for key: uri
   apisix    | 2026/05/21 06:05:19 [info] 56#56: *155827 [lua] 
trusted-addresses.lua:46: is_trusted(): trusted_addresses_matcher is not 
initialized, client: 172.21.0.2, server: _, request: "GET /your-route 
HTTP/1.1", host: "apisix:9080", request_id: "78478a277d4f2315c320770460f0cbb9"
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] ctx.lua:281: 
__index(): serving ctx value from cache for key: scheme
   apisix    | 2026/05/21 06:05:19 [info] 56#56: *155827 [lua] ai.lua:77: 
match(): route match mode: ai_match, client: 172.21.0.2, server: _, request: 
"GET /your-route HTTP/1.1", host: "apisix:9080", request_id: 
"78478a277d4f2315c320770460f0cbb9"
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] ctx.lua:281: 
__index(): serving ctx value from cache for key: uri
   apisix    | 2026/05/21 06:05:19 [info] 56#56: *155827 [lua] ai.lua:80: 
match(): route cache key: /your-route, client: 172.21.0.2, server: _, request: 
"GET /your-route HTTP/1.1", host: "apisix:9080", request_id: 
"78478a277d4f2315c320770460f0cbb9"
   apisix    | 2026/05/21 06:05:19 [info] 56#56: *155827 [lua] init.lua:749: 
http_access_phase(): matched route: 
{"clean_handlers":{},"orig_modifiedIndex":1779343480,"modifiedIndex":1779343480,"key":"/routes/users","has_domain":true,"value":{"uris":["/","/*"],"status":1,"plugins":{"openid-connect":{"introspection_endpoint_auth_method":"client_secret_basic","logout_path":"/logout","token_endpoint_auth_method":"client_secret_basic","bearer_only":true,"introspection_interval":0,"use_jwks":true,"unauth_action":"auth","jwt_verification_cache_ignore":false,"use_pkce":false,"_meta":{},"client_jwt_assertion_expires_in":60,"set_access_token_header":true,"renew_access_token_on_expiry":true,"discovery":"http://authz_srv:8080/default/.well-known/openid-configuration","set_userinfo_header":true,"client_id":"apisix","scope":"openid","iat_slack":120,"ssl_verify":false,"accept_none_alg":false,"access_token_in_authorization_header":false,"accept_unsupported_alg":true,"timeout":3,"set_id_token_header";
 
:true,"force_reauthorize":false,"client_secret":"secret","use_nonce":false,"realm":"apisix","revoke_tokens_on_logout":false,"set_refresh_token_header":false,"jwk_expires_in":86400,"access_token_expires_leeway":0},"authz-casbin":{"casbin_enforcer":{"modelPath":"casbin/acl_model.conf","model":{"logger":{"logger":{"fatal":"function:
 0x7f10553fe590","FATAL":"FATAL","log":"function: 
0x7f10553fe2b0","OFF":"OFF","WARN":"WARN","error":"function: 
0x7f10553fe518","INFO":"INFO","DEBUG":"DEBUG","debug":"function: 
0x7f10553fe3b8","level":"DEBUG","level_order":1,"warn":"function: 
0x7f10553fe470","setLevel":"function: 
0x7f10553fe218","ERROR":"ERROR","getPrint":"function: 
0x7f10553fe368","append":"function: 0x7f10553fe120","info":"function: 
0x7f10553fe3f8","off":"function: 
0x7f1052c8bf68"}},"requiredSections":["r","p","e","m"],"modCount":4,"sectionNameMap":{"e":"policy_effect","m":"matchers","r":"request_definition","g":"role_definition","p":"policy_definition"},"model":{"e":{"e":{"RM":{},"value":"
 some(where (p_eft == 
allow))","key":"e","tokens":{},"priorityIndex":-1,"policy":{},"policyMap":{}}},"m":{"m":{"RM":{},"value":"keyMatch(r_sub,
 p_sub) && keyMatch(r_obj, p_obj) && keyMatch(r_act, 
p_act)","key":"m","tokens":{},"priorityIndex":-1,"policy":{},"policyMap":{}}},"p":{"p":{"RM":{},"value":"sub,
 obj, 
act","key":"p","tokens":["p_sub","p_obj","p_act"],"priorityIndex":-1,"policy":[["reader","/kbs*","GET"],["writer","/kbs*","*"]],"policyMap":{"reader,/kbs*,GET":1,"writer,/kbs*,*":2}}},"r":{"r":{"RM":{},"value":"sub,
 obj, 
act","key":"r","tokens":["r_sub","r_obj","r_act"],"priorityIndex":-1,"policy":{},"policyMap":{}}}},"PolicyOperations":{"POLICY_ADD":"POLICY_ADD","POLICY_REMOVE":"POLICY_REMOVE"}},"autoBuildRoleLinks":true,"enabled":true,"adapter":{"filePath":"casbin/acl_perm.csv"},"autoSave":true,"rmMap":{},"autoNotifyDispatcher":true},"policy_path":"casbin/acl_perm.csv","_meta":{},"model_path":"casbin/acl_model.conf","username":"X-Userinfo-Sub"},"serverless-pre-function":{"_met
 a":{},"phase":"access","functions":["return function(conf, ctx)\n  local core 
= require(\"apisix.core\")\n  local cjson = require(\"cjson.safe\")\n\n  local 
userinfo = core.request.header(ctx, \"X-Userinfo\")\n  local claims = userinfo 
and cjson.decode(ngx.decode_base64(userinfo))\n\n  if claims and claims.sub 
then\n    core.request.set_header(ctx, \"X-Userinfo-Sub\", claims.sub)\n  
end\nend\n"]}},"id":"users","upstream":{"resource_id":"users","pass_host":"pass","hash_on":"vars","resource_key":"/routes/users","scheme":"http","nodes":[{"weight":1,"port":80,"host":"upstream"}],"resource_version":1779343480,"type":"roundrobin","dns_nodes":"table:
 0x7f1052fc9008"},"priority":0}}, client: 172.21.0.2, server: _, request: "GET 
/your-route HTTP/1.1", host: "apisix:9080", request_id: 
"78478a277d4f2315c320770460f0cbb9"
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] ctx.lua:281: 
__index(): serving ctx value from cache for key: request_uri
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] ctx.lua:281: 
__index(): serving ctx value from cache for key: uri
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] 
openid-connect.lua:653: phase_func(): auto set redirect_uri: 
/your-route/.apisix/redirect
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] 
openidc.lua:555: openidc_discover(): openidc_discover: URL is: 
http://authz_srv:8080/default/.well-known/openid-configuration
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] 
openidc.lua:117: openidc_cache_get(): cache hit: type=discovery 
key=http://authz_srv:8080/default/.well-known/openid-configuration
   apisix    | 2026/05/21 06:05:19 [info] 56#56: *155827 [lua] 
openid-connect.lua:519: introspect(): valid_issuers not provided explicitly, 
using issuer from discovery doc: http://authz_srv:8080/default, client: 
172.21.0.2, server: _, request: "GET /your-route HTTP/1.1", host: 
"apisix:9080", request_id: "78478a277d4f2315c320770460f0cbb9"
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] 
openidc.lua:1924: bearer_jwt_verify(): access_token: 
eyJraWQiOiJkZWZhdWx0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJyZWFkZXIiLCJuYmYiOjE3NzkzNDE5NTEsImlzcyI6Imh0dHA6Ly9hdXRoel9zcnY6ODA4MC9kZWZhdWx0IiwiZXhwIjoxNzc5MzQ1NTUxLCJpYXQiOjE3NzkzNDE5NTEsImp0aSI6IjRlNmI0YTcwLTRjM2EtNDU2MS05ZjBkLTNkMWEyMjg0MjI4MyIsInRpZCI6ImRlZmF1bHQifQ.WjEGdYLeDMYEAz2wB0bJmFzSP8xmy5ks5UhoBrUxat99dwDX7uf4agVUSfRKJhaa6C6ZIMRyv2KWLgwne37VRy9eyeuCh08Lot8xRGUg4jvxIgbX96irvAMGPb6EnhVIfLFCzvw0231bN0ySd4cUwqISkn96h4-PKFIiRQNEsy-pxUfVgX8CTenMBi8NWlPEPjmBnsHmGdn_kEJYrSq1Qh3DR012HUVk71Xe1sM96G2FQmwAXSGp4R0AABw_abdr1-uj4rvmg63EyGc3MplxI4qDumqy3UkRNiUXCtZx9l6eog9W870KeHqxlIKfO6hhyDB883lfAqM0fGoPbBhTsw
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] 
openidc.lua:1012: openidc_load_jwt_and_verify_crypto(): using discovery to find 
key
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] 
openidc.lua:117: openidc_cache_get(): cache hit: type=jwks 
key=http://authz_srv:8080/default/jwks#default
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] 
openidc.lua:1040: openidc_load_jwt_and_verify_crypto(): jwt: 
{"raw_payload":"eyJzdWIiOiJyZWFkZXIiLCJuYmYiOjE3NzkzNDE5NTEsImlzcyI6Imh0dHA6Ly9hdXRoel9zcnY6ODA4MC9kZWZhdWx0IiwiZXhwIjoxNzc5MzQ1NTUxLCJpYXQiOjE3NzkzNDE5NTEsImp0aSI6IjRlNmI0YTcwLTRjM2EtNDU2MS05ZjBkLTNkMWEyMjg0MjI4MyIsInRpZCI6ImRlZmF1bHQifQ","valid":true,"verified":true,"payload":{"exp":1779345551,"iat":1779341951,"jti":"4e6b4a70-4c3a-4561-9f0d-3d1a22842283","tid":"default","nbf":1779341951,"sub":"reader","iss":"http://authz_srv:8080/default"},"signature":"WjEGdYLeDMYEAz2wB0bJmFzSP8xmy5ks5UhoBrUxat99dwDX7uf4agVUSfRKJhaa6C6ZIMRyv2KWLgwne37VRy9eyeuCh08Lot8xRGUg4jvxIgbX96irvAMGPb6EnhVIfLFCzvw0231bN0ySd4cUwqISkn96h4-PKFIiRQNEsy-pxUfVgX8CTenMBi8NWlPEPjmBnsHmGdn_kEJYrSq1Qh3DR012HUVk71Xe1sM96G2FQmwAXSGp4R0AABw_abdr1-uj4rvmg63EyGc3MplxI4qDumqy3UkRNiUXCtZx9l6eog9W870KeHqxlIKfO6hhyDB883lfAqM0fGoPbBhTsw","typ":"JWT","header":{"kid":"default","alg":"RS256","typ":"JWT"},"reas
 on":"everything is awesome~ 
:p","raw_header":"eyJraWQiOiJkZWZhdWx0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ"} 
,valid: true, verified: true
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] 
openidc.lua:1893: jwt_verify(): jwt: 
{"exp":1779345551,"iat":1779341951,"jti":"4e6b4a70-4c3a-4561-9f0d-3d1a22842283","tid":"default","nbf":1779341951,"sub":"reader","iss":"http://authz_srv:8080/default"}
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] 
openid-connect.lua:538: introspect(): token validate successfully by jwks
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] ctx.lua:281: 
__index(): serving ctx value from cache for key: uri
   apisix    | 2026/05/21 06:05:19 [notice] 56#56: *155827 [lua] Log.lua:29: 
info(): INFORequest: anonymous, /your-route, GET ---> false
   apisix    | , client: 172.21.0.2, server: _, request: "GET /your-route 
HTTP/1.1", host: "apisix:9080", request_id: "78478a277d4f2315c320770460f0cbb9"
   apisix    | 2026/05/21 06:05:19 [warn] 56#56: *155827 [lua] plugin.lua:1224: 
run_plugin(): authz-casbin exits with http status code 403, client: 172.21.0.2, 
server: _, request: "GET /your-route HTTP/1.1", host: "apisix:9080", 
request_id: "78478a277d4f2315c320770460f0cbb9"
   apisix    | 2026/05/21 06:05:19 [debug] 56#56: *155827 [lua] ctx.lua:281: 
__index(): serving ctx value from cache for key: apisix_upstream_response_time
   apisix    | 2026/05/21 06:05:19 [info] 56#56: *155827 client 172.21.0.2 
closed keepalive connection
   apisix    | 172.21.0.2 - - [21/May/2026:06:05:19 +0000] apisix:9080 "GET 
/your-route HTTP/1.1" 403 39 0.000 "-" "curl/8.17.0" - - - "http://apisix:9080"; 
"78478a277d4f2315c320770460f0cbb9"
   ```
   
   Folder in github with my trial setup: 
https://github.com/sogis/next-p/tree/main/proxy
   
   ### Environment
   
   - APISIX version:  (run `apisix version`): 3.16.0
   - Operating system (run `uname -a`): Docker image 
apache/apisix:3.16.0-debian running on Ubuntu host
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to