Vai al contenuto principale

App connesse e OAuth

L'API B1 supporta OAuth 2.0 affinché un'applicazione di terze parti possa chiedere il permesso a ogni amministratore della chiesa per accedere ai loro dati — senza che la chiesa condivida mai una password o chiave API. Un'App connessa è un token OAuth che un amministratore della chiesa ha approvato; revocarlo taglia l'accesso dell'app di terze parti con un clic. Utilizza questo percorso per connettori SaaS multi-tenant. Per un'integrazione a chiesa singola preferisci Chiavi API.

Prima di iniziare

  • Un client OAuth deve essere registrato (attualmente da un amministratore del server B1) prima che le chiese possano concedergli accesso
  • Tutti gli endpoint OAuth vivono sotto il modulo Membership: /membership/oauth/...
  • I token di accesso sono JWT — portano i permessi dell'utente filtrati dagli ambiti concessi

Concetti

TermineSignificato
Client OAuthL'app di terze parti stessa — identificata da client_id, protetta da client_secret. Registrata una volta con B1, condivisa tra tutte le chiese che la installano.
App connessaUna coppia specifica (client, church-admin) dove l'admin ha concesso al client l'accesso. Ogni app connessa è sostenuta da un token di aggiornamento OAuth.
Token di accessoUn JWT a breve durata (≈ 7 giorni) che il client utilizza per le chiamate API. Stessa forma di un JWT utente — Authorization: Bearer <jwt>.
Token di aggiornamentoUna stringa opaca a lunga durata (≈ 90 giorni) che il client utilizza per coniare nuovi token di accesso.
AmbitoLimita quello che il token di accesso può fare — vedi il catalogo di ambiti.

Flussi di concessione

B1 supporta tre flussi OAuth, tutti definiti da RFC 6749 + RFC 8628.

Codice di autorizzazione (app web)

