Översikt
De flesta användare ger upp vid registreringsformuläret: ett användarnamn, ett lösenord de måste komma ihåg, en e-postkod som hamnar i skräpposten. Med KlugAuth trycker de på Continue with Apple eller Continue with Google och är klara.
KlugAuth visar den inbyggda inloggningen för varje plattform: Apples ruta med Face ID / Touch ID på iOS och macOS, Androids kontoruta (Credential Manager) för Google, och systemets inloggningsfönster för Google på iOS och macOS. Den returnerar leverantörens identitetstoken tillsammans med din nonce, redo för verifiering på din server, samt den Apple-auktoriseringskod du behöver för att återkalla kopplingen när ett konto raderas (App Store-riktlinje 5.1.1(v)).
Ingen Google SDK ingår: Google-inloggning på iOS och macOS använder standardflödet OAuth med PKCE i systemets webbläsarruta, så att tillägget förblir litet.
KlugAuth körs i den aktuella versionen av våra appar, vårt proof of concept, för registrering, inloggning och bekräftelse av utloggning från en enhet med Apple eller Google.
Funktioner
- Fristående: ett ANE, inget kärnbibliotek eller beroende-ANE:er att lägga till
- Sign in with Apple på iOS 13+, macOS 10.15+ och iPad-appar på Mac med Apple silicon
- Sign in with Google på Android (Credential Manager) och på iOS / macOS (systemets inloggningsfönster, ingen Google SDK)
- Identitetstoken, användar-ID, e-post och namn; Apple-auktoriseringskod för förnyelse och återkallelse
- Nonce-hjälpare för skydd mot replay-attacker (Apple bär dess SHA-256, Google det råa värdet)
- Kontroll av Apples credential state (authorized / revoked) för återvändande användare
- Separata händelser för lyckat resultat, avbrott och fel; avbrott rapporteras, aldrig som fel
Plattformar som stöds
Sign in with Apple på Android är möjligt med Apples webbflöde och en liten serversida; det kan vi leverera som en del av ett projekt. isSupported (Apple) och isGoogleSupported talar om för din kod vad enheten erbjuder.
Kom igång
Lägg till tillägget i din applikationsbeskrivning (application descriptor):
<extensions>
<extensionID>com.klug.auth.KlugAuth</extensionID>
</extensions>
För Sign in with Apple lägger du till entitlement (iOS: Entitlements i descriptor; macOS: vid signeringen):
<key>com.apple.developer.applesignin</key> <array><string>Default</string></array>
För Google skapar du OAuth-klienter i Google Cloud-konsolen: en webbklient (dess ID är token-audience på Android), en Android-klient med ditt paketnamn och SHA-1, och en iOS-klient för iOS och macOS.
Kodexempel
Fem kompletta flöden, från knapparna till din server. Varje anrop returnerar direkt; resultat kommer som KlugAuthEvents. Fullständig 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-översikt
| KlugAuth.getInstance() | Returnerar den enda instansen. |
| isSupported | True där Sign in with Apple är tillgängligt (iOS, macOS). |
| isGoogleSupported | True där Sign in with Google är tillgängligt (Android, iOS, macOS). |
| generateNonce() | Statisk. En ny slumpmässig nonce (32 byte som hex); använd den en gång och skicka samma värde till din server. |
| signInWithApple(nonce) | Öppnar Apples inloggningsruta. Returnerar false om den inte kunde starta (stöds inte, eller en inloggning pågår redan). |
| signInWithGoogle(clientId, nonce) | Öppnar Google-inloggning. Android: webbklientens ID; iOS / macOS: iOS-klientens ID. Returnerar false om den inte kunde starta. |
| getCredentialState(userID) | Frågar Apple om användaren fortfarande är auktoriserad; svaret kommer som APPLE_CREDENTIAL_STATE. iOS och macOS. |
| KlugAuthEvent | identityToken, authorizationCode, userID, email, givenName, familyName, fullName, state, errorCode, errorMessage. |
Händelser
| APPLE_SUCCESS | identityToken, authorizationCode, userID; email och namn endast vid den första auktoriseringen. |
| APPLE_CANCELED | Användaren stängde rutan. |
| APPLE_ERROR | errorCode och errorMessage från systemet. |
| APPLE_CREDENTIAL_STATE | userID och state: authorized · revoked · notFound · transferred · unknown |
| GOOGLE_SUCCESS | identityToken, userID (kontots e-postadress), email, givenName, familyName. |
| GOOGLE_CANCELED | Användaren stängde rutan. |
| GOOGLE_ERROR | errorCode och errorMessage; på Android NO_ACCOUNT när enheten saknar Google-konto. |
Köp KlugAuth
En årslicens för en AIR-applikation, med alla uppdateringar i 12 månader. Efter betalning får du tillägget, ActionScript-biblioteket och dokumentationen via e-post, vanligtvis inom en arbetsdag. Licens och villkor
- Licens för en AIR-applikation
- Alla uppdateringar i 12 månader
- Ingen support
- Licens för en AIR-applikation
- Alla uppdateringar i 12 månader
- Svar via e-post inom 7 dagar
- Licens för en AIR-applikation
- Alla uppdateringar i 12 månader
- Svar via e-post inom 48 timmar
Krav
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 13 eller senare |
| Android | Android 6 eller senare, Google Play services |
| macOS | macOS 10.15 eller senare |
| Apple | Capability Sign in with Apple på ditt App ID |
| OAuth-klienter i Google Cloud-konsolen |