Desenvolupadors

Inici de sessió amb Unidy.

Identitat basada en estàndards, amb OpenID Connect. El flux de codi d'autorització amb PKCE, un ID token signat i un identificador privat per a cada persona a cada web.

Emissor
https://id.unidy.com
Flux
Codi d'autorització + PKCE (S256)
Subjecte
Pairwise: un per web
ID token
Signat, RS256 o ES256

Com funciona

Sis passos d'OpenID Connect de tota la vida. Res que la teva llibreria no sàpiga ja.

  1. 1La teva app

    Envia la persona a Unidy

    Amb un repte PKCE, un state i un nonce.

    GET /oauth2/auth
  2. 2id.unidy.com

    Unidy mostra la teva petició

    El nom, el logo i l'adreça web del teu web, i cada dada que demanes.

  3. 3La persona

    Inicia la sessió i decideix

    Desmarca el que no vol compartir. Després tria Permet, Permet una vegada o Denega.

  4. 4La teva app

    Torna un codi

    A l'adreça de redirecció que has registrat, amb el teu state.

    ?code=…&state=…
  5. 5El teu servidor o la teva pàgina

    Bescanvia'l per tokens

    Canvia el codi i el verificador PKCE per un ID token i un access token.

    POST /oauth2/token
  6. 6La teva app

    Obre la teva pròpia sessió

    Comprova l'ID token, busca el sub als teus registres i inicia la sessió de la persona.

Inici ràpid

Tot el que hi ha a continuació és estàndard. Si fas servir una llibreria d'OpenID Connect, apunta-la a l'adreça de descobriment i la major part ja la tindràs feta.

  1. 1

    Registra el teu web

    A l'app d'Unidy, el compte d'empresa aprovat de la teva empresa a Unidy obre Desenvolupadors i hi afegeix un web: el nom, l'adreça web, la política de privacitat i, si vols, un logo. Després, les dades (scopes) que el web pot demanar. Qualsevol petició amb un altre scope es rebutja.

    Tria una sola vegada com inicia la sessió de la gent:

    • Amb un servidor: reps un client id i un secret, que es mostra una sola vegada. El servidor bescanvia el codi.
    • Al navegador: un client id i cap secret. PKCE amb S256 és obligatori, i només els teus orígens de redirecció poden cridar el token endpoint.
    • Adreces de redirecció: fins a 10, totes https en un sol host. Per a la teva pròpia màquina, registra un segon web amb adreces http://localhost.
  2. 2

    Llegeix el document de descobriment

    Llegeix-ne els endpoints en lloc d'escriure'ls al codi.

    curl https://id.unidy.com/.well-known/openid-configuration
    
    {
      "authorization_endpoint": "https://id.unidy.com/oauth2/auth",
      "token_endpoint": "https://id.unidy.com/oauth2/token",
      "userinfo_endpoint": "https://id.unidy.com/userinfo",
      "jwks_uri": "https://id.unidy.com/.well-known/jwks.json",
      …
    }
  3. 3

    Envia la petició d'autorització

    Genera un verificador aleatori i guarda'l, juntament amb un state i un nonce aleatoris, fins que la persona torni. Envia el repte SHA-256 del verificador.

    const base64url = (bytes) =>
      btoa(String.fromCharCode(...bytes)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
    const random = () => base64url(crypto.getRandomValues(new Uint8Array(32)));
    
    const config = await (await fetch('https://id.unidy.com/.well-known/openid-configuration')).json();
    const verifier = random(), state = random(), nonce = random();
    const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));
    
    const url = new URL(config.authorization_endpoint);
    url.search = new URLSearchParams({
      response_type: 'code',
      client_id: 'YOUR_CLIENT_ID',
      redirect_uri: 'https://shop.example/callback',
      scope: 'openid profile unidy_id email',
      state,
      nonce,
      code_challenge: base64url(new Uint8Array(digest)),
      code_challenge_method: 'S256',
    });
    location.assign(url); // keep verifier, state and nonce in sessionStorage first
  4. 4

    Bescanvia el codi per tokens

    A la teva pàgina de redirecció, comprova que el state coincideix amb el que has enviat, una sola vegada. Després bescanvia el codi. Un servidor s'autentica amb el seu secret (HTTP Basic). Un web al navegador envia el client_id, sense secret.

    curl -X POST https://id.unidy.com/oauth2/token \
      -u 'YOUR_CLIENT_ID:YOUR_CLIENT_SECRET' \
      -d grant_type=authorization_code \
      -d code=THE_CODE \
      -d redirect_uri=https://shop.example/callback \
      -d code_verifier=THE_VERIFIER
    
    { "access_token": "…", "id_token": "…", "token_type": "bearer", "expires_in": …, "scope": "openid profile unidy_id email" }
  5. 5

    Valida l'ID token

    No et refiïs mai d'un ID token que no hagis comprovat. La teva llibreria d'OpenID Connect ho fa tot:

    • La signatura, amb la clau de jwks_uri que coincideix amb el kid del token.
    • iss és igual a l'issuer del document de descobriment.
    • aud conté el teu client id.
    • exp encara és en el futur.
    • nonce és igual al que has enviat.
  6. 6

    Identifica la persona

    Identifica el compte pel sub. És privat del teu web: la mateixa persona té un sub diferent a qualsevol altre lloc, així que ningú no la pot seguir per internet amb aquest valor.

    Fes servir unidy_id per mostrar qui ha iniciat la sessió. És l'ID d'Unidy amb què es presenta la persona, i el pot personalitzar, així que no serveix com a clau.

    {
      "sub": "8b1c2f…e40f",
      "aud": ["YOUR_CLIENT_ID"],
      "nonce": "…",
      "name": "Ana Ruiz",
      "unidy_id": "ana.ruiz",
      "email": "ana.shop@mail.example",
      "email_verified": false
    }
  7. 7

    Crea la teva pròpia sessió

    Busca el sub als teus registres. Unidy no et diu mai si la persona és nova: si no tens cap compte per a aquest sub, crea'n un. Després obre la teva sessió de sempre.

  8. 8

    Opcional: llegeix les dades amb l'access token

    GET /api/v1/me respon amb el sub i cada dada que la persona ha acceptat compartir i que encara permet. Després de Permet una vegada, o si la persona desconnecta el teu web, respon not_linked.

    curl https://id.unidy.com/api/v1/me \
      -H 'Authorization: Bearer ACCESS_TOKEN'
    
    { "sub": "8b1c2f…e40f", "name": "Ana Ruiz", "email": "ana.shop@mail.example", "email_verified": false }

