Flusso di Verifica Email con Deep Link
Questo documento spiega come funziona la verifica email in-app tramite deep link per iOS e Android.
Panoramicaβ
Quando un utente si registra, riceve un'email con un link di verifica. Invece di aprire una pagina web, il link apre direttamente l'app che verifica il token tramite API.
Formati dei Linkβ
Universal Links (HTTPS)β
https://app.vislagps.com/verify?token=abc123
Custom Scheme (Fallback)β
vislagps://verify?token=abc123
Implementazione iOSβ
File di Configurazioneβ
| File | Scopo |
|---|---|
Info.plist | Registra lo scheme custom vislagps:// |
VislaGPS.entitlements | Configura applinks:app.vislagps.com |
apple-app-site-association | Lato server: mappa /verify* all'app |
Flusso del Codiceβ
-
Ingresso Deep Link β
VislaGPSApp.swift.onOpenURL { url in
handleDeepLink(url)
} -
Estrazione Token β
handleDeepLink()if url.path.contains("verify") || url.host == "verify" {
let token = components.queryItems?.first(where: { $0.name == "token" })?.value
verifyEmailToken(token)
} -
Chiamata API β
ApiClient.verifyEmail()POST /api/auth/verify
Body: { "token": "abc123" } -
Risultato β Mostra alert di successo/errore
Implementazione Androidβ
File di Configurazioneβ
| File | Scopo |
|---|---|
AndroidManifest.xml | Intent filter per i deep link |
assetlinks.json | Lato server: verifica dell'app |
Intent Filtersβ
<!-- Universal Links -->
<intent-filter android:autoVerify="true">
<data android:scheme="https"
android:host="app.vislagps.com"
android:pathPrefix="/verify" />
</intent-filter>
<!-- Custom Scheme -->
<intent-filter>
<data android:scheme="vislagps"
android:host="verify" />
</intent-filter>
Flusso del Codiceβ
-
Ingresso Deep Link β
MainActivity.ktoverride fun onCreate() { handleDeepLink(intent) }
override fun onNewIntent(intent: Intent) { handleDeepLink(intent) } -
Estrazione Token β
handleDeepLink()if (uri.path?.contains("verify") == true || uri.host == "verify") {
val token = uri.getQueryParameter("token")
verifyEmailToken(token)
} -
Chiamata API β
ApiClient.verifyEmail()POST /api/auth/verify
Body: { "token": "abc123" } -
Risultato β Mostra AlertDialog
Configurazione Serverβ
apple-app-site-associationβ
Percorso: services/web-app/public/.well-known/apple-app-site-association
{
"applinks": {
"details": [{
"appID": "JBVMSR9P49.com.visla.vislagps",
"paths": ["/app/*", "/verify*"]
}]
}
}
assetlinks.jsonβ
Percorso: services/web-app/public/.well-known/assetlinks.json
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.visla.vislagps",
"sha256_cert_fingerprints": ["67:B2:F4:..."]
}
}]
API Backendβ
POST /api/auth/verifyβ
Richiesta:
{ "token": "token-di-verifica-dalla-email" }
Risposta (200):
{ "message": "Email verified successfully" }
Risposta (400):
{ "detail": "Invalid or expired token" }
Testβ
iOS Simulatorβ
xcrun simctl openurl booted "vislagps://verify?token=test123"
Android Emulatorβ
adb shell am start -a android.intent.action.VIEW -d "vislagps://verify?token=test123"
Universal Link (entrambe le piattaforme)β
# Richiede server configurato correttamente
https://app.vislagps.com/verify?token=test123
Social Login (Google, Apple, Facebook)β
Flusso OAuthβ
- Utente clicca bottone social nella schermata login
- App apre browser:
GET /api/auth/openid/auth?provider=google&ret=app - Backend redirect a provider (Google/Apple/Facebook)
- Utente autorizza
- Provider redirect a callback backend
- Backend genera token e redirect:
com.visla.vislagps://oauthredirect?access_token=xxx - App riceve deep link, salva token, login completato
Configurazione Backendβ
# Nel .env o docker-compose
OPENID_GOOGLE_ENABLED=true
OPENID_GOOGLE_CLIENT_ID=xxx.apps.googleusercontent.com
OPENID_APPLE_ENABLED=true
OPENID_APPLE_CLIENT_ID=com.visla.vislagps
OPENID_APPLE_TEAM_ID=JBVMSR9P49
OPENID_APPLE_KEY_ID=xxx
OPENID_FACEBOOK_ENABLED=true
OPENID_FACEBOOK_CLIENT_ID=xxx
Test Social Loginβ
# iOS Simulator
xcrun simctl openurl booted "com.visla.vislagps://oauthredirect?access_token=test123"
# Android Emulator
adb shell am start -a android.intent.action.VIEW -d "com.visla.vislagps://oauthredirect?access_token=test123"