01 · First visitLoma Coffee is an example shop

Let your visitors sign in with Face ID. A WhatsApp code the first time, a glance every time after. No passwords to forget, and none for you to keep.

One script tag on any site, a plugin for WordPress, a package for Next.js.

Look. You’re in.

Sign in on the right to finish this sentence.Sign in below to finish this sentence.

Try it · type any number · nothing is sent

OkiaWhatsApp

Tap the message to fill the code

Sign in to Loma Coffee

lomacoffee.example

Sign in

New here? Enter your number

We’ll send a code to your WhatsApp

You’ll stay signed in on this device for 30 days

Secured by Okia

02 · Every visit afterVela is another example shop

Set up once, on any site that uses Okia. On every other one, the sheet says “Welcome back” and one glance signs you in. Okia keeps you signed in on that device for 30 days, and tells you so in plain words, not a checkbox.

What each site receives

lomacoffee.examplesubpw_3vQk9XbTq2LmRzA…
vela.examplesubpw_················

Same person. Two IDs. Nothing that links them.

We’ll assume you met Loma Coffee above.

Sign in to Vela

vela.example

Welcome back

You’ll stay signed in on this device for 30 days

Secured by Okia

First visitTarget: under a minute, once

Sign in to Loma Coffee

lomacoffee.example

Sign in

New here? Enter your number

We’ll send a code to your WhatsApp

You’ll stay signed in on this device for 30 days

Secured by Okia

Your number

Sign in to Loma Coffee

lomacoffee.example

Enter the code we sent to +9725•••••42

Resend code in 0:30

You’ll stay signed in on this device for 30 days

Secured by Okia

The WhatsApp code

Sign in to Loma Coffee

lomacoffee.example

Sign in with Face ID next time

One look. No codes.

Secured by Okia

Turn on Face ID

Sign in to Loma Coffee

lomacoffee.example

Check your device

Secured by Okia

A glance

Sign in to Loma Coffee

lomacoffee.example

You’re signed in

Secured by Okia

You’re in
Every visit afterTarget: under five seconds, no typing

Sign in to Vela

vela.example

Welcome back

You’ll stay signed in on this device for 30 days

Secured by Okia

A glance

Borrowed laptop, or Face ID switched off? A WhatsApp code is one tap away.

03 · On your siteColour: Plum

Add one button. Your visitors get a sign-in sheet with your name and your verified domain at the top, so they can see exactly where they’re signing in. A popup on a computer, a full page on a phone.

Make it yours

Set your logo and colour in the dashboard, with a live preview. The sheet won’t wear a colour people can’t read. “Secured by Okia” stays at the bottom, on every site.

LOMA COFFEEBeans · Brewing · Cafés

New this week

Fresh roast, Tuesday and Friday

Sign in to Loma Coffee

lomacoffee.example

Welcome back

You’ll stay signed in on this device for 30 days

Secured by Okia

  • Your name
  • Your verified domain
  • Secured by Okia, always
  • The one button you add
04 · A different ID for every siteIDs made on this page: 0

Every site gets its own ID for the same person, pw_ and a hash made for that site alone. No two sites can match their IDs, not even two run by the same company. And Okia offers no way to look someone up across sites.

lomacoffee.example receives

