Demo builder
Choose a scenario and set up how it looks and works — the result appears on the right straight away. When it looks right, run the real Veriqa flow and go through it yourself.
The screen around it is a mock-up; the request you get in the messenger is real.
The question and answer buttons arrive right in the chat. Email isn’t offered here: an email can’t be answered with a button.
These settings apply to sign-in only. When an action is confirmed, your app gets a yes or no, not user data.
Your app can get a verified phone number or email right at sign-in, with no separate registration. Learn more
Sign in to the app
Choose a channel and scan the QR code or tap the button
The wrapping is a mock-up; the Veriqa transaction underneath is real.
This is a mockup. “Run sign-in” opens the real sign-in page with these parameters.
This is a mockup. “Run confirmation” creates a real Veriqa confirmation — answer it in your messenger.
// Wiring up Veriqa AuthServer (inproc): the OpenIddict issuer is embedded in the application process.
builder.Services.AddVeriqaAuthServer(builder.Configuration, builder.Environment, authServer =>
{
// OpenIddict store (clients, tokens, authorizations): the volatile in-memory one, chosen
// explicitly. There is no default — a host that says nothing here fails to start outside
// Development. In production say authServer.UseOpenIddictDatabase(ef => ef.UseNpgsql(...)) instead.
authServer.UseInMemoryOpenIddictStore();
// Transaction store: in-memory (for development/demo; in production — EF Core/Redis).
authServer.ConfigureTransactionEngine(te =>
{
te.UseInMemoryStore();
});
// Channel adapters: all 4 trusted Veriqa channels. Each is
// enabled/disabled via configuration (Veriqa:Channels:<Channel>:Enabled section); with Enabled=false
// only the options and the validator are registered — tokens/SMTP are not required at startup
// (dotnet run starts without external configuration). Enable the channel you need and set its credentials.
authServer.AddChannelAdapters(adapters =>
{
adapters.AddTelegram();
adapters.AddWhatsApp();
adapters.AddMax();
adapters.AddEmail();
});
});
// Veriqa AuthServer OIDC routing (authorize / token / userinfo / callback) — a single call.
app.MapVeriqaAuthServer();
// The issuer has no page of its own to show a signed-in user: a sign-in is started by a relying
// party and ends there, with the claims in its session. This route only tells the host is up.
app.MapGet("/", () => "Hello!");
{
"Veriqa": {
"Channels": {
"Telegram": { "Enabled": true, "InboundVerification": "shared_secret" },
"WhatsApp": { "Enabled": true, "InboundVerification": "signature" },
"Max": { "Enabled": true, "InboundVerification": "shared_secret" },
"Messenger": { "Enabled": true, "InboundVerification": "signature" },
"Instagram": { "Enabled": true, "InboundVerification": "signature" },
"Email": { "Enabled": true, "InboundVerification": "outbound_fetch" }
},
"TransactionEngine": {
"TransactionTtlSeconds": 300
},
"HopMode": { "Enabled": true, "QrMode": "Unified" },
"OpenIddict": {
"Clients": [
{
"ClientId": "my-app",
"AllowedRedirectUris": [ "https://localhost:7020/signin-oidc" ],
"LoginConfirmationMode": "InChannel"
}
]
}
}
}