Scopes i claims

openid es demana sempre. Cada un dels altres scopes és una dada, una casella que la persona pot desmarcar. Una dada que no ha omplert, o que ha desmarcat, no s'inclou.

ScopeClaimsQuè reps
openidsubL'identificador privat per al teu web
unidy_idunidy_idL'ID d'Unidy de la persona
profilenamegiven_namemiddle_namefamily_nameEls seus noms
emailemailemail_verifiedL'adreça de correu electrònic que ha triat per al teu web. Verificada quan és la que fa servir per iniciar la sessió a Unidy
phonephone_numberphone_number_verifiedUn número de telèfon verificat que ha triat per al teu web
addressaddressL'adreça postal que ha triat per al teu web: formatted, street_address, locality, region, postal_code, country
birthdatebirthdateData de naixement, YYYY-MM-DD
residenceresidencePaís de residència, ISO 3166-1 alpha-2
languagelocaleEl seu idioma
offline_accessUn refresh token, perquè el teu web pugui renovar l'access token

Demana només el que necessites. La gent desmarca el que no entén per què li demanes.

L'SDK per al navegador

Per a webs que funcionen al navegador: Continua amb Unidy sense escriure el flux tu mateix. Un sol arxiu petit, sense dependències.

Es lliura en arxius, juntament amb la guia per a desenvolupadors i un web d'exemple, no per npm. Copia l'arxiu al teu web. Per aconseguir l'SDK, la guia i el web d'exemple, escriu a partners@unidy.com.

dist/unidy.js
Un <script> normal. Defineix la variable global Unidy.
dist/unidy.esm.js
Un mòdul ES, per a un bundler.
dist/unidy.d.ts
Tipus de TypeScript.
A la teva pàgina d'inici de sessió
<div id="unidy"></div>
<script src="/unidy.js"></script>
<script>
  Unidy.init({ clientId: 'YOUR_CLIENT_ID', redirectUri: 'https://shop.example/callback.html', scopes: ['profile', 'email'] });
  Unidy.button('#unidy', { kind: 'continue' });
</script>
A la teva pàgina de redirecció
Unidy.init({ clientId: 'YOUR_CLIENT_ID', redirectUri: 'https://shop.example/callback.html', scopes: ['profile', 'email'] });
Unidy.handleRedirect()
  .then(({ user }) => { /* find or create the account for user.sub */ location.assign('/account'); })
  .catch((error) => { if (error.code === 'access_denied') location.assign('/'); });

API

Unidy.init({ clientId, redirectUri, scopes, issuer, storage })
Configura l'SDK. Crida-la primer a cada pàgina.
Unidy.button(element, { kind, theme, lang })
Dibuixa el botó oficial Continua amb Unidy.
Unidy.signIn({ scopes, prompt })
Envia la persona a Unidy amb PKCE (S256), un state i un nonce.
Unidy.handleRedirect()
Comprova el state, bescanvia el codi, valida l'ID token i es resol amb { user, kind, scopes }.
Unidy.user()
Els claims de la persona que ha iniciat la sessió, o null.
Unidy.details()
Les dades que la persona ha acceptat, de /api/v1/me.
Unidy.signOut()
Oblida els tokens i revoca el refresh token a Unidy.
Unidy.UnidyError
Cada error, amb un codi com access_denied, not_linked o invalid_token.

Llista de comprovació de seguretat

  • Guarda el client secret al teu servidor. No el posis mai en una pàgina web.
  • Fes servir PKCE amb S256 a cada petició. Els webs al navegador no se'l poden saltar.
  • Envia un state aleatori i accepta'l una sola vegada, només a la pestanya que l'ha demanat.
  • Envia un nonce i comprova'l a l'ID token.
  • Valida l'ID token: la signatura amb jwks_uri, iss, aud i exp.
  • Identifica els comptes pel sub. Mai per email ni per unidy_id.
  • Registra adreces de redirecció https exactes, en un sol host.
  • Demana només els scopes que necessitis.
  • Pàgines que guarden tokens: una Content-Security-Policy estricta i cap script de tercers.
  • En tancar la sessió, revoca el refresh token a /oauth2/revoke. signOut() ho fa.

Disponible ara

  • Un proveïdor d'OpenID Connect a id.unidy.com, amb descobriment
  • El flux de codi d'autorització amb PKCE, per a webs amb servidor o al navegador
  • Un sub privat per web
  • Els scopes de dalt, cadascun una dada que la persona aprova
  • GET /api/v1/me amb l'access token
  • L'SDK per al navegador, la guia per a desenvolupadors i un web d'exemple

Registra el teu web

Una empresa amb un compte d'empresa aprovat a Unidy registra els seus webs ella mateixa, a l'app d'Unidy, a Desenvolupadors. Encara no tens compte d'empresa? Escriu-nos i t'ajudarem a obrir-ne un.

Obre com a pàgina