Secure Authentication, Simplified
Enterprise-ready identity platform for modern applications. Implement authentication and authorization in minutes with multi-tenant support, SSO, email verification APIs, and standards-based security.
Get Started Free Sign In API Reference
No credit card required · Free up to 500 users
Why Ailacs Identity
Build secure, scalable authentication into your application without the complexity. We handle identity so you can focus on your product.
Multi-Tenant Architecture
Complete tenant isolation with centralized management. Perfect for B2B SaaS applications with organization-level access control.
Standards-Based SSO
OpenID Connect and OAuth 2.0 flows powered by OpenIddict. Integrate with enterprise identity providers seamlessly.
Enterprise Ready
99.9% uptime SLA, audit logs, RBAC, MFA, and custom branding. Built for compliance with SOC 2 and GDPR requirements.
Email Verification API
Offer email verification as a separate metered API service, with usage tracked per tenant and documented for fast integration.
Built for Developers
Implement authentication in minutes with our comprehensive SDKs and documentation. No security expertise required.
- Quick Integration: Add authentication to your app in under 10 minutes
- Modern SDKs: Support for .NET, Node.js, Python, React, Angular, and more
- Comprehensive Docs: Step-by-step guides, tutorials, and API reference for identity and verification APIs
- Active Support: Developer community and dedicated technical support
// Program.cs — add auth in minutes (.NET 10)
// dotnet add package Microsoft.AspNetCore.Authentication.OpenIdConnect
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
options.Authority = "https://auth.ailacs.com";
options.ClientId = builder.Configuration["Ailacs:ClientId"];
options.ResponseType = "code";
options.UsePkce = true;
options.Scope.Add("openid"); options.Scope.Add("profile"); options.Scope.Add("email");
options.SaveTokens = true;
options.MapInboundClaims = false;
options.GetClaimsFromUserInfoEndpoint = true;
});
// Protect your endpoints with a single attribute
[Authorize]
public class DashboardController : Controller { }
// B2C Auth — Node.js / Express
// npm install openid-client express-session
const { Issuer, generators } = require('openid-client');
let client;
Issuer.discover('https://auth.ailacs.com').then(issuer => {
client = new issuer.Client({
client_id: process.env.AILACS_CLIENT_ID,
redirect_uris: ['https://yourapp.com/callback'],
response_types: ['code'],
});
});
app.get('/login', (req, res) => {
const codeVerifier = generators.codeVerifier();
req.session.codeVerifier = codeVerifier;
req.session.state = generators.state();
res.redirect(client.authorizationUrl({
scope: 'openid profile email',
state: req.session.state,
code_challenge: generators.codeChallenge(codeVerifier),
code_challenge_method: 'S256',
}));
});
app.get('/callback', async (req, res) => {
const tokenSet = await client.callback(
'https://yourapp.com/callback',
client.callbackParams(req),
{ code_verifier: req.session.codeVerifier, state: req.session.state }
);
req.session.user = tokenSet.claims();
res.redirect('/dashboard');
});
# B2C Auth — Python / FastAPI
# pip install authlib fastapi starlette uvicorn
from fastapi import FastAPI, Request, Depends, HTTPException
from fastapi.responses import RedirectResponse
from authlib.integrations.starlette_client import OAuth
from starlette.middleware.sessions import SessionMiddleware
import os
app = FastAPI()
app.add_middleware(SessionMiddleware, secret_key=os.environ['SESSION_SECRET'])
oauth = OAuth()
oauth.register(
name='ailacs',
server_metadata_url='https://auth.ailacs.com/.well-known/openid-configuration',
client_id=os.environ['AILACS_CLIENT_ID'],
client_kwargs={ 'scope': 'openid profile email', 'code_challenge_method': 'S256' }
)
@app.get('/login')
async def login(request: Request):
return await oauth.ailacs.authorize_redirect(request, request.url_for('auth_callback'))
@app.get('/callback')
async def auth_callback(request: Request):
token = await oauth.ailacs.authorize_access_token(request)
request.session['user'] = token['userinfo']
return RedirectResponse(url='/dashboard')
def require_auth(request: Request):
if 'user' not in request.session:
raise HTTPException(status_code=401)
return request.session['user']
@app.get('/dashboard')
async def dashboard(user=Depends(require_auth)):
return {'message': f"Hello, {user['name']}"}
// B2C Auth — Java / Spring Boot 3
// application.yml:
// spring.security.oauth2.client.registration.ailacs:
// client-id: ${AILACS_CLIENT_ID}
// client-authentication-method: none # public client — PKCE only
// authorization-grant-type: authorization_code
// redirect-uri: "{baseUrl}/login/oauth2/code/ailacs"
// scope: openid,profile,email
// spring.security.oauth2.client.provider.ailacs:
// issuer-uri: https://auth.ailacs.com
@Configuration @EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/public/**").permitAll()
.anyRequest().authenticated()
)
.oauth2Login(oauth2 -> oauth2
.defaultSuccessUrl("/dashboard", true)
);
return http.build();
}
}
// B2C Auth — Go
// go get github.com/coreos/go-oidc/v3/oidc golang.org/x/oauth2
var (
provider *oidc.Provider
oauth2Conf oauth2.Config
verifier *oidc.IDTokenVerifier
)
func init() {
ctx := context.Background()
provider, _ = oidc.NewProvider(ctx, "https://auth.ailacs.com")
verifier = provider.Verifier(&oidc.Config{ClientID: "your-client-id"})
oauth2Conf = oauth2.Config{
ClientID: "your-client-id",
RedirectURL: "https://yourapp.com/callback",
Endpoint: provider.Endpoint(),
Scopes: []string{oidc.ScopeOpenID, "profile", "email"},
}
}
func loginHandler(w http.ResponseWriter, r *http.Request) {
cv := oauth2.GenerateVerifier()
http.SetCookie(w, &http.Cookie{Name: "pkce_v", Value: cv, HttpOnly: true, Secure: true})
http.Redirect(w, r, oauth2Conf.AuthCodeURL(randomState(),
oauth2.S256ChallengeOption(cv)), http.StatusFound)
}
func callbackHandler(w http.ResponseWriter, r *http.Request) {
vc, _ := r.Cookie("pkce_v")
token, _ := oauth2Conf.Exchange(r.Context(), r.URL.Query().Get("code"),
oauth2.VerifierOption(vc.Value))
rawID, _ := token.Extra("id_token").(string)
idToken, _ := verifier.Verify(r.Context(), rawID)
var claims struct{ Sub, Name, Email string }
idToken.Claims(&claims)
http.Redirect(w, r, "/dashboard", http.StatusFound)
}
<?php
// B2C Auth — PHP / Laravel 11
class AuthController extends Controller
{
public function login(Request $request)
{
$verifier = bin2hex(random_bytes(32));
$challenge = rtrim(strtr(base64_encode(
hash('sha256', $verifier, true)), '+/', '-_'), '=');
session(['pkce_verifier' => $verifier, 'oauth_state' => bin2hex(random_bytes(16))]);
return redirect('https://auth.ailacs.com/connect/authorize?' . http_build_query([
'response_type' => 'code',
'client_id' => config('services.ailacs.client_id'),
'redirect_uri' => config('services.ailacs.redirect'),
'scope' => 'openid profile email',
'state' => session('oauth_state'),
'code_challenge' => $challenge,
'code_challenge_method' => 'S256',
]));
}
public function callback(Request $request)
{
abort_unless($request->state === session('oauth_state'), 422);
$tokens = Http::asForm()->post('https://auth.ailacs.com/connect/token', [
'grant_type' => 'authorization_code',
'code' => $request->code,
'redirect_uri' => config('services.ailacs.redirect'),
'client_id' => config('services.ailacs.client_id'),
'code_verifier' => session('pkce_verifier'),
])->json();
$claims = $this->verifyIdToken($tokens['id_token']);
Auth::login(User::updateOrCreate(['sub' => $claims['sub']], ['email' => $claims['email']]));
return redirect('/dashboard');
}
}
# B2C Auth — Ruby on Rails 7+
# gem 'omniauth-openid-connect', 'omniauth-rails_csrf_protection'
# config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
provider :openid_connect,
name: :ailacs,
scope: [:openid, :profile, :email],
response_type: :code,
issuer: 'https://auth.ailacs.com',
discovery: true,
pkce: true,
client_options: {
identifier: ENV['AILACS_CLIENT_ID'],
secret: ENV['AILACS_CLIENT_SECRET'],
redirect_uri: ENV['AILACS_REDIRECT_URI']
}
end
# app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
def create
auth = request.env['omniauth.auth']
user = User.find_or_initialize_by(sub: auth.uid)
user.update!(name: auth.info.name, email: auth.info.email)
session[:user_id] = user.id
redirect_to dashboard_path
end
def destroy
session[:user_id] = nil
redirect_to "https://auth.ailacs.com/connect/logout" \
"?post_logout_redirect_uri=#{CGI.escape(root_url)}"
end
end
// B2C Auth — TypeScript / React + react-oidc-context
// npm install oidc-client-ts react-oidc-context
// src/auth/authConfig.ts
import { UserManager, WebStorageStateStore } from 'oidc-client-ts';
export const userManager = new UserManager({
authority: 'https://auth.ailacs.com',
client_id: import.meta.env.VITE_AILACS_CLIENT_ID,
redirect_uri: `${window.location.origin}/callback`,
post_logout_redirect_uri: `${window.location.origin}/`,
response_type: 'code',
scope: 'openid profile email',
// PKCE enabled by default — no client_secret needed
automaticSilentRenew: true,
userStore: new WebStorageStateStore({ store: window.sessionStorage }),
});
// src/main.tsx
import { AuthProvider } from 'react-oidc-context';
ReactDOM.createRoot(document.getElementById('root')!).render(
<AuthProvider userManager={userManager}><App /></AuthProvider>
);
// src/components/ProtectedRoute.tsx
export function ProtectedRoute({ children }: { children: React.ReactNode }) {
const auth = useAuth();
if (auth.isLoading) return <div>Loading...</div>;
if (!auth.isAuthenticated) { auth.signinRedirect(); return null; }
return <>{children}</>;
}
Trusted by Teams Worldwide
From startups to enterprises, thousands of organizations rely on Ailacs Identity for secure authentication.
99.9%
Uptime SLA
24/7
Support
Authentication for Every Use Case
Whether you're building a consumer app, a multi-org SaaS platform, or integrating enterprise identity providers, Ailacs Identity covers every auth scenario.
B2C Authentication
Deliver frictionless consumer login with social auth, passwordless sign-in, email verification, and TOTP MFA. B2C auth that scales to millions of end-users without managing infrastructure.
B2B Authentication
Multi-tenant B2B auth with per-organisation SSO, tenant-scoped RBAC, and invite-based user provisioning. Let enterprise customers bring their own identity provider with federated B2B auth.
OpenID Connect Auth
Standards-based OpenID Connect authentication powered by OpenIddict. Issue and validate ID tokens, support the authorisation code flow with PKCE, and integrate any OIDC-compatible client in minutes.
OAuth 2.0 Auth
Full OAuth 2.0 authorisation server with support for authorisation code, client credentials, and refresh token flows. Protect your APIs with scoped access tokens and fine-grained OAuth 2.0 permissions.
Enterprise SSO Auth
One-click SSO auth for enterprise customers. Connect to Azure AD, Okta, Google Workspace, and any SAML 2.0 or OIDC identity provider. Centralise access management across all your applications.
JWT & Token Auth
Signed JWT access tokens and opaque reference tokens with configurable lifetime, custom claims, and automatic key rotation. Drop-in JWT auth for .NET, Node.js, Python, and any standards-compliant API.
Ready to Get Started?
Join thousands of developers who trust Ailacs Identity for their authentication needs. Start building in minutes with our free tier.