pw_3vQk9XbTq2LmRzAe7sWcJ1oYhN5uGfKd0pVxEiB4rMt

    An illustration. This page invents a secret when it loads and forgets it when you leave, so these IDs change on reload. Real IDs come from a secret for each site that never leaves Okia.

    Phone numbers stay private too. A site sees one only if it asks, is live on a verified domain, and the person taps “Continue” rather than “Continue without sharing”.

    05 · Plan BAlways one tap away

    Every screen that asks your visitors for Face ID also offers a WhatsApp code. On a new phone, a code gets them in and they can turn Face ID back on. A code never erases Face ID, and anyone who skips it can stay on codes. Okia sends every code from its own WhatsApp number, so there’s nothing for you to set up. No SMS, no email.

    Sign in to Loma Coffee

    lomacoffee.example

    this device was cancelled

    Try again, or get a code on WhatsApp instead

    Secured by Okia

    Choose “Use a WhatsApp code instead”

    OkiaWhatsApp

    Tap the message to fill the code

    06 · SecurityPasswords stored: 0
    1. 01

      Half a key opens nothing.

      Okia keeps only the public half of each Face ID key, and that half can’t sign anyone in. The private half stays with the person. Okia never sees it.

    2. 02

      Look-alikes get nothing.

      Face ID only answers to the real Okia sign-in at auth.okia.io. A copycat can copy the page, but not the glance.

      Illustration of what the device does

      Pick an address, then tap the key.

    3. 03

      Replayed tokens get caught.

      Refresh tokens change every time they’re used. Replay an old one and Okia revokes the whole chain.

    4. 04

      Old numbers start fresh.

      Phone numbers get recycled. When an account has been inactive for 180 days or more, a sign-in with its number starts a brand-new identity and the old one is quarantined. Nobody inherits a stranger’s account.

    07 · For developersOAuth2 + PKCE · ES256 · JWKS

    Paste one script tag and place <okia-button> where you want it. Your server trades a short-lived code for signed tokens in one call, in any language. It’s standard OAuth2 with PKCE, so off-the-shelf OAuth clients work unmodified.

    POST /oauth/token
    One endpoint, any language.
    ES256 JWTs
    Verified against a public JWKS. Keys rotate on their own.
    pw_ IDs
    A different subject on every site.
    60 seconds
    How long an auth code lives. It works once.
    S256 only
    PKCE on every client, secret or not.

    On the wire

    One sign-in, five stops. Four of them are yours.

    1. 01

      Your page

      Your visitor taps <okia-button>.

    2. 02

      The Okia sheetauth.okia.io

      Sign in to Your Shop

      yourshop.example

      Welcome back

      You’ll stay signed in on this device for 30 days

      Secured by Okia

      A glance, or a WhatsApp code the first time.

    3. 03

      Your redirect URI

      yoursite.com/account?code=a1·····&state=…

      Single use · 60 seconds

      The browser comes back with ?code=…&state=…

    4. 04

      Your server

      POST /oauth/token
      grant_type=authorization_code
      code=…&code_verifier=…
      200 { "id_token": "eyJ…",
            "expires_in": 900 }

      One POST to /oauth/token trades the code for tokens.

    5. 05

      Your session

      iss
      auth.okia.io
      sub
      pw_Zr8xQm2a…
      amr
      ["webauthn"]
      token_use
      "id"

      Signature checked against the JWKS

      Verify the ID token, then start your own session.

    Inspect

    Run a sign-in, or pick a stop to see what crosses it.

    Pick your stack.

    index.html
    <script  src="https://auth.okia.io/js/v1.js"  data-client-id="pw_c_YOUR_CLIENT_ID"  data-redirect-uri="https://yoursite.com/account"  data-exchange-url="/auth/okia/exchange"  defer></script><!-- Put this element where the button should appear --><okia-button></okia-button>
    server.js · the one endpoint you write (excerpt)
    // POST /auth/okia/exchange — the SDK sends { code, state, code_verifier, redirect_uri }const tokenRes = await fetch(`${AUTH_ORIGIN}/oauth/token`, {  method: "POST",  headers: { "content-type": "application/x-www-form-urlencoded", authorization: basic },  body: new URLSearchParams({    grant_type: "authorization_code",    code: body.code,    redirect_uri: body.redirect_uri,    code_verifier: body.code_verifier,  }),});const tokens = await tokenRes.json();({ payload: claims } = await jwtVerify(tokens.id_token, JWKS, {  issuer: AUTH_ORIGIN, audience: CLIENT_ID, algorithms: ["ES256"],}));if (claims.token_use !== "id") return res.status(401).json({ error: "invalid_token" });req.session.sub = claims.sub;

    The dashboard prints this tag with your client ID and page filled in. The whole quickstart

    Know how they signed in.

    Example ID token (excerpt)

    { "sub": "pw_3vQk9XbT…", "amr":  }

    A passkey. Phishing-resistant, and the person was verified on their device.

    Tap the value for the other answer.

    Test mode first. Live on its own. Test mode

    Sign in to Your Shop

    Test mode — this site hasn’t been verified yet

    Until your domain is verified, the sheet shows this banner, signs in up to 25 people and can’t share phone numbers.

    1. Add a TXT record at _okia.<domain>, or put a file at /.well-known/okia-verify.txt.
    2. Okia keeps checking and flips your site live on its own. On WordPress, the plugin serves the file for you.

    Leave it in place. Okia re-checks every week.

    Sites, branding, end users, team, signed webhooks and API keys live at app.okia.io. You sign in to it with Okia. Docs for every stack →

    08 · Your siteNot one password field on this page

    Your visitors areone glance away.

    You sign up the way your visitors will, with your phone and a WhatsApp code. Add your first site and start testing straight away.

    Okia — Face ID sign-in for any website