Loading...
Loading...
Add ibl.ai SSO authentication to a vanilla Next.js app
npx skill4agent add iblai/vibe iblai-authPLATFORMiblai.enviblai.envPLATFORMiblai add authiblai add auth --platform your-platform.env.localNEXT_PUBLIC_MAIN_TENANT_KEYyour-tenantyour-platformyour-tenant-keytest-tenantmainiblai.env.env.localDOMAINPLATFORMTOKEN.env.localpnpmnpmiblai startapp agentiblai startapp agent -o iblai-init
cp -a iblai-init/<app-name>/. . && rm -rf iblai-init
cp .env.example .env.local
pnpm install && pnpm deviblai.envPLATFORM--platform your-platformnpx create-next-app@latest my-app --yesapp/iblaiiblai --versioniblaipip install iblai-app-clinpx @iblai/cli --version
# Use npx @iblai/cli as prefix: npx @iblai/cli add auth --platform your-tenantgit clone https://github.com/iblai/iblai-app-cli.git
cd iblai-app-cli
make -C .iblai install
cd - # back to your projectiblai~/.local/binexport PATH="$HOME/.local/bin:$PATH"~/.bashrc~/.zshrcgit clone https://github.com/iblai/iblai-app-cli.git
cd iblai-app-cli
pip install -e .iblai/
cd -iblai%APPDATA%\Python\Python311\Scripts\iblaiiblai --versionpip install --upgrade iblai-app-clinpm install -g @iblai/cli@latestiblai.envPLATFORMDOMAINTOKENiblai.envcurl -o iblai.env https://raw.githubusercontent.com/iblai/vibe/refs/heads/main/iblai.envPLATFORMyour-platform--platformPLATFORMTOKENiblai.envcurl -s "https://api.{domain}/dm/api/core/orgs/{platform}/metadata/" \
-H "Authorization: Api-Token {token}"platform_nameAUTH_DISPLAY_TITLEAUTH_DISPLAY_DESCRIPTIONhttps://ibl.ai/images/iblai-logo.png"Powered by {{logo}}"{{logo}}"https://ibl.ai/privacy-policy""https://ibl.ai/terms-of-use"[]falseiblai.enviblai.env# Auth interface (edit before proceeding)
AUTH_TITLE=<platform_name from API>
AUTH_LOGO=https://ibl.ai/images/iblai-logo.png
AUTH_DISPLAY_TITLE=<platform_name from API>
AUTH_DISPLAY_DESCRIPTION=
AUTH_FOOTER_CREDIT=Powered by {{logo}}
AUTH_PRIVACY_POLICY_URL=https://ibl.ai/privacy-policy
AUTH_TERMS_OF_USE_URL=https://ibl.ai/terms-of-use
AUTH_PASSWORD_ONLY=falseiblai.enviblai.envPLATFORMTOKENiblai.envAuthorization: Api-Token <token>AUTH_LOGOcurl -X POST "https://api.{domain}/dm/api/core/platforms/{platform}/public-image-assets/" \
-H "Authorization: Api-Token {token}" \
-F "image=@{file_path}" \
-F "category={category}"AUTH_LOGO| Image | Category |
|---|---|
| Favicon | |
| Display logo | |
| Side panel logo | |
| Display images (each) | |
filePUT https://api.{domain}/dm/api/core/orgs/{platform}/metadata/
Authorization: Api-Token {token}
Content-Type: application/jsonauth_web_skillsaiauth_web_mentorai{
"auth_web_skillsai": {
"title": "User's Title",
"favicon": "https://...uploaded-logo-url...",
"display_logo": "https://...uploaded-logo-url...",
"footer_credit": "Powered by {{logo}}",
"display_images": [],
"terms_of_use_url": "https://ibl.ai/terms-of-use",
"display_title_info": "Generated headline",
"privacy_policy_url": "https://ibl.ai/privacy-policy",
"display_description_info": "Generated description",
"display_slide_panel_logo": "https://...uploaded-logo-url...",
"authorize_only_password_login": false
},
"auth_web_mentorai": {
"title": "User's Title",
"favicon": "https://...uploaded-logo-url...",
"display_logo": "https://...uploaded-logo-url...",
"footer_credit": "Powered by {{logo}}",
"display_images": [],
"terms_of_use_url": "https://ibl.ai/terms-of-use",
"display_title_info": "Generated headline",
"privacy_policy_url": "https://ibl.ai/privacy-policy",
"display_description_info": "Generated description",
"display_slide_panel_logo": "https://...uploaded-logo-url...",
"authorize_only_password_login": false
}
}authorize_only_password_loginfalsecd your-nextjs-app
# If iblai.env has PLATFORM, the CLI reads it automatically
iblai add auth
# Or pass explicitly (overrides iblai.env)
iblai add auth --platform your-platform
# Or via npx (when published)
npx @iblai/cli add auth --platform your-platformNEXT_PUBLIC_MAIN_TENANT_KEY.env.localPLATFORMiblai.env--platformiblai.envnext.configglobals.css.env.localsrc/pnpm installpackage.json@iblai/iblai-js@reduxjs/toolkitreact-reduxsonnerlucide-reactapp/layout.tsx{children}IblaiProvidersimport { IblaiProviders } from "@/providers/iblai-providers";
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<IblaiProviders>{children}</IblaiProviders>
</body>
</html>
);
}import { IblaiProviders } from "@/providers/iblai-providers";
import { MyProvider } from "./my-provider";
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<IblaiProviders>
<MyProvider>
{children}
</MyProvider>
</IblaiProviders>
</body>
</html>
);
}IblaiProvidersPLATFORMiblai.env--platform.env.localiblai config show.env.localiblai config set NEXT_PUBLIC_MAIN_TENANT_KEY your-tenantiblai.appapp/globals.css@import '@iblai/iblai-js/web-containers/styles';
@source "../node_modules/@iblai/iblai-js/dist/web-containers/source";globals.cssapp/page.tsxnext/imagevercel.svgVercelGet started by editingiblai add homepagepnpm devaxd_tokenuserDatatenants| File | Purpose |
|---|---|
| SSO callback -- stores tokens from URL into localStorage |
| Environment variable accessors (API URLs, tenant key, auth URL) |
| localStorage wrapper implementing the SDK's StorageService interface |
| |
| Redux store with |
| Provider chain: ReduxProvider > AuthProvider > TenantProvider |
next.config.tsresolve.alias@reduxjs/toolkitturbopack: {}ReactReduxContextundefinedglobals.css.env.localapp/
├── (auth)/
│ └── sso-login-complete/page.tsx ← Outside providers (no AuthProvider wrapper)
└── (app)/
├── layout.tsx ← IblaiProviders wraps only this group
└── page.tsxAuthProviderapp/sso-login-complete//api/custom-domains?domain=localhostNEXT_PUBLIC_MAIN_TENANT_KEY.env.local@reduxjs/toolkitnext.config.tsReactReduxContextStoreProviderundefinedconfig.resolve.alias['@reduxjs/toolkit'] = rtkDir;app/sso-login-complete/page.tsxAuthProviderAuthProvider.env.localNEXT_PUBLIC_MAIN_TENANT_KEYiblai add chat # AI chat widget (requires agent ID)| Skill | What It Adds |
|---|---|
| AI chat widget |
| User profile dropdown + settings page |
| Account/organization settings page |
| Analytics dashboard page |
| Notification bell + center page |