Salta al contenuto principale

Come accedere con Okta usando Capacitor

Collega Okta a un'app Capacitor 8 con OIDC e PKCE: crea l'integrazione dell'app nativa, configura gli URI di redirect, i refresh token, il logout e risolvi gli errori di Okta.

Pagina di accesso Okta aperta da un'app mobile Capacitor con PKCE

Per accedere con Okta in un'app Capacitor, crea un Applicazione nativa OIDC nella Okta Admin Console, registra un URI di reindirizzamento per l'accesso come com.example.app://oauth/okta, ed esegui il flusso di autorizzazione code con PKCE in un browser di sistema. Con @capgo/capacitor-social-login configuri Okta una sola volta con il tuo issuer e client ID, poi chiama SocialLogin.login({ provider: 'oauth2', options: { providerId: 'okta' } }).

Questa guida copre l'integrazione dell'app Okta, le policy dell'authorization server, il plugin code per iOS, Android e web, il token refresh, il profilo utente, il logout e gli errori Okta più comuni. Si basa su Capacitor 8, versione ottobre 2026.

Cosa ti serve

  • Un'organizzazione Okta (Workforce Identity o Customer Identity) con accesso admin per creare integrazioni app.
  • Un'app Capacitor 8.
  • Il tuo Capacitor appId, che riutilizzerai come schema di redirect.
  • Opzionalmente, un backend API che valida i token di accesso Okta.

Come funziona il login Okta in un'app Capacitor

La tua app non mostra mai un form per la password. Apre la pagina di sign-in di Okta in un browser sicuro, Okta gestisce MFA e policy, poi reindirizza alla tua app con un code. L'app scambia il code più il PKCE verifier per ottenere i token.

Piattaforma Browser Cosa si configura
iOS ASWebAuthenticationSession Niente Info.plist
Android Chrome Custom Tabs con androidUseCustomTabs: true (WebView di default) Intent filter per lo schema di redirect
Web Popup o redirect Trusted Origin per CORS

Preferisci Custom Tabs su Android. Okta Verify, FastPass e passkeys funzionano meglio nel browser di sistema rispetto a un WebView incorporato, e i cookie SSO vengono condivisi con Chrome.

Passo 1: Crea l'integrazione app Okta

  1. Nella console di amministrazione di Okta, vai a Applicazioni > Applicazioni > Crea integrazione app.
  2. Usa OIDC - OpenID Connect e Applicazione nativa.
  3. Dalle un nome, poi sotto Grant type mantieni Autorizzazione Code e seleziona Refresh Token se gli utenti devono restare autenticati.
  4. URI di redirect per il sign-in: com.example.app://oauth/okta. Aggiungi https://app.example.com/auth/callback se pubblichi una build web.
  5. URI di redirect per il sign-out: com.example.app://oauth/logout (e l'URL web, se necessario).
  6. Assegnazioni: scegli chi può usare l'app. Gli utenti non assegnati riceveranno un errore al login.
  7. Salva, quindi copia il ID Client. Sotto Credenziali del client, l'autenticazione del client deve essere Nessuna e Richiedi PKCE deve essere attivo.

Okta richiede URI di redirect nativi con uno scheme di uso privato in formato reverse-domain. Il tuo bundle ID o application ID è adatto.

Controlla l'autorizzazione server

Vai su Sicurezza > API > Server di autorizzazione. La maggior parte delle configurazioni utilizza il default server di autorizzazione personalizzato, issuer https://your-org.okta.com/oauth2/default.

Issuer Usa quando
https://your-org.okta.com/oauth2/default (personalizzato) Il tuo API valida i token di accesso, hai bisogno di scope o claim personalizzati
https://your-org.okta.com (org) Ti servono solo ID token o chiami le API di Okta

Apri la scheda Policy di accesso del server. Deve esserci una policy assegnata alla tua app (o a tutti i client) con una regola che consenta il grant Authorization Code e il Refresh Token se lo usi. Una regola mancante genera l'errore “Policy evaluation failed for this request”.

Origini attendibili per il web

