Developers

For developers · OpenID Connect

Sign in with Skysmind.
On anything you build.

Let people sign in to your website, app or service with the Skysmind account they already use for Nuvira. It's standard OAuth 2 and OpenID Connect, so it works with the library you already have, and it's private by design: you get a stable ID and a username, never an email, and never anything from their messages.

Issuerhttps://auth.skysmindtech.com
Discovery/.well-known/openid-configuration
FlowAuthorization code + PKCE

How it works

  1. Your appsends people to Skysmind with your client_id
  2. Skysmindsigns them in (password, or a QR they approve in Nuvira) and asks if they want to continue to you
  3. Back to youwith a one-time code that lasts 60 seconds
  4. Your serverswaps the code for an id_token and an access_token
01A private ID per app

Each app sees its own ID for a person (sub), the same every time. Two services can't match their users up through Skysmind.

02Only what you ask for

A username and picture with profile, their Nuvira ID with nuvira_id. Never an email or a phone number.

03Adults only, for now

Nuvira Family child accounts can't sign in to apps outside Skysmind. Your sign-in screen says plainly that Skysmind didn't make your app.

Register your app

You need a Skysmind account. Every app gets a client_id; a server that can keep a secret also gets a client_secret, shown once.

Loading

Hook it in

Pick the one that matches how your service works. They all end the same way: you know who signed in, by a stable sub.

Give your library the issuer. It finds everything else from /.well-known/openid-configuration.

// auth.ts
import NextAuth from "next-auth"

export const { handlers, auth, signIn, signOut } = NextAuth({
  providers: [{
    id: "skysmind",
    name: "Skysmind",
    type: "oidc",
    issuer: "https://auth.skysmindtech.com",
    clientId: process.env.SKYSMIND_CLIENT_ID,
    clientSecret: process.env.SKYSMIND_CLIENT_SECRET,
    authorization: { params: { scope: "openid profile" } },
    checks: ["pkce", "state", "nonce"],
    profile: (p) => ({ id: p.sub, name: p.preferred_username, image: p.picture }),
  }],
})

// Return URL to register: https://your.site/api/auth/callback/skysmind

Build a sign-in link

Fill in your app and watch the link build itself. "Try it" walks through the real screens; your return URL has to be registered first.

Try it↗

Reference

Endpoints

WhatWhere
DiscoveryGET /.well-known/openid-configuration
AuthorizeGET /oauth/authorize
TokenPOST /oauth/token
User infoGET /oauth/userinfo
Signing keysGET /oauth/jwks
RevokePOST /oauth/revoke

Scopes and claims

ScopeYou get
openidsub and an id_token. sub starts with sk_ and is unique to your app.
profilepreferred_username, and picture when they have one
nuvira_idnuvira_id, the sm number friends add them with

Good to know

The button

Use ours from sdk.js, or draw your own: the three bars, "Sign in with Skysmind", ink on cream or cream on ink. Please don't change the bars or the words.