Hub per gli strumenti
Punto di accesso per chi vuole integrare Login with myZenkai: meno attrito tra documentazione, test e configurazione dei client.
Guida introduttiva al Developer Portal di Zenkaiverse: cos’è, cosa puoi usare oggi e come si inserisce Login with myZenkai nel tuo percorso di integrazione.
Un’unica area da cui partire per integrare e testare l’accesso con myZenkai, senza rincorrere URL sparsi o checklist solo mentali.
Punto di accesso per chi vuole integrare Login with myZenkai: meno attrito tra documentazione, test e configurazione dei client.
L’obiettivo è spiegare con calma cosa succede quando un’app usa myZenkai per identificare un utente, senza diluvi di jargon.
Tre blocchi funzionali che puoi usare subito nel portal in ambiente alpha.
Flusso di login reale: l’utente entra con il proprio account e il portal lo riconosce come autenticato.
Mantieni in un registry unico sia i bot self-hosted sia i client OAuth, con onboarding e policy distinti.
Playground PKCE per authorize URL, code verifier, code challenge e verifica rapida del percorso OAuth.
Sezione tecnica dedicata allo strumento avanzato del portal per costruire, avviare e verificare il flow OAuth 2.0 con PKCE.
code_verifier e code_challenge S256.curl per il token exchange manuale.Inserisci authorize endpoint, token endpoint, client ID, redirect URI e scope.
Il pulsante genera un nuovo code verifier casuale e il corrispondente code challenge con metodo S256.
Con Costruisci URL ottieni l'authorize URL finale. Con Apri flow avvii il login e torni sulla callback del portal.
response_type=code, state e campi PKCE valorizzati.code e state coerenti con il contesto salvato nel browser.curl riflette gli stessi parametri mostrati nella UI.redirect URI non coincide con quelle autorizzate.code_verifier, endpoint o client ID non coincidono.curl per un debug piu isolato.Il portal deve supportare sia bot sia client, ma senza confondere runtime, security model e responsabilita operative.
Il percorso piu pragmatico e un modello ibrido: ora bot developer-hosted, poi eventualmente hosting gestito come livello premium o facilitato. In questo modo differenzi bene bot e client fin dal registry senza prendere subito il carico operativo del code execution hosting.
Per partire in stile Discord (developer-hosted) il bot deve avere un contratto minimo stabile: token lifecycle, policy, sicurezza API e audit.
Quattro passaggi che collegano richiesta dell’app, login utente, codice temporaneo e scambio con token.
Un’app o uno strumento esterno avvia il flow e chiede il permesso di identificare l’utente.
L’utente entra con il proprio account myZenkai. Con client configurato correttamente, il percorso resta coerente.
Dopo il login l’app riceve un codice temporaneo: da solo non basta per accedere ai dati protetti.
L’app scambia il codice (con PKCE dove richiesto) e ottiene il token per completare il login in modo sicuro.
Sezione pensata per partire subito: installazione SDK, login, callback e chiamate API con bearer token.
npm install @myzenkai/sdk
import { createMyZenkaiSdk } from "@myzenkai/sdk";
const sdk = createMyZenkaiSdk({
clientId: "your_client_id",
authorizeEndpoint: "https://europe-west1-myzenkai-c58ee.cloudfunctions.net/oauthAuthorize",
tokenEndpoint: "https://europe-west1-myzenkai-c58ee.cloudfunctions.net/oauthToken",
redirectUri: "https://your-app.example.com/callback",
scope: ["openid", "profile:read", "email:read"]
});
document.getElementById("loginBtn")?.addEventListener("click", async () => {
await sdk.startLogin();
});
Lo SDK genera in automatico state, code_verifier e code_challenge (PKCE), poi apre il flow.
const result = await sdk.handleCallback();
if (!result.ok) {
console.error(result.error, result.errorDescription);
} else {
console.log("Auth ok", result.session);
window.location.href = "/#dashboard";
}
La callback e obbligatoria nel flow OAuth: qui avviene il token exchange finale.
const session = sdk.getSession();
if (!session) throw new Error("Utente non autenticato");
const res = await fetch(
"https://europe-west1-myzenkai-c58ee.cloudfunctions.net/oauthClientsApi/api/clients",
{
headers: {
Authorization: `Bearer ${session.tokenResponse.access_token}`,
Accept: "application/json"
}
}
);
const data = await res.json();
console.log(data);
state in callback (gia gestito dallo SDK).expires_in.client_id, redirect_uri, response_type, scope, state, code_challenge, code_challenge_method) non vengono sovrascritti da parametri extra.expires_in valido, lo SDK applica un fallback di sicurezza a 3600 secondi.openid: identificatore utente (uid / subject) necessario per associare la sessione all'utente autenticato.profile:read: nickname e profilePhoto.email:read: email.Raccomandazione: richiedi solo gli scope strettamente necessari e mostra sempre all'utente finale perche ogni permesso e richiesto.
Chiavi errore attualmente restituite dal flow OAuth (SDK + endpoint backend), con tipo, motivo di ritorno e azione consigliata.
error (chiave stabile) e error_description (dettaglio runtime).sdk.handleCallback(): result.error + result.errorDescription.sdk.handleCallback())invalid_callback · client-side validation · manca code o state nella callback URL · verifica redirect corretto e non aprire la callback manualmente.missing_pending_auth · client-side state · contesto PKCE/state non presente in storage · rilancia startLogin() nello stesso browser/tab.state_mismatch · client-side security · state ritornato non coincide con quello salvato · evita tab multiple e verifica che non ci siano redirect intermedi che alterano la query.token_exchange_failed · server/token exchange · endpoint token ha risposto con errore HTTP o body applicativo in errore · leggi errorDescription e correggi client_id/redirect_uri/code_verifier/code.invalid_token_response · server contract · risposta token senza access_token o token_type · verifica implementazione endpoint OAuth token.network_error · network/CORS · fetch token fallita (CORS, DNS, TLS, offline) · controlla CORS origin, URL endpoint e rete.[provider_error_passthrough] · provider redirect error · errore ricevuto direttamente da query callback (error + error_description) · usa la chiave provider ricevuta (es. invalid_request, access_denied) come root cause.GET /oauthAuthorize)access_denied · oauth redirect error · il backend ha rifiutato la richiesta per policy/permessi (permission-denied) · controlla redirect URI autorizzata, origin consentita, scope consentiti, client abilitato, grants abilitati.invalid_request · oauth redirect error · parametri mancanti/non validi o client non trovato (invalid-argument/not-found) · controlla client_id, redirect_uri, scope, response_type=code, PKCE (code_challenge).invalid_request (JSON 400 fallback) · http error body · impossibile fare redirect verso callback valida · correggi callback URL e ripeti il flow.POST /oauthToken)unsupported_grant_type · oauth token error · grant_type diverso da authorization_code · invia sempre authorization_code.invalid_request · oauth token error · payload incompleto/non valido (es. campi mancanti) · invia client_id, code, redirect_uri, code_verifier.invalid_grant · oauth token error · code non valido/scaduto/consumato, PKCE fallita, redirect mismatch, client mismatch · rigenera il flow completo e verifica coerenza tra authorize e token request.server_error · oauth token error · errore interno inatteso · ritenta e consulta i log backend con dettaglio error_description./oauthApplicationsApi, /oauthClientsApi)unauthenticated · api auth error · bearer mancante/non valido/scaduto · invia Authorization: Bearer <access_token> valido.permission_denied · api authorization error · token valido ma utente senza permessi sulla risorsa · usa client/application dell’owner corretto.not_found · api resource error · route o risorsa inesistente · verifica path e identificatore risorsa.invalid_request · api validation error · payload non conforme (es. appId/clientId/redirectUris/scope/origins) · correggi campi richiesti e formato.server_error · api internal error · eccezione non mappata · ritenta e consulta logs funzione.Cosa è già in pista e cosa non è ancora il focus del prodotto.
Definizioni brevi per orientarti nella UI e nelle guide.
Profilo tecnico di un’app che usa myZenkai per il login: nome, identificatore e indirizzi autorizzati.
Indirizzo a cui il browser torna dopo il login. Deve essere autorizzato in anticipo o il flow viene bloccato.
Tipo di accesso richiesto (es. identità di base, profilo pubblico, email).
Protezione aggiuntiva per app pubbliche, CLI e client senza segreto server-side.
Base pronta per guide operative: creare un client, configurare le redirect URI, capire gli scope e completare il code exchange con esempi mirati.