Se esegui lo stesso code sul web, aggiungi la tua origine web sotto Sicurezza > API > Origini attendibili con CORS spuntato. Senza di esso, il browser blocca la richiesta del token.

Passo 2: Installa il plugin

bun add @capgo/capacitor-social-login
bunx cap sync

Se Okta è l'unico provider, disattiva gli SDK social inclusi in capacitor.config.ts:

plugins: {
  SocialLogin: {
    providers: { google: false, facebook: false, apple: false, twitter: false },
  },
},

Passo 3: Aggiungi l'intent filter di redirect per Android

In android/app/src/main/AndroidManifest.xml, all'interno dell' MainActivity activity:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="com.example.app" android:host="oauth" />
</intent-filter>

MainActivity deve rimanere android:launchMode="singleTask", che è il default di Capacitor, così il redirect arriva nell'activity in esecuzione.

Passo 4: Inizializza Okta

import { Capacitor } from '@capacitor/core';
import { SocialLogin } from '@capgo/capacitor-social-login';

const OKTA_ISSUER = 'https://your-org.okta.com/oauth2/default';
const isWeb = Capacitor.getPlatform() === 'web';

export async function initAuth() {
  await SocialLogin.initialize({
    oauth2: {
      okta: {
        appId: 'YOUR_OKTA_CLIENT_ID',
        authorizationBaseUrl: `${OKTA_ISSUER}/v1/authorize`,
        accessTokenEndpoint: `${OKTA_ISSUER}/v1/token`,
        resourceUrl: `${OKTA_ISSUER}/v1/userinfo`,
        redirectUrl: isWeb
          ? 'https://app.example.com/auth/callback'
          : 'com.example.app://oauth/okta',
        scope: 'openid profile email offline_access',
        pkceEnabled: true,
        logoutUrl: `${OKTA_ISSUER}/v1/logout`,
        postLogoutRedirectUrl: isWeb
          ? 'https://app.example.com/'
          : 'com.example.app://oauth/logout',
        androidUseCustomTabs: true,
      },
    },
  });
}

Alternativa più breve: imposta issuerUrl: OKTA_ISSUER e rimuovi gli URL degli endpoint. Il plugin carica /.well-known/openid-configuration e li compila. I team che migrano da Ionic Auth Connect possono usare SocialLoginAuthConnect con il okta preset (issuer, clientId, redirectUrl), descritto nella guida alla migrazione.

Passo 5: Accedi e leggi il profilo

import { SocialLogin } from '@capgo/capacitor-social-login';

export async function signInWithOkta() {
  try {
    const { result } = await SocialLogin.login({
      provider: 'oauth2',
      options: { providerId: 'okta' },
    });

    const profile = result.resourceData as {
      sub: string;
      email?: string;
      name?: string;
      preferred_username?: string;
    } | null;

    return {
      accessToken: result.accessToken?.token,
      idToken: result.idToken,
      refreshToken: result.refreshToken,
      scopes: result.scope,
      profile,
    };
  } catch (error: any) {
    if (error?.code === 'USER_CANCELLED') return null;
    throw error;
  }
}

resourceData contiene il JSON restituito da /userinfo endpoint, così ottieni il profilo senza un'altra richiesta. Per leggere i claim del token ID per la visualizzazione, usa SocialLogin.decodeIdToken({ idToken }). Questa chiamata non verifica la firma.

Opzioni di login da conoscere:

  • loginHint compila automaticamente il nome utente.
  • prompt: 'login' forza la ri-autenticazione anche con una sessione Okta attiva.
  • additionalParameters: { idp: '0oa...' } instrada direttamente a un identity provider specifico configurato in Okta.

Sul web con flow: 'redirect', chiama SocialLogin.handleRedirectCallback() sulla pagina di callback per completare lo scambio.

Passo 6: Valida i token Okta sul tuo API

import { createRemoteJWKSet, jwtVerify } from 'jose';

const ISSUER = 'https://your-org.okta.com/oauth2/default';
const jwks = createRemoteJWKSet(new URL(`${ISSUER}/v1/keys`));

export async function verifyOktaAccessToken(token: string) {
  const { payload } = await jwtVerify(token, jwks, {
    issuer: ISSUER,
    audience: 'api://default', // the Audience value of your authorization server
  });
  return payload; // payload.uid is the Okta user ID, payload.sub the login
}

