Consumer

Description

For an API gateway, it is usually possible to identify the type of the requester by using things like their request domain name and client IP address. A gateway like APISIX can then filter these requests using Plugins and forward it to the specified Upstream.

But this level of depth can be insufficient on some occasions.

consumer-who

An API gateway should know who the consumer of the API is to configure different rules for different consumers. This is where the Consumer construct comes in APISIX.

Configuration options

The fields for defining a Consumer are defined as below.

FieldRequiredDescription
usernameYesName of the consumer
pluginsNoPlugin configuration of the Consumer. It has the highest priority: Consumer > Route > Service. For specific Plugin configurations, refer the Plugins section.

Identifying a Consumer

The process of identifying a Consumer in APISIX is described below:

consumer-internal

  1. The first step is Authentication. This is achieved by Authentication Plugins like key-auth and JWT.
  2. After authenticating, you can obtain the id of the Consumer. This id will be the unique identifier of a Consumer.
  3. The configurations like Plugins and Upstream bound to the Consumer are then executed.

Consumers are useful when you have different consumers requesting the same API and you need to execute different Plugin and Upstream configurations based on the consumer. These need to be used in conjunction with the user authentication system.

Refer to the documentation for the key-auth authentication Plugin to further understand the concept of a Consumer.

Example

The example below shows how you can enable a Plugin for a specific Consumer.

  1. # Create a Consumer, specify the authentication plugin key-auth, and enable the specific plugin limit-count
  2. $ curl http://127.0.0.1:9080/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  3. {
  4. "username": "jack",
  5. "plugins": {
  6. "key-auth": {
  7. "key": "auth-one"
  8. },
  9. "limit-count": {
  10. "count": 2,
  11. "time_window": 60,
  12. "rejected_code": 503,
  13. "key": "remote_addr"
  14. }
  15. }
  16. }'
  17. # Create a Router, set routing rules and enable plugin configuration
  18. $ curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  19. {
  20. "plugins": {
  21. "key-auth": {}
  22. },
  23. "upstream": {
  24. "nodes": {
  25. "127.0.0.1:1980": 1
  26. },
  27. "type": "roundrobin"
  28. },
  29. "uri": "/hello"
  30. }'
  31. # Send a test request, the first two return to normal, did not reach the speed limit threshold
  32. $ curl http://127.0.0.1:9080/hello -H 'apikey: auth-one' -I
  33. ...
  34. $ curl http://127.0.0.1:9080/hello -H 'apikey: auth-one' -I
  35. ...
  36. # The third test returns 503 and the request is restricted
  37. $ curl http://127.0.0.1:9080/hello -H 'apikey: auth-one' -I
  38. HTTP/1.1 503 Service Temporarily Unavailable
  39. ...

We can use the consumer-restriction Plugin to restrict our user “Jack” from accessing the API.

  1. # Add Jack to the blacklist
  2. $ curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  3. {
  4. "plugins": {
  5. "key-auth": {},
  6. "consumer-restriction": {
  7. "blacklist": [
  8. "jack"
  9. ]
  10. }
  11. },
  12. "upstream": {
  13. "nodes": {
  14. "127.0.0.1:1980": 1
  15. },
  16. "type": "roundrobin"
  17. },
  18. "uri": "/hello"
  19. }'
  20. # Repeated tests, all return 403; Jack is forbidden to access this API
  21. $ curl http://127.0.0.1:9080/hello -H 'apikey: auth-one' -I
  22. HTTP/1.1 403
  23. ...