Webiny-js webiny-configure-auth0
git clone https://github.com/webiny/webiny-js
T=$(mktemp -d) && git clone --depth=1 https://github.com/webiny/webiny-js "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/user-skills/configure-auth0" ~/.claude/skills/webiny-webiny-js-webiny-configure-auth0 && rm -rf "$T"
skills/user-skills/configure-auth0/SKILL.mdConfigure Auth0 Authentication
TL;DR
Webiny supports Auth0 as an external identity provider (IDP) to replace the default Cognito authentication. First, install the
@webiny/auth0 package (using the same version as the webiny dependency in package.json). Then create two files: an API config class that maps Auth0 JWT claims to Webiny identity data (Auth0IdpConfig), and a React extension component (<Auth0 />) that wires issuer URL, client ID, and the API config path. Register the extension in webiny.config.tsx, set two environment variables (AUTH0_ISSUER, AUTH0_CLIENT_ID), and deploy.
Pattern / Core Concept
Auth0 integration has two parts:
- API Config — A class implementing
that maps JWT token claims to Webiny's identity structure. Registered viaAuth0IdpConfig.Interface
(the universal DI pattern).Auth0IdpConfig.createImplementation() - Extension Component — A React component that renders
from<Auth0 />
, passing the issuer URL, client ID, and path to the API config file. The@webiny/auth0
component handles environment variable injection, API extension registration, and Admin login screen setup automatically.<Auth0 />
How <Auth0 />
Works Internally
<Auth0 />The
<Auth0 /> component (from @webiny/auth0) is a defineExtension that:
- Sets Lambda env vars:
,AUTH0_ISSUERAUTH0_CLIENT_ID - Sets Admin app env vars:
,REACT_APP_IDP_TYPE=auth0
,REACT_APP_AUTH0_ISSUERREACT_APP_AUTH0_CLIENT_ID - Registers the internal
API extension (OIDC token verification)Auth0IdpFeature - Registers your custom API config extension (identity mapping)
- Registers the Admin Auth0 login screen extension
Reference Tables
Auth0IdpConfig.Interface
Auth0IdpConfig.Interface| Method | Signature | Required | Description |
|---|---|---|---|
| | Yes | Maps JWT claims to Webiny identity data |
| | No | Custom claim verification (throw to reject the token) |
Auth0Identity
(Return Type of getIdentity
)
Auth0IdentitygetIdentity| Field | Type | Description |
|---|---|---|
| | Unique user ID (typically ) |
| | User's display name |
| | Webiny security roles to assign |
| | Webiny teams (optional, filter out falsy values) |
| | User profile fields |
| | Runtime data (not stored in DB) |
<Auth0 />
Component Props
<Auth0 />| Prop | Type | Description |
|---|---|---|
| | Auth0 issuer URL (e.g., ) |
| | Auth0 application client ID |
| | Absolute path to the API config file |
Environment Variables
| Variable | Used By | Description |
|---|---|---|
| API + Admin | Auth0 issuer URL |
| API + Admin | Auth0 application client ID |
Full Examples
Example 1: Basic Auth0 Configuration
Step 0: Install the
dependency@webiny/auth0
@webiny/auth0 is an optional dependency. Add it to package.json using the same version as the webiny dependency, then install:
# Check the webiny version in package.json, then add @webiny/auth0 with the same version # For example, if "webiny": "^0.0.0-unstable.xxx": yarn add @webiny/auth0@^0.0.0-unstable.xxx
Important: After adding the dependency, tell the user to run
to install it. Do NOT runyarnautomatically — let the user do it.yarn
Step 1: Create the API config
Create
extensions/auth0/MyAuth0Config.ts:
import { Auth0IdpConfig } from "@webiny/auth0"; class MyIdpConfig implements Auth0IdpConfig.Interface { getIdentity(token: Auth0IdpConfig.JwtPayload) { return { id: String(token["sub"]), displayName: token["name"], roles: ["full-access"], profile: { firstName: token["given_name"], lastName: token["family_name"], email: token["email"] }, context: { canAccessTenant: true, defaultTenant: "root" } }; } } const MyAuth0Config = Auth0IdpConfig.createImplementation({ implementation: MyIdpConfig, dependencies: [] }); export default MyAuth0Config;
Step 2: Create the extension component
Create
extensions/auth0/MyAuth0Extension.tsx:
import React from "react"; import { Auth0 } from "@webiny/auth0"; export const MyAuth0Extension = () => { return ( <Auth0 issuer={String(process.env.AUTH0_ISSUER)} clientId={String(process.env.AUTH0_CLIENT_ID)} apiConfig={import.meta.dirname + "/MyAuth0Config.ts"} /> ); };
Step 3: Register in webiny.config.tsx
import React from "react"; import { MyAuth0Extension } from "./extensions/auth0/MyAuth0Extension.js"; export const Extensions = () => { return ( <> {/* Replace <Cognito /> with Auth0 */} <MyAuth0Extension /> {/* ... other extensions ... */} </> ); };
Step 4: Set environment variables
Add to your
.env file (or CI/CD environment):
AUTH0_ISSUER=https://your-tenant.auth0.com/ AUTH0_CLIENT_ID=your-auth0-client-id
Step 5: Deploy
yarn webiny deploy
Example 2: Custom Claim Verification
If your Auth0 setup uses custom claims (e.g., via Auth0 Actions or Rules) that need validation:
import { Auth0IdpConfig } from "@webiny/auth0"; class MyIdpConfig implements Auth0IdpConfig.Interface { getIdentity(token: Auth0IdpConfig.JwtPayload) { return { id: String(token["sub"]), displayName: token["name"], roles: [token["https://webiny.com/role"]], profile: { firstName: token["given_name"], lastName: token["family_name"], email: token["email"] }, context: { canAccessTenant: true, defaultTenant: "root" } }; } verifyTokenClaims(token: Auth0IdpConfig.JwtPayload) { // Reject tokens without the required custom claim if (!token["https://webiny.com/role"]) { throw new Error("Token is missing the 'https://webiny.com/role' claim."); } // Reject tokens from unauthorized organizations if (token["org_id"] && token["org_id"] !== "org_expected") { throw new Error("User does not belong to the authorized organization."); } } } const MyAuth0Config = Auth0IdpConfig.createImplementation({ implementation: MyIdpConfig, dependencies: [] }); export default MyAuth0Config;
Example 3: Using DI Dependencies in Config
If your config needs access to other Webiny services (e.g., to look up tenant-specific roles):
import { Auth0IdpConfig } from "@webiny/auth0"; import { TenantContext } from "webiny/api/tenancy"; class MyIdpConfig implements Auth0IdpConfig.Interface { constructor(private tenantContext: TenantContext.Interface) {} getIdentity(token: Auth0IdpConfig.JwtPayload) { const tenant = this.tenantContext.getTenant(); return { id: String(token["sub"]), displayName: token["name"], roles: [token["https://webiny.com/role"]], profile: { firstName: token["given_name"], lastName: token["family_name"], email: token["email"] }, context: { canAccessTenant: true, defaultTenant: tenant?.id ?? "root" } }; } } const MyAuth0Config = Auth0IdpConfig.createImplementation({ implementation: MyIdpConfig, dependencies: [TenantContext] }); export default MyAuth0Config;
Quick Reference
Imports
// API config import { Auth0IdpConfig } from "@webiny/auth0"; // Extension component import { Auth0 } from "@webiny/auth0";
Key Interfaces
| Interface | Package | Purpose |
|---|---|---|
| | API-side JWT-to-identity mapping |
| | JWT token payload type |
| | Identity return type |
File Structure
extensions/auth0/ ├── MyAuth0Config.ts # API config (JWT claim mapping) └── MyAuth0Extension.tsx # Extension component (Auth0 setup)
Registration
In
webiny.config.tsx, replace <Cognito /> with <MyAuth0Extension />.
Deploy
yarn webiny deploy # Deploy all (Core + API + Admin)
Both API and Admin need to be redeployed since Auth0 affects both the backend (token verification, identity mapping) and the frontend (login screen).
Related Skills
- webiny-configure-okta — Alternative IDP: configuring Okta authentication
- webiny-dependency-injection — The universal DI pattern used by
Auth0IdpConfig.createImplementation() - webiny-project-structure — How
and extensions are organizedwebiny.config.tsx - webiny-local-development — Deploying and testing your Auth0 configuration