Trova l'audience nella scheda dell'authorization server Impostazioni tab. Non validare i token di accesso del server di autorizzazione dell'organizzazione nel tuo API. Okta non supporta questa operazione.

Passaggio 7: Refresh token

import { SocialLogin } from '@capgo/capacitor-social-login';

export async function ensureFreshOktaToken() {
  const { isLoggedIn } = await SocialLogin.isLoggedIn({ provider: 'oauth2', providerId: 'okta' });
  if (!isLoggedIn) {
    await SocialLogin.refresh({ provider: 'oauth2', options: { providerId: 'okta' } });
  }
  const { accessToken } = await SocialLogin.getAuthorizationCode({ provider: 'oauth2', providerId: 'okta' });
  return accessToken;
}

Se il refresh token è scaduto o revocato, refresh rifiuta. Gestisci l'errore e rimanda l'utente alla signInWithOkta().

Consulta la Refresh Token sezione dell'integrazione dell'app. Con Ruota il token dopo ogni utilizzo, ogni refresh restituisce un nuovo refresh token e il precedente smette di funzionare dopo un breve periodo di grazia. Il plugin sostituisce automaticamente la copia salvata. Se gestisci tu il refresh token (ad esempio nel Keychain tramite @capgo/capacitor-native-biometric setData), usa SocialLogin.refreshToken({ provider: 'oauth2', providerId: 'okta', refreshToken }) e salva il valore restituito.

Passo 8: Esci

await SocialLogin.logout({ provider: 'oauth2', providerId: 'okta' });

Il plugin cancella i token memorizzati, poi apre /v1/logout con id_token_hint e post_logout_redirect_uri. Okta termina la sessione e reindirizza al tuo URI di logout, che deve essere elencato nell'integrazione dell'app. Su mobile, la pagina di logout si apre nel browser di sistema.

Per revocare anche il refresh token lato server, chiama l'endpoint /v1/revoke di Okta dal tuo backend o dall'app prima di fare logout. Consulta la nostra guida alla revoca dei token per il pattern.

Risoluzione problemi

Errore Causa Soluzione
invalid_request: The 'redirect_uri' parameter must be a Login redirect URI in the client app settings Redirect non registrato Aggiungi l'URI esatto ai Sign-in redirect URIs
User is not assigned to the client application Assegnazione mancante Assegna l'utente o il gruppo sotto Assignments
Policy evaluation failed for this request Nessuna regola di access policy per questo client o grant Aggiungi una policy e una regola sull'authorization server
invalid_client all'endpoint del token L'app è di tipo Web o SPA, o il metodo di autenticazione non è None Usa un'app Native con client authentication None
Nessun refresh token Grant Refresh Token disattivato, offline_access mancante, o la regola lo blocca Abilita il grant, aggiungi lo scope, consentilo nella regola
API rifiuta il token con issuer non valido Il token proviene dal server dell'organizzazione Usa l'issuer del server di autorizzazione personalizzato
Web: errore CORS su /v1/token Origin non fidata Aggiungi un'Origin fidata con CORS
Android resta nel browser dopo il login Intent filter non corrispondente Fai corrispondere scheme e host a redirectUrl

Attiva logsEnabled: true nella config del provider durante il debug per vedere l'URL di autorizzazione e le risposte del token nei log nativi.

Rollout delle modifiche a Okta

I clienti enterprise spesso modificano policy o claim dopo il lancio. Le modifiche lato client come scope, gestione dei claim o schermate di errore possono essere pubblicate con Live updates di Capgo invece di una revisione completa dello store. Le parti native (intent filter, nuovo scheme) richiedono comunque una nuova build.

Live updates per le app Capacitor

Quando un bug nel web-layer è live, rilascia la fix tramite Capgo invece di aspettare giorni l'approvazione degli store. Gli utenti ricevono l'update in background, mentre le modifiche native restano nel normale processo di review.

Ultimi articoli dal blog

Capgo ti offre gli insight migliori che ti servono per creare un'app mobile davvero professionale.