← All Modules

assay.ory.kratos

Ory Kratos identity management. Self-service login, registration, recovery and settings flows, identity CRUD via the admin API, session introspection (whoami), and identity schemas. Client: kratos.client({public_url="...", admin_url="..."}).

Sessions (c.sessions):

Flows (c.flows):

Identities (c.identities):

Schemas (c.schemas):

Example:

local kratos = require("assay.ory.kratos")
local c = kratos.client({
  public_url = "http://kratos-public:4433",
  admin_url = "http://kratos-admin:4434",
})
local session = c.sessions:whoami(cookie)
log.info("Logged in as: " .. session.identity.traits.email)

assay.ory.hydra

Ory Hydra OAuth2 and OpenID Connect server. OAuth2 client CRUD via the admin API, authorize URL builder, token exchange, accept/reject login and consent challenges, introspection, JWK endpoint, and OIDC discovery. Client: hydra.client({public_url="...", admin_url="..."}).

Clients (c.clients):

OAuth2 (c.oauth2):

Login challenges (c.login):

Consent challenges (c.consent):

Logout challenges (c.logout):

Discovery (c.discovery):

Example:

local hydra = require("assay.ory.hydra")
local c = hydra.client({
  public_url = "https://hydra.example.com",
  admin_url = "http://hydra-admin:4445",
})
local client = c.clients:create({
  client_name = "my-app",
  grant_types = { "authorization_code", "refresh_token" },
  redirect_uris = { "https://app.example.com/callback" },
})

assay.ory.keto

Ory Keto relationship-based access control (Zanzibar-style ReBAC). Relation-tuple CRUD, permission checks, role/group membership queries, and the expand API. Client: keto.client(read_url, {write_url="..."}).

Tuples (c.tuples):

Permissions (c.permissions):

Roles (c.roles):

Example:

local keto = require("assay.ory.keto")
local c = keto.client("http://keto-read:4466", {
  write_url = "http://keto-write:4467",
})
c.tuples:create({
  namespace = "apps", object = "cc", relation = "admin",
  subject_id = "user:alice",
})
assert(c.permissions:check("apps", "cc", "admin", "user:alice"))

assay.ory.rbac

Capability-based RBAC engine layered on top of Ory Keto. Define a policy once (role → capability set) and get user lookups, capability checks, and membership management for free. Users can hold multiple roles and the effective capability set is the union, so separation of duties is enforceable at the authorization layer (an approver role can have approve without also getting trigger, even if listed above an operator role with trigger).

Policy: rbac.policy({namespace, keto, roles, default_role?}). namespace filters Keto tuples (e.g. "command-center"); keto is a Keto client; roles maps role names to {rank, capabilities, label?, description?}; default_role is the role assumed for users with no memberships.

Users (p.users):

Members (p.members):

Policy (p.policy):

Middleware (p.middleware):

Example:

local keto = require("assay.ory.keto")
local rbac = require("assay.ory.rbac")

local kc = keto.client("http://keto-read:4466", { write_url = "http://keto-write:4467" })
local policy = rbac.policy({
  namespace = "command-center",
  keto = kc,
  default_role = "viewer",
  roles = {
    owner    = { rank = 5, capabilities = { "manage_roles", "approve", "trigger", "view" } },
    admin    = { rank = 4, capabilities = { "manage_roles", "approve", "trigger", "view" } },
    approver = { rank = 3, capabilities = { "approve", "view" } },
    operator = { rank = 2, capabilities = { "trigger", "view" } },
    viewer   = { rank = 1, capabilities = { "view" } },
  },
})

policy.members:add("user:alice", "approver")
assert(policy.users:has_capability("user:alice", "approve"))
assert(not policy.users:has_capability("user:alice", "trigger"))

assay.ory

Convenience wrapper re-exporting assay.ory.kratos, assay.ory.hydra, assay.ory.keto, and assay.ory.rbac, with ory.connect(opts) to build all three Ory clients in a single call.

Example:

local ory = require("assay.ory")
local o = ory.connect({
  kratos_public = "http://kratos-public:4433",
  kratos_admin = "http://kratos-admin:4434",
  hydra_public = "https://hydra.example.com",
  hydra_admin = "http://hydra-admin:4445",
  keto_read = "http://keto-read:4466",
  keto_write = "http://keto-write:4467",
})
local allowed = o.keto.permissions:check("apps", "cc", "admin", "user:alice")