Oversigt
De fleste brugere giver op ved registreringsformularen: et brugernavn, en adgangskode, de skal huske, en e-mailkode, der ryger i spam. Med KlugAuth trykker de på Fortsæt med Apple eller Fortsæt med Google og er færdige.
KlugAuth viser hver platforms native login: Apples dialog med Face ID / Touch ID på iOS og macOS, Androids kontodialog (Credential Manager) til Google og systemets login-vindue til Google på iOS og macOS. Den returnerer udbyderens identitetstoken sammen med din nonce, klar til verificering på din server, plus Apples autorisationskode, som du skal bruge for at tilbagekalde forbindelsen, når en konto slettes (App Store-retningslinje 5.1.1(v)).
Ingen Google SDK er medleveret: Google-login på iOS og macOS bruger det standardiserede OAuth-flow med PKCE i systemets browserdialog, så udvidelsen forbliver lille.
KlugAuth kører i den aktuelle udgave af vores apps, vores proof of concept, til registrering, login og bekræftelse af en enheds logout med Apple eller Google.
Funktioner
- Selvstændig: én ANE, intet kernebibliotek eller afhængige ANE'er at tilføje
- Log ind med Apple på iOS 13+, macOS 10.15+ og iPad-apps på Mac'er med Apple silicon
- Log ind med Google på Android (Credential Manager) og på iOS / macOS (systemets login-vindue, ingen Google SDK)
- Identitetstoken, bruger-ID, e-mail og navn; Apples autorisationskode til fornyelse og tilbagekaldelse
- Nonce-hjælper til replay-beskyttelse (Apple bærer dens SHA-256, Google den rå værdi)
- Kontrol af Apples credential-tilstand (authorized / revoked) for tilbagevendende brugere
- Separate hændelser for succes, annullering og fejl; annullering rapporteres, aldrig som fejl
Understøttede platforme
Log ind med Apple på Android er muligt med Apples webflow og en lille serverside; det kan vi levere som en del af et projekt. isSupported (Apple) og isGoogleSupported fortæller din kode, hvad enheden tilbyder.
Kom i gang
Tilføj udvidelsen til din applikationsdescriptor:
<extensions>
<extensionID>com.klug.auth.KlugAuth</extensionID>
</extensions>
Til Log ind med Apple skal du tilføje entitlementet (iOS: Entitlements i descriptoren; macOS: ved signering):
<key>com.apple.developer.applesignin</key> <array><string>Default</string></array>
Til Google skal du oprette OAuth-klienter i Google Cloud-konsollen: en webklient (dens ID er token-audience på Android), en Android-klient med dit pakkenavn og SHA-1, og en iOS-klient til iOS og macOS.
Kodeeksempler
Fem komplette flows, fra knapperne til din server. Hvert kald vender straks tilbage; resultater ankommer som KlugAuthEvents. Fuld 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-oversigt
| KlugAuth.getInstance() | Returnerer den enkelte instans. |
| isSupported | Sand, hvor Log ind med Apple er tilgængeligt (iOS, macOS). |
| isGoogleSupported | Sand, hvor Log ind med Google er tilgængeligt (Android, iOS, macOS). |
| generateNonce() | Statisk. En ny tilfældig nonce (32 bytes som hex); brug den én gang, og send den samme værdi til din server. |
| signInWithApple(nonce) | Åbner Apples login-dialog. Returnerer false, hvis den ikke kunne starte (ikke understøttet, eller et login kører allerede). |
| signInWithGoogle(clientId, nonce) | Åbner Google-login. Android: web-klient-ID'et; iOS / macOS: iOS-klient-ID'et. Returnerer false, hvis den ikke kunne starte. |
| getCredentialState(userID) | Spørger Apple, om brugeren stadig er autoriseret; svaret ankommer som APPLE_CREDENTIAL_STATE. iOS og macOS. |
| KlugAuthEvent | identityToken, authorizationCode, userID, email, givenName, familyName, fullName, state, errorCode, errorMessage. |
Events
| APPLE_SUCCESS | identityToken, authorizationCode, userID; email og navne kun ved den første autorisation. |
| APPLE_CANCELED | Brugeren lukkede dialogen. |
| APPLE_ERROR | errorCode og errorMessage fra systemet. |
| APPLE_CREDENTIAL_STATE | userID og state: authorized · revoked · notFound · transferred · unknown |
| GOOGLE_SUCCESS | identityToken, userID (kontoens e-mail), email, givenName, familyName. |
| GOOGLE_CANCELED | Brugeren lukkede dialogen. |
| GOOGLE_ERROR | errorCode og errorMessage; på Android NO_ACCOUNT, når enheden ikke har nogen Google-konto. |
Køb KlugAuth
En årlig licens til én AIR-applikation, med alle opdateringer i 12 måneder. Efter betaling modtager du udvidelsen, ActionScript-biblioteket og dokumentationen pr. e-mail, normalt inden for én hverdag. Licens og vilkår
- Licens til én AIR-applikation
- Alle opdateringer i 12 måneder
- Svar pr. e-mail inden for 7 dage
- Licens til én AIR-applikation
- Alle opdateringer i 12 måneder
- Svar pr. e-mail inden for 48 timer
Krav
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 13 eller nyere |
| Android | Android 6 eller nyere, Google Play-tjenester |
| macOS | macOS 10.15 eller nyere |
| Apple | Capability'en Log ind med Apple på dit App ID |
| OAuth-klienter i Google Cloud-konsollen |