amyrprv commented on issue #9073:
URL: https://github.com/apache/apisix/issues/9073#issuecomment-1474878438

   I duplicated the `key-auth` plugin and modified it to read the `azp` 
attribute from the JWT payload. and then I used the `consumer-restriction` 
plugin on services to whitelist consumers. Is it a good approach for this 
solution?
   
   here is my code:
   
   ```
   local core         = require("apisix.core")
   local jwt          = require("resty.jwt")
   local consumer_mod = require("apisix.consumer")
   local plugin_name  = "j-auth"
   local sub_str      = string.sub
   
   
   local schema = {
       type = "object",
       properties = {
           header = {
               type = "string",
               default = "apikey",
           },
           query = {
               type = "string",
               default = "apikey",
           },
           hide_credentials = {
               type = "boolean",
               default = false,
           }
       },
   }
   
   local consumer_schema = {
       type = "object",
       properties = {
           key = { type = "string" },
       },
       encrypt_fields = { "key" },
       required = { "key" },
   }
   
   
   local _M = {
       version = 0.1,
       priority = 2500,
       type = 'auth',
       name = plugin_name,
       schema = schema,
       consumer_schema = consumer_schema,
   }
   
   
   function _M.check_schema(conf, schema_type)
       if schema_type == core.schema.TYPE_CONSUMER then
           return core.schema.check(consumer_schema, conf)
       else
           return core.schema.check(schema, conf)
       end
   end
   
   local function fetch_jwt_token(conf, ctx)
       local token = core.request.header(ctx, conf.header)
       if token then
           if conf.hide_credentials then
               -- hide for header
               core.request.set_header(ctx, conf.header, nil)
           end
   
           local prefix = sub_str(token, 1, 7)
           if prefix == 'Bearer ' or prefix == 'bearer ' then
               return sub_str(token, 8)
           end
   
           return token
       end
   end
   
   
   function _M.rewrite(conf, ctx)
       local from_header = true
   
       -- Get token in authoraztion header
       local key = fetch_jwt_token(conf, ctx)
   
       if not key then
           local uri_args = core.request.get_uri_args(ctx) or {}
           key = uri_args[conf.query]
           from_header = false
       end
   
       if not key then
           return 401, { message = "Missing API key found in request" }
       end
   
       --Decode JWT
       local jwt_obj = jwt:load_jwt(key)
   
       core.log.warn("is Valid: ", jwt_obj.valid)
   
       --Check Token is valid
       if not jwt_obj.valid then
           core.log.warn("JWT token invalid: ", jwt_obj.reason)
           return 401, { message = "JWT token invalid" }
       end
   
       key = jwt_obj.payload and jwt_obj.payload.azp
       if not key then
           return 401, { message = "missing user key in JWT token" }
       end
   
       local consumer_conf = consumer_mod.plugin(plugin_name)
       if not consumer_conf then
           return 401, { message = "Missing related consumer" }
       end
   
       local consumers = consumer_mod.consumers_kv(plugin_name, consumer_conf, 
"key")
       local consumer = consumers[key]
   
       if not consumer then
           return 401, { message = "Invalid API key in request" }
       end
       core.log.info("consumer: ", core.json.delay_encode(consumer))
   
       if conf.hide_credentials then
           if from_header then
               core.request.set_header(ctx, conf.header, nil)
           else
               local args = core.request.get_uri_args(ctx)
               args[conf.query] = nil
               core.request.set_uri_args(ctx, args)
           end
       end
   
       consumer_mod.attach_consumer(ctx, consumer, consumer_conf)
       core.log.info("hit j-auth rewrite")
   end
   
   return _M
   ```


-- 
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