Summary

Name

authz-keycloak is an authorization plugin to be used with the Keycloak Identity Server. Keycloak is an OAuth/OIDC and UMA compliant Ideneity Server. Although, its developed to working in conjunction with Keycloak it should work with any OAuth/OIDC and UMA compliant identity providers as well.

For more information on Keycloak, refer to Keycloak Authorization Docs for more information.

Attributes

NameTypeRequirementDefaultValidDescription
token_endpointstringrequired[1, 4096]A OAuth2-compliant Token Endpoint that supports the urn:ietf:params:oauth:grant-type:uma-ticket grant type.
grant_typestringoptional“urn:ietf:params:oauth:grant-type:uma-ticket”[“urn:ietf:params:oauth:grant-type:uma-ticket”]
audiencestringoptionalThe client identifier of the resource server to which the client is seeking access.
This parameter is mandatory when parameter permission is defined.
permissionsarray[string]optionalA string representing a set of one or more resources and scopes the client is seeking access. The format of the string must be: RESOURCE_ID#SCOPE_ID.
timeoutintegeroptional3000[1000, ...]Timeout(ms) for the http connection with the Identity Server.
ssl_verifybooleanoptionaltrueVerify if SSL cert matches hostname.
policy_enforcement_modestringoptional“ENFORCING”[“ENFORCING”, “PERMISSIVE”]

Policy Enforcement Mode

Specifies how policies are enforced when processing authorization requests sent to the server.

Enforcing

  • (default mode) Requests are denied by default even when there is no policy associated with a given resource.

Permissive

  • Requests are allowed even when there is no policy associated with a given resource.

How To Enable

Create a route and enable the authz-keycloak plugin on the route:

curl http://127.0.0.1:9180/apisix/admin/routes/5 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "uri": "/get",
    "plugins": {
        "authz-keycloak": {
            "token_endpoint": "http://127.0.0.1:8090/auth/realms/{client_id}/protocol/openid-connect/token",
            "permissions": ["resource name#scope name"],
            "audience": "Client ID"
        }
    },
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "127.0.0.1:8080": 1
        }
    }
}

Test Plugin

curl http://127.0.0.1:9080/get -H 'Authorization: Bearer {JWT Token}'

Disable Plugin

Remove the corresponding json configuration in the plugin configuration to disable the authz-keycloak. APISIX plugins are hot-reloaded, therefore no need to restart APISIX.

curl http://127.0.0.1:9180/apisix/admin/routes/5 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "uri": "/get",
    "plugins": {
    },
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "127.0.0.1:8080": 1
        }
    }
}

Examples

Checkout the unit test for of the authz-keycloak.t to understand how the authorization policies can be integrated into your API workflows. Run the following docker image and visit http://localhost:8090 to view the associated policies for the unit tests.

docker run -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=123456 -p 8090:8080 sshniro/keycloak-apisix

The following image shows how the policies are configures in the Keycloak server.

Keycloak policy design

Future Development

  • Currently the authz-plugin requires to define the resource name and required scopes in order to enforce policies for the routes. However, Keycloak's official adapters (Java, JS) also provides path matching by querying Keycloak paths dynamically, and lazy loading the paths to identity resources. Future version on authz-plugin will support this functionality.

  • Support to read scope and configurations from the Keycloak JSON File