Oversikt
De fleste brukere gir opp ved registreringsskjemaet: et brukernavn, et passord de må huske, en e-postkode som havner i søppelposten. Med KlugAuth trykker de på Fortsett med Apple eller Fortsett med Google og er ferdige.
KlugAuth viser den native innloggingen på hver plattform: Apples ark med Face ID / Touch ID på iOS og macOS, Android-kontoarket (Credential Manager) for Google, og systemets innloggingsvindu for Google på iOS og macOS. Den returnerer leverandørens identitetstoken sammen med din nonce, klart for verifisering på serveren din, pluss Apples autorisasjonskode som du trenger for å tilbakekalle koblingen når en konto slettes (App Store-retningslinje 5.1.1(v)).
Ingen Google SDK er medfølgende: Google-innlogging på iOS og macOS bruker standard OAuth-flyt med PKCE i systemets nettleserark, slik at utvidelsen forblir liten.
KlugAuth kjører i den nåværende utgivelsen av appene våre, vårt proof of concept, for registrering, innlogging og bekreftelse av utlogging av en enhet med Apple eller Google.
Funksjoner
- Selvstendig: én ANE, ingen kjernebibliotek eller avhengige ANE-er å legge til
- Logg inn med Apple på iOS 13+, macOS 10.15+ og iPad-apper på Mac-er med Apple silicon
- Logg inn med Google på Android (Credential Manager) og på iOS / macOS (systemets innloggingsvindu, ingen Google SDK)
- Identitetstoken, bruker-ID, e-post og navn; Apples autorisasjonskode for fornyelse og tilbakekalling
- Nonce-hjelper for beskyttelse mot replay (Apple bærer SHA-256 av den, Google den rå verdien)
- Sjekk av Apples credential-status (authorized / revoked) for returnerende brukere
- Egne hendelser for suksess, avbrudd og feil; avbrudd rapporteres, aldri som feil
Støttede plattformer
Logg inn med Apple på Android er mulig med Apples nettflyt og en liten serverside; vi kan levere det som en del av et prosjekt. isSupported (Apple) og isGoogleSupported forteller koden din hva enheten tilbyr.
Kom i gang
Legg utvidelsen til i applikasjonsbeskrivelsen din:
<extensions>
<extensionID>com.klug.auth.KlugAuth</extensionID>
</extensions>
For Logg inn med Apple legger du til entitlementet (iOS: Entitlements i descriptoren; macOS: ved signering):
<key>com.apple.developer.applesignin</key> <array><string>Default</string></array>
For Google oppretter du OAuth-klienter i Google Cloud-konsollen: en webklient (ID-en er token-audience på Android), en Android-klient med pakkenavnet og SHA-1 din, og en iOS-klient for iOS og macOS.
Kodeeksempler
Fem komplette flyter, fra knappene til serveren din. Hvert kall returnerer med en gang; resultatene kommer som KlugAuthEvents. Full dokumentasjon →
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-oversikt
| KlugAuth.getInstance() | Returnerer den ene instansen. |
| isSupported | True der Logg inn med Apple er tilgjengelig (iOS, macOS). |
| isGoogleSupported | True der Logg inn med Google er tilgjengelig (Android, iOS, macOS). |
| generateNonce() | Statisk. En ny tilfeldig nonce (32 byte som hex); bruk den én gang og send den samme verdien til serveren din. |
| signInWithApple(nonce) | Åpner Apples innloggingsark. Returnerer false hvis det ikke kunne starte (støttes ikke, eller en innlogging pågår allerede). |
| signInWithGoogle(clientId, nonce) | Åpner Google-innlogging. Android: webklient-ID-en; iOS / macOS: iOS-klient-ID-en. Returnerer false hvis det ikke kunne starte. |
| getCredentialState(userID) | Spør Apple om brukeren fortsatt er autorisert; svaret kommer som APPLE_CREDENTIAL_STATE. iOS og macOS. |
| KlugAuthEvent | identityToken, authorizationCode, userID, email, givenName, familyName, fullName, state, errorCode, errorMessage. |
Hendelser
| APPLE_SUCCESS | identityToken, authorizationCode, userID; email og navn bare ved første autorisasjon. |
| APPLE_CANCELED | Brukeren lukket arket. |
| APPLE_ERROR | errorCode og errorMessage fra systemet. |
| APPLE_CREDENTIAL_STATE | userID og state: authorized · revoked · notFound · transferred · unknown |
| GOOGLE_SUCCESS | identityToken, userID (kontoens e-postadresse), email, givenName, familyName. |
| GOOGLE_CANCELED | Brukeren lukket arket. |
| GOOGLE_ERROR | errorCode og errorMessage; på Android NO_ACCOUNT når enheten ikke har en Google-konto. |
Kjøp KlugAuth
En årslisens for én AIR-applikasjon, med alle oppdateringer i 12 måneder. Etter betaling mottar du utvidelsen, ActionScript-biblioteket og dokumentasjonen på e-post, vanligvis innen én virkedag. Lisens og vilkår
- Lisens for én AIR-applikasjon
- Alle oppdateringer i 12 måneder
- Ingen støtte
- Lisens for én AIR-applikasjon
- Alle oppdateringer i 12 måneder
- Svar på e-post innen 7 dager
- Lisens for én AIR-applikasjon
- Alle oppdateringer i 12 måneder
- Svar på e-post innen 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 | Sign in with Apple-capability på App ID-en din |
| OAuth-klienter i Google Cloud-konsollen |