Skip to content

RBAC, Scopes & Permissions ​

AuthHero provides Role-Based Access Control (RBAC) through resource servers, scopes, roles, and permissions. This model is compatible with Auth0's RBAC system.

Resource Servers ​

Resource servers represent your APIs. Each defines an identifier (audience) and the scopes available:

json
{
  "identifier": "https://api.example.com",
  "scopes": [
    { "value": "read:users", "description": "Read user data" },
    { "value": "write:users", "description": "Modify user data" },
    { "value": "impersonate", "description": "Impersonate other users" }
  ],
  "options": {
    "enforce_policies": true,
    "token_dialect": "access_token"
  }
}

RBAC Configuration ​

  • enforce_policies: true — Enables RBAC; only granted scopes appear in tokens
  • enforce_policies: false — All requested scopes are granted without checks
  • token_dialect: "access_token" — Permissions appear as scopes
  • token_dialect: "access_token_authz" — Permissions appear in a separate permissions array

Scopes ​

There are two types of scopes:

OIDC Scopes (Always Granted) ​

ScopeClaims Returned
openidsub
profilename, given_name, family_name, nickname, picture
emailemail, email_verified

Custom API Scopes ​

Defined on resource servers. Follow the action:resource convention:

read:users
write:users
delete:users
admin:billing

Scope Behavior with RBAC Enabled ​

Scope TypeBehavior
OIDC scopesAlways granted
Defined on resource serverOnly granted if user has permission
NOT defined on resource serverAlways granted (pass-through)

This lets you define only the sensitive scopes that need restriction while letting general-purpose scopes pass through.

Roles ​

Roles group permissions. Assign roles to users globally or per-organization:

http
POST /api/v2/roles
{ "name": "Editor", "description": "Can edit content" }

POST /api/v2/roles/{roleId}/permissions
{ "permissions": [
    { "resource_server_identifier": "https://api.example.com", "permission_name": "read:posts" },
    { "resource_server_identifier": "https://api.example.com", "permission_name": "write:posts" }
] }

POST /api/v2/users/{userId}/roles
{ "roles": ["{roleId}"] }

Organization-Specific Roles ​

http
POST /api/v2/organizations/{orgId}/members/{userId}/roles
{ "roles": ["{roleId}"] }

These permissions only apply when the user authenticates with that organization's context.

Permission Resolution ​

When generating an access token, permissions are resolved from:

  1. Direct user permissions
  2. Global role permissions
  3. Organization role permissions (if org context present)

The final token contains the union of all sources.

Best Practices ​

  1. Define only restricted scopes — Only scopes needing RBAC enforcement need to be on the resource server
  2. Use roles, not direct permissions — Easier to manage at scale
  3. Principle of least privilege — Grant minimum needed permissions
  4. Use organization context for B2B — Always include organization parameter
  5. Validate org_id in your API — Verify the claim matches the requested resource

Dual-licensed: AGPL-3.0-only or commercial license.