Usa quando la tua app ha una componente lato server e può mantenere client_secret privato.

  1. Autorizza

    POST /membership/oauth/authorize
    Authorization: Bearer <user JWT>
    Content-Type: application/json

    { "client_id": "...", "redirect_uri": "https://app.example.com/cb",
    "response_type": "code", "scope": "people:read groups:read", "state": "xyz" }

    Restituisce { "code": "...", "state": "xyz" }. L'endpoint del codice di autorizzazione è intenzionalmente un POST autenticato — la tua app raccoglie il JWT B1 dell'utente (in genere ospitando un pulsante nella sessione B1 dell'utente) e lo inoltra come parte del passaggio di consenso.

  2. Scambia il codice per i token

    POST /membership/oauth/token
    Content-Type: application/json

    { "grant_type": "authorization_code", "code": "...",
    "client_id": "...", "client_secret": "...", "redirect_uri": "..." }

    Restituisce la risposta del token:

    {
    "access_token": "eyJ...",
    "token_type": "Bearer",
    "expires_in": 604800,
    "created_at": 1715000000,
    "refresh_token": "abc123…",
    "scope": "people:read groups:read"
    }
  3. Aggiorna quando il token di accesso sta per scadere:

    POST /membership/oauth/token
    Content-Type: application/json

    { "grant_type": "refresh_token", "refresh_token": "...",
    "client_id": "...", "client_secret": "..." }

    Il token di aggiornamento scade dopo 90 giorni di mancato utilizzo; se è scaduto l'amministratore della chiesa riautorizza.

Codice dispositivo (TV, chioschi, CLI)

Usa quando il dispositivo non ha un browser. Definito da RFC 8628.

  1. Richiedi un codice dispositivo

    POST /membership/oauth/device/authorize
    Content-Type: application/json

    { "client_id": "...", "scope": "content:read" }

    Restituisce il codice rivolto all'utente e l'intervallo di polling:

    { "device_code": "...", "user_code": "WXYZ-1234",
    "verification_uri": "https://app.b1.church/device",
    "expires_in": 900, "interval": 5 }
  2. Visualizza user_code + verification_uri all'utente.

  3. Poll /membership/oauth/token con grant_type=urn:ietf:params:oauth:grant-type:device_code e il device_code. Risposte standard:

    ErroreSignificato
    authorization_pendingL'utente non ha ancora approvato — continua a fare polling all'intervallo suggerito
    expired_tokenIl codice dispositivo è passato expires_in — ricomincia
    access_deniedL'utente ha rifiutato la richiesta
    (nessuno — 200 OK)Approvato — il corpo è un B1TokenResponse
  4. Una volta approvato, archivia il refresh_token e utilizza l'access_token fino alla scadenza.

L'SDK B1 include B1OAuthClient.awaitDeviceToken(...) che esegue il ciclo di polling per te con backoff conforme alla RFC.

Token di aggiornamento

Sempre disponibile come richiesta autonoma una volta che possiedi un refresh_token:

POST /membership/oauth/token
{ "grant_type": "refresh_token", "refresh_token": "...", "client_id": "..." }

Ritornano un nuovo access_token e refresh_token. I client pubblici (nessun client_secret) possono omettere client_secret sull'aggiornamento — utile per app OAuth mobile/desktop che non possono mantenere un segreto.

Forma del token

Un token di accesso è un JWT emesso da B1 identico a quello che un utente otterrebbe da POST /membership/users/login — stesso reclamo di permesso modulare, stesso comportamento di checkAccess in ogni controller — ad eccezione dell'array di permessi è stato filtrato attraverso gli ambiti concessi al momento della coniazione. Un token di accesso con scopo non può fare nulla che un token API con scopo simile non potrebbe, e non c'è un "percorso OAuth" separato in alcun controller; actionWrapper non è consapevole se il portatore è una persona, una chiave API o un client OAuth.

App connesse (rivolte all'utente)

Dal punto di vista di un amministratore della chiesa, "App connesse" è l'elenco delle app a cui è stato concesso l'accesso alla loro chiesa. Ogni riga è una coppia live (OAuthClient, OAuthToken).

In B1Admin: Impostazioni → Sviluppatore → App connesse mostra:

  • Il nome del client
  • Gli ambiti che l'admin ha approvato
  • La data in cui l'accesso è stato concesso
  • Un pulsante Revoca
Metodo e percorsoAuthScopo
GET /membership/oauth/connectionsJWTElencare le proprie connessioni attive (unite al nome del client + ambiti)
DELETE /membership/oauth/connections/:idJWTRevocare una connessione con il suo id di token OAuth — il token smette di funzionare alla richiesta successiva

L'elenco esclude automaticamente i token scaduti.

Ambiti e consenso

Le stringhe di ambito sono lo stesso catalogo delle chiavi API. Pratiche consigliate per i client:

  • Richiedi gli ambiti più ristretti che funzionano. Le chiese notano se chiedi donations:write quando hai bisogno solo di leggere le persone.
  • Utilizza un token di aggiornamento più token di accesso a breve durata. I token di accesso a lunga durata sono più difficili da revocare rapidamente.
  • Presenta sempre gli ambiti concessi all'utente nella tua interfaccia utente affinché possano verificare a cosa hanno acconsentito.

Gestione del client OAuth

I client OAuth (le app di terze parti stesse) sono attualmente registrati globalmente da un amministratore del server B1. L'auto-registrazione per chiesa è sulla roadmap — fino ad allora, per spedire un connettore pubblico contatta il team ChurchApps per coniare una coppia client_id / client_secret e registrare i tuoi URI di reindirizzamento.

Metodo e percorsoPermessoDescrizione
GET /membership/oauth/clientsServer.AdminElencare tutti i client OAuth
GET /membership/oauth/clients/clientId/:clientIdOttenere un client con il suo id pubblico (segreto redatto)
POST /membership/oauth/clientsServer.AdminCreare o aggiornare un client
DELETE /membership/oauth/clients/:idServer.AdminEliminare un client

Supporto SDK

Il pacchetto @churchapps/integration-sdk avvolge ogni flusso OAuth con helper tipizzati — B1OAuthClient.exchangeCode(), .refresh(), .startDeviceFlow(), .pollDeviceToken(), .awaitDeviceToken(). Vedi il README del pacchetto e Webhook per un esempio end-to-end.