Introduction
What if your Master Data Management platform could also serve as the backend for your customer portal, internal tool, or mobile app? With RDataCore's headless architecture, it can.
Traditionally, building a web application with user accounts requires setting up a separate authentication service, a user database, session management, and API endpoints, often involving multiple third-party services and significant infrastructure. RDataCore takes a different approach: by treating users as just another entity type and leveraging its workflow engine for authentication, you get a complete headless backend without any additional services.
In this guide, we'll walk through the full picture: how to model users as entities with the new Password field type, how registration and login workflows work, how Entity JWTs protect your API endpoints, and why RDataCore's position as a Master Data Management platform makes it uniquely powerful as a headless backend. Whether you're building a customer self-service portal, an internal operations tool, an e-commerce storefront, or an IoT dashboard, the pattern is the same.
What Is a Headless Backend?
A headless backend is a server-side system that exposes its functionality purely through APIs, without providing its own user-facing interface. The "head" (meaning the frontend) is completely decoupled from the backend. This lets you build any number of frontends (web apps, mobile apps, CLI tools, IoT dashboards) that all talk to the same backend through a consistent API.
The headless approach has become the standard for modern application development because it offers:
- Frontend freedom: use React, Vue, Next.js, Flutter, React Native, or any framework you prefer
- Multiple clients: serve a web portal, a mobile app, and an internal tool from the same backend
- Independent deployment: update your frontend without touching the backend and vice versa
- API-first design: every capability is accessible programmatically, enabling automation and integration
RDataCore is naturally headless. Its workflow engine, entity storage, and public API were designed from the ground up to be consumed by external clients. Adding user authentication to this architecture means any frontend can register users, authenticate them, and serve protected data, all through RDataCore's existing workflow endpoints.
Setting Up the User Entity
The foundation of headless authentication in RDataCore is a User entity definition. Instead of a hardcoded user table, you define your user schema as a regular entity definition, giving you full flexibility over what fields your users have.
A typical User entity definition includes:
first_name(String): the user's first namelast_name(String): the user's last nameemail(String, unique, required, indexed): the login identifieropt_in(Boolean): marketing consent or terms acceptancepassword(Password): the user's password, automatically hashed
The Password field type is the key enabler here. When you add a Password field to an entity definition, RDataCore automatically:
- Hashes the value on write. Passwords are hashed using Argon2id (the current gold standard for password hashing) before storage. The plaintext password never touches the database.
- Redacts on read. When you query a user entity via the API, the password field always returns
null. The hash is never exposed. - Supports verification. The authenticate workflow transform can internally verify a submitted password against the stored hash.
This means you configure your user schema through the same admin UI you use for any other entity definition. Want to add a
role field? An avatar_url? A subscription_tier? Just add fields to your definition. Your user model is as flexible as any other entity in RDataCore.Because email is marked as unique and indexed, RDataCore ensures no two users can register with the same email address, and lookups by email are fast, exactly what an authentication system needs.

The Registration Flow
User registration in a headless RDataCore setup works through a workflow endpoint. Your frontend sends a POST request with the user's details, and RDataCore's workflow engine handles everything: validation, entity creation, password hashing, and response.
Here's how the flow works step by step:
- Frontend submits the form. Your React, Vue, or mobile app collects the registration data (email, password, name, etc.) and sends it as JSON to the workflow endpoint.
- FROM: API Input. The workflow's FROM step receives the JSON payload and maps the incoming fields to normalized data. Field mappings let you transform between your frontend's field names and the entity's field names.
- TRANSFORM: Create Entity. The workflow creates a new entity of type "user" with the submitted data. During this step, RDataCore automatically hashes the password using Argon2id before storing it. If the email already exists (uniqueness constraint), the workflow returns an error.
- TO: API Response. The workflow returns the newly created entity's UUID and any other data you configure. The password field is automatically redacted from the response.
A registration workflow definition looks like this in RDataCore's DSL:
- FROM:
apisource with JSON format, mappingemail,password,first_name,last_name - TRANSFORM:
create_entitywith entity typeuser - TO:
apioutput with JSON format, returning the entity UUID
The beauty of this approach is that your registration logic is entirely configurable. Want to add email validation? Add a constraint to the email field. Want to require a minimum password length? Set
min_length: 8 on the Password field. Want to auto-assign a default role? Set a default value on a role field. No code changes needed.
The Authentication Flow
Once users are registered, they need to log in. RDataCore handles this through the Authenticate transform, a dedicated workflow step that verifies credentials and issues JWT tokens.
The login flow works like this:
- Frontend submits credentials. The user enters their email and password, and the frontend sends them to the login workflow endpoint.
- FROM: API Input. The workflow receives the credentials and maps them to normalized fields (
identifierandpassword).
- TRANSFORM: Authenticate. This is where the magic happens. The authenticate transform:
- Looks up the entity by the
identifier_field(e.g., finds the user with the matching email) - Reads the raw password hash from the database (bypassing the normal redaction)
- Verifies the submitted password against the stored Argon2id hash
- If valid: generates an Entity JWT containing the user's UUID, entity type, and any extra claims (like
role) - If invalid: returns a generic "Invalid credentials" error (no distinction between wrong email and wrong password, for security)
- TO: API Response. The workflow returns the JWT token to the frontend.
The frontend then stores this token (in memory, localStorage, or a secure cookie) and includes it as a
Bearer token in the Authorization header of subsequent API requests.The authenticate transform is highly configurable:
entity_type: which entity type holds your user records (e.g., "user")identifier_field: which field to match the login identifier against (e.g., "email", but could be "username")password_field: which field contains the password hash (e.g., "password")extra_claims: additional entity fields to include in the JWT (e.g.,{"role": "role"}includes the user's role as a JWT claim)token_expiry_seconds: optional override for token expiration
This flexibility means you can support different authentication patterns: login by email, login by username, login by phone number, whatever your entity definition supports.
Setting this up in the admin UI is straightforward. The FROM step defines your workflow as an API endpoint with JSON format, and RDataCore automatically generates the endpoint URL for you. Then the Authenticate transform is configured with simple dropdowns and text fields: select your entity type, pick the identifier and password fields, map the input fields, and set the JWT output field name. The entire login workflow can be configured in under a minute, with no code required.



Protecting Endpoints with Entity JWT
After login, the frontend holds an Entity JWT. Now it can access protected workflow endpoints: workflows that require authentication to use.
RDataCore supports a dedicated EntityJwt auth method for workflow endpoints. When you configure a workflow with EntityJwt authentication, RDataCore will:
- Extract the Bearer token from the
Authorizationheader - Verify the JWT signature using the entity-specific secret (
{jwt_secret}_entity) - Validate the issuer claim (
r_data_core_entity) - Check any required claims you've configured (e.g.,
role: "member")
If all checks pass, the request proceeds and the workflow executes. If any check fails, the client receives a
401 Unauthorized response.The
required_claims feature is particularly powerful for role-based access control. You can create different workflows with different claim requirements:- A "profile" workflow requiring just a valid Entity JWT (any authenticated user)
- A "premium-content" workflow requiring
{"extra.tier": "premium"} - An "admin-dashboard" workflow requiring
{"extra.role": "admin"}
JWT Secret Isolation is a critical security feature. Entity JWTs and admin JWTs use completely separate signing keys and issuer claims:
- Admin JWT: signed with
{jwt_secret}, issuerr_data_core_admin - Entity JWT: signed with
{jwt_secret}_entity, issuerr_data_core_entity
This three-layer isolation (different key, different issuer, different claims structure) means an Entity JWT can never authenticate as an admin user, and an admin JWT can never pass Entity JWT verification. Even if an attacker obtains an entity token, they cannot escalate to admin access.
Real-World Use Cases
The combination of dynamic entities, workflow-based auth, and JWT-protected endpoints opens up a wide range of headless use cases:
Customer Self-Service Portal Build a portal where customers log in to view their orders, update their profile, download invoices, and manage subscriptions. The portal talks exclusively to RDataCore's workflow endpoints, with no custom backend needed. User data, order data, and subscription data all live as entities in RDataCore.
Internal Operations Tool Create an internal dashboard for your team to manage inventory, track shipments, or process support tickets. Employees authenticate via Entity JWT, with role-based access ensuring warehouse staff sees different data than management. All business data is centrally managed in RDataCore's entity storage.
E-Commerce Storefront Power a headless e-commerce frontend with RDataCore as the product catalog and customer database. Products, categories, and pricing are entities managed through the MDM admin UI, while customer registration and order placement happen through workflow endpoints. Combine with Stripe webhooks for payment processing.
IoT Device Dashboard Sensor data flows into RDataCore through import workflows, while device operators log into a custom dashboard to view readings, configure alerts, and manage device metadata. The Password field on a "DeviceOperator" entity and Entity JWT auth make this straightforward.
Multi-Tenant SaaS Platform Use entity hierarchies to separate tenant data (e.g.,
/tenants/acme-corp/users/, /tenants/acme-corp/projects/), with Entity JWT claims carrying the tenant identifier. Each tenant's users only see their own data through appropriately scoped workflows.Mobile App Backend React Native or Flutter apps can register users, authenticate, and fetch data through the same workflow endpoints as web apps. The API-first design means your mobile and web frontends share the same backend without any platform-specific code on the server.
Why MDM Makes a Great Headless Backend
Using RDataCore as a headless backend isn't just convenient; it's architecturally sound. Here's why a Master Data Management platform is an excellent foundation for headless applications:
Single Source of Truth In a typical headless setup, you might have user data in Auth0, product data in a CMS, order data in a separate database, and configuration in yet another service. With RDataCore, all of this lives in one place. Users, products, orders, configuration are all entities, managed through the same interface, backed by the same storage, and accessible through the same API.
Schema Flexibility Without Migrations Need to add a
phone_number field to your User entity? A discount_code field to your Order entity? Just update the entity definition through the admin UI. No database migrations, no deployment cycles, no downtime. RDataCore's dynamic entity system means your data model evolves as fast as your business needs.Built-in Data Quality RDataCore's field constraints (required, unique, indexed, validated) enforce data quality at the platform level. When your headless frontend submits data through a workflow, it goes through the same validation pipeline as any other data entry point. Bad data is rejected before it reaches storage.
Workflow-Driven Business Logic The FROM → TRANSFORM → TO workflow model lets you encode business logic directly in RDataCore. Registration workflows can include deduplication. Login workflows issue properly scoped tokens. Data provider workflows can filter and transform data before serving it. This means less custom code in your frontend and backend layers.
Unified Admin Interface RDataCore comes with a full admin UI for managing entity definitions, browsing data, configuring workflows, and monitoring system health. Your operations team can manage user accounts, inspect data, and configure business rules without touching code, while your headless frontends consume the same data through the API.
Import/Export Integration Because RDataCore is an MDM platform at its core, you can simultaneously use it for bulk data operations. Import 100,000 product records from your supplier's CSV while your e-commerce frontend serves those products to customers in real time. The headless frontend and the data management workflows coexist naturally.
Architecture Overview
The headless architecture with RDataCore follows a clean three-tier pattern:
Frontend Layer (your headless clients) Any number of frontends built with any technology stack. Each frontend communicates with RDataCore exclusively through HTTPS API calls. Frontends handle UI rendering, user interaction, and local state, and nothing else.
RDataCore Layer (the headless backend) The workflow engine handles registration, authentication, and data operations. The authentication layer manages Entity JWTs and Pre-Shared Keys. The entity storage provides dynamic, schema-flexible data persistence. The public API exposes all capabilities to frontends.
External Systems Layer (integrations) Payment providers, email services, CRMs, legacy systems, and any other external services integrate through workflows and webhooks. RDataCore acts as the central hub, coordinating data flow between your frontends and the wider ecosystem.
This architecture means your headless frontends never talk directly to external services. Everything flows through RDataCore, which provides authentication, authorization, data validation, and transformation at every step.
