Überblick
Die meisten Nutzer geben am Registrierungsformular auf: ein Benutzername, ein Passwort, das man sich merken muss, ein E-Mail-Code, der im Spam landet. Mit KlugAuth tippen sie auf Weiter mit Apple oder Weiter mit Google und sind fertig.
KlugAuth zeigt die native Anmeldung der jeweiligen Plattform: das Apple-Sheet mit Face ID / Touch ID unter iOS und macOS, das Android-Kontofenster (Credential Manager) für Google und das System-Anmeldefenster für Google unter iOS und macOS. Es liefert das Identity-Token des Anbieters zusammen mit Ihrer Nonce, bereit zur Prüfung auf Ihrem Server, dazu den Apple-Autorisierungscode, den Sie brauchen, um die Verknüpfung beim Löschen eines Kontos zu widerrufen (App-Store-Richtlinie 5.1.1(v)).
Es ist kein Google-SDK enthalten: Die Google-Anmeldung unter iOS und macOS nutzt den Standard-OAuth-Ablauf mit PKCE im System-Browser-Sheet, sodass die Erweiterung klein bleibt.
KlugAuth läuft im aktuellen Release unserer Apps, unseres Praxisbeweises, für Registrierung, Anmeldung und die Bestätigung einer Geräte-Abmeldung mit Apple oder Google.
Funktionen
- Eigenständig: eine ANE, keine Kernbibliothek und keine abhängigen ANEs, die Sie ergänzen müssten
- Anmeldung mit Apple unter iOS 13+, macOS 10.15+ und für iPad-Apps auf Macs mit Apple Silicon
- Anmeldung mit Google unter Android (Credential Manager) und unter iOS / macOS (System-Anmeldefenster, kein Google-SDK)
- Identity-Token, Benutzer-ID, E-Mail und Name; Apple-Autorisierungscode für Aktualisierung und Widerruf
- Nonce-Helfer für den Replay-Schutz (Apple überträgt dessen SHA-256, Google den Rohwert)
- Prüfung des Apple-Credential-Status (autorisiert / widerrufen) für wiederkehrende Nutzer
- Getrennte Ereignisse für Erfolg, Abbruch und Fehler; ein Abbruch wird gemeldet, nie als Fehler
Unterstützte Plattformen
Die Anmeldung mit Apple unter Android ist mit dem Web-Ablauf von Apple und einer kleinen Server-Seite möglich; wir können das im Rahmen eines Projekts bereitstellen. isSupported (Apple) und isGoogleSupported sagen Ihrem Code, was das Gerät bietet.
Erste Schritte
Fügen Sie die Erweiterung Ihrem Application Descriptor hinzu:
<extensions>
<extensionID>com.klug.auth.KlugAuth</extensionID>
</extensions>
Für die Anmeldung mit Apple fügen Sie das Entitlement hinzu (iOS: Entitlements im Descriptor; macOS: beim Signieren):
<key>com.apple.developer.applesignin</key> <array><string>Default</string></array>
Für Google legen Sie OAuth-Clients in der Google Cloud Console an: einen Web-Client (seine ID ist die Token-Audience unter Android), einen Android-Client mit Ihrem Paketnamen und SHA-1 und einen iOS-Client für iOS und macOS.
Codebeispiele
Fünf vollständige Abläufe, von den Schaltflächen bis zu Ihrem Server. Jeder Aufruf kehrt sofort zurück; Ergebnisse kommen als KlugAuthEvents an. Vollständige Dokumentation →
import com.klug.auth.KlugAuth; import com.klug.auth.KlugAuthEvent; var auth:KlugAuth = KlugAuth.getInstance(); var nonce:String = ""; // a fresh one for every attempt appleButton.visible = auth.isSupported; // iOS 13+, macOS 10.15+, iPad apps on the Mac googleButton.visible = auth.isGoogleSupported; // Android, iOS 13+, macOS 10.15+ auth.addEventListener( KlugAuthEvent.APPLE_SUCCESS, onAppleSuccess ); auth.addEventListener( KlugAuthEvent.APPLE_CANCELED, onCanceled ); auth.addEventListener( KlugAuthEvent.APPLE_ERROR, onError ); auth.addEventListener( KlugAuthEvent.GOOGLE_SUCCESS, onGoogleSuccess ); auth.addEventListener( KlugAuthEvent.GOOGLE_CANCELED, onCanceled ); auth.addEventListener( KlugAuthEvent.GOOGLE_ERROR, onError );
function signInWithApple():void { nonce = KlugAuth.generateNonce(); // 32 random bytes as hex, used once if ( !auth.signInWithApple( nonce ) ) // false: not supported, or a sheet is already open showMessage( "Sign in with Apple is not available." ); // your app function } function onAppleSuccess( e:KlugAuthEvent ):void { // the token carries SHA-256 of the nonce: the server hashes the raw value and compares sendToServer( "apple", e.identityToken, nonce, e.fullName, e.authorizationCode ); saveAppleUserID( e.userID ); // stable for this Apple ID; your app function // e.email and the names arrive only on the FIRST authorization; // the e-mail is always inside the identity token } // your app function: the server verifies the token and signs the user in function sendToServer( provider:String, idToken:String, rawNonce:String, name:String, appleCode:String = "" ):void { var vars:URLVariables = new URLVariables(); vars.provider = provider; vars.id_token = idToken; vars.nonce = rawNonce; vars.name = name; if ( appleCode != "" ) vars.code = appleCode; // lets the server revoke the link later var req:URLRequest = new URLRequest( "https://your.server/auth" ); req.method = URLRequestMethod.POST; req.data = vars; var loader:URLLoader = new URLLoader(); loader.addEventListener( Event.COMPLETE, onServerAnswer ); // your app function loader.load( req ); }
import flash.system.Capabilities; // Android: the WEB client ID, which is the token audience on your server. // iOS and macOS: the iOS client ID, used in the system sign-in window. var googleClientId:String = Capabilities.manufacturer.indexOf( "Android" ) >= 0 ? "YOUR_WEB_CLIENT_ID.apps.googleusercontent.com" : "YOUR_IOS_CLIENT_ID.apps.googleusercontent.com"; function signInWithGoogle():void { nonce = KlugAuth.generateNonce(); // Google puts the raw value into the token if ( !auth.signInWithGoogle( googleClientId, nonce ) ) // false: no client ID, or already open showMessage( "Google sign-in could not start." ); } function onGoogleSuccess( e:KlugAuthEvent ):void { // e.userID is the account e-mail; names arrive every time sendToServer( "google", e.identityToken, nonce, e.fullName ); }
function onCanceled( e:KlugAuthEvent ):void { // the user closed the sheet: not an error, simply stay on the start screen } function onError( e:KlugAuthEvent ):void { if ( e.type == KlugAuthEvent.GOOGLE_ERROR && e.errorCode == "NO_ACCOUNT" ) showMessage( "Please add a Google account to this device first." ); // Android else showMessage( "Sign-in failed: " + e.errorMessage ); // e.errorCode for your log }
auth.addEventListener( KlugAuthEvent.APPLE_CREDENTIAL_STATE, function( e:KlugAuthEvent ):void { // e.state: authorized | revoked | notFound | transferred | unknown if ( e.state == "revoked" || e.state == "notFound" ) signOut(); // your app function: the user removed the app from their Apple ID }); var savedID:String = loadAppleUserID(); // stored after APPLE_SUCCESS; your app function if ( auth.isSupported && savedID != "" ) auth.getCredentialState( savedID ); // Apple only: iOS and macOS
API-Übersicht
| KlugAuth.getInstance() | Gibt die einzige Instanz zurück. |
| isSupported | True, wo die Anmeldung mit Apple verfügbar ist (iOS, macOS). |
| isGoogleSupported | True, wo die Anmeldung mit Google verfügbar ist (Android, iOS, macOS). |
| generateNonce() | Statisch. Eine frische zufällige Nonce (32 Bytes als Hex); verwenden Sie sie einmal und senden Sie denselben Wert an Ihren Server. |
| signInWithApple(nonce) | Öffnet das Anmelde-Sheet von Apple. Gibt false zurück, wenn es nicht gestartet werden konnte (nicht unterstützt oder eine Anmeldung läuft bereits). |
| signInWithGoogle(clientId, nonce) | Öffnet die Google-Anmeldung. Android: die Web-Client-ID; iOS / macOS: die iOS-Client-ID. Gibt false zurück, wenn sie nicht gestartet werden konnte. |
| getCredentialState(userID) | Fragt Apple, ob der Nutzer weiterhin autorisiert ist; die Antwort kommt als APPLE_CREDENTIAL_STATE. iOS und macOS. |
| KlugAuthEvent | identityToken, authorizationCode, userID, email, givenName, familyName, fullName, state, errorCode, errorMessage. |
Ereignisse
| APPLE_SUCCESS | identityToken, authorizationCode, userID; email und Namen nur bei der ersten Autorisierung. |
| APPLE_CANCELED | Der Nutzer hat das Sheet geschlossen. |
| APPLE_ERROR | errorCode und errorMessage vom System. |
| APPLE_CREDENTIAL_STATE | userID und state: authorized · revoked · notFound · transferred · unknown |
| GOOGLE_SUCCESS | identityToken, userID (die E-Mail-Adresse des Kontos), email, givenName, familyName. |
| GOOGLE_CANCELED | Der Nutzer hat das Sheet geschlossen. |
| GOOGLE_ERROR | errorCode und errorMessage; unter Android NO_ACCOUNT, wenn das Gerät kein Google-Konto hat. |
KlugAuth kaufen
Eine Jahreslizenz für eine AIR-Anwendung, mit allen Updates für 12 Monate. Nach der Zahlung erhalten Sie die Erweiterung, die ActionScript-Bibliothek und die Dokumentation per E-Mail, in der Regel innerhalb eines Werktags. Lizenz und Bedingungen
- Lizenz für eine AIR-Anwendung
- Alle Updates für 12 Monate
- Kein Support
- Lizenz für eine AIR-Anwendung
- Alle Updates für 12 Monate
- Antwort per E-Mail innerhalb von 7 Tagen
- Lizenz für eine AIR-Anwendung
- Alle Updates für 12 Monate
- Antwort per E-Mail innerhalb von 48 Stunden
Voraussetzungen
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 13 oder neuer |
| Android | Android 6 oder neuer, Google Play Services |
| macOS | macOS 10.15 oder neuer |
| Apple | Capability „Sign in with Apple“ für Ihre App-ID |
| OAuth-Clients in der Google Cloud Console |