Yleiskatsaus
Useimmat käyttäjät luovuttavat rekisteröitymislomakkeella: käyttäjätunnus, muistettava salasana, sähköpostikoodi, joka päätyy roskapostiin. KlugAuthin kanssa he napauttavat Jatka Applella tai Jatka Googlella, ja homma on valmis.
KlugAuth näyttää kunkin alustan natiivin kirjautumisen: Applen näkymä Face ID / Touch ID -tunnistuksella iOS:llä ja macOS:llä, Androidin tilinäkymä (Credential Manager) Googlea varten sekä järjestelmän kirjautumisikkuna Googlea varten iOS:llä ja macOS:llä. Se palauttaa palveluntarjoajan identiteettitunnisteen yhdessä noncen kanssa, valmiina varmennettavaksi palvelimellasi, sekä Applen valtuutuskoodin, jota tarvitset yhteyden peruuttamiseen tilin poistamisen yhteydessä (App Store -ohje 5.1.1(v)).
Google SDK:ta ei ole mukana: Googlen kirjautuminen iOS:llä ja macOS:llä käyttää tavallista OAuth-kulkua PKCE:llä järjestelmän selainnäkymässä, joten laajennus pysyy pienenä.
KlugAuth on käytössä sovellustemme nykyisessä julkaisussa, todisteenamme toimivuudesta, rekisteröitymisessä, kirjautumisessa ja laitteen uloskirjautumisen vahvistamisessa Apple- tai Google-tilillä.
Ominaisuudet
- Itsenäinen: yksi ANE, ei ydinkirjastoa tai riippuvaisia ANE-laajennuksia lisättäväksi
- Sign in with Apple iOS 13+:lla, macOS 10.15+:lla ja iPad-sovelluksissa Apple silicon -Maceilla
- Sign in with Google Androidilla (Credential Manager) sekä iOS:llä / macOS:llä (järjestelmän kirjautumisikkuna, ei Google SDK:ta)
- Identiteettitunniste, käyttäjätunnus, sähköposti ja nimi; Applen valtuutuskoodi uusimista ja peruuttamista varten
- Nonce-apufunktio toistohyökkäysten estoon (Apple välittää sen SHA-256-tiivisteen, Google raaka-arvon)
- Applen tunnistetietojen tilan tarkistus (valtuutettu / peruutettu) palaaville käyttäjille
- Erilliset onnistumis-, peruutus- ja virhetapahtumat; peruutus raportoidaan, mutta se ei ole koskaan virhe
Tuetut alustat
Sign in with Apple Androidilla on mahdollista Applen verkkokulun ja pienen palvelinsivun avulla; voimme toimittaa sen osana projektia. isSupported (Apple) ja isGoogleSupported kertovat koodillesi, mitä laite tarjoaa.
Aloitus
Lisää laajennus sovelluksesi descriptoriin:
<extensions>
<extensionID>com.klug.auth.KlugAuth</extensionID>
</extensions>
Sign in with Applea varten lisää entitlement (iOS: Entitlements descriptorissa; macOS: allekirjoituksen yhteydessä):
<key>com.apple.developer.applesignin</key> <array><string>Default</string></array>
Googlea varten luo OAuth-asiakkaat Google Cloud -konsolissa: verkkoasiakas (sen tunnus on tunnisteen audience Androidilla), Android-asiakas pakettinimelläsi ja SHA-1:llä sekä iOS-asiakas iOS:ää ja macOS:ää varten.
Koodiesimerkit
Viisi täydellistä esimerkkiä, painikkeista palvelimellesi asti. Jokainen kutsu palaa heti; tulokset saapuvat KlugAuthEvent-tapahtumina. Koko dokumentaatio →
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
Rajapintayleiskatsaus
| KlugAuth.getInstance() | Palauttaa yksittäisen instanssin. |
| isSupported | True siellä, missä Sign in with Apple on saatavilla (iOS, macOS). |
| isGoogleSupported | True siellä, missä Sign in with Google on saatavilla (Android, iOS, macOS). |
| generateNonce() | Staattinen. Uusi satunnainen nonce (32 tavua heksana); käytä sitä kerran ja lähetä sama arvo palvelimellesi. |
| signInWithApple(nonce) | Avaa Applen kirjautumisnäkymän. Palauttaa false, jos käynnistys ei onnistunut (ei tuettu tai kirjautuminen on jo käynnissä). |
| signInWithGoogle(clientId, nonce) | Avaa Googlen kirjautumisen. Android: verkkoasiakkaan tunnus; iOS / macOS: iOS-asiakkaan tunnus. Palauttaa false, jos käynnistys ei onnistunut. |
| getCredentialState(userID) | Kysyy Applelta, onko käyttäjä yhä valtuutettu; vastaus saapuu tapahtumana APPLE_CREDENTIAL_STATE. iOS ja macOS. |
| KlugAuthEvent | identityToken, authorizationCode, userID, email, givenName, familyName, fullName, state, errorCode, errorMessage. |
Tapahtumat
| APPLE_SUCCESS | identityToken, authorizationCode, userID; email ja nimet vain ensimmäisen valtuutuksen yhteydessä. |
| APPLE_CANCELED | Käyttäjä sulki näkymän. |
| APPLE_ERROR | errorCode ja errorMessage järjestelmältä. |
| APPLE_CREDENTIAL_STATE | userID ja state: authorized · revoked · notFound · transferred · unknown |
| GOOGLE_SUCCESS | identityToken, userID (tilin sähköposti), email, givenName, familyName. |
| GOOGLE_CANCELED | Käyttäjä sulki näkymän. |
| GOOGLE_ERROR | errorCode ja errorMessage; Androidilla NO_ACCOUNT, kun laitteessa ei ole Google-tiliä. |
Osta KlugAuth
Vuosilisenssi yhdelle AIR-sovellukselle, kaikki päivitykset 12 kuukauden ajan. Maksun jälkeen saat laajennuksen, ActionScript-kirjaston ja dokumentaation sähköpostitse, yleensä yhden arkipäivän kuluessa. Lisenssi ja ehdot
- Lisenssi yhdelle AIR-sovellukselle
- Kaikki päivitykset 12 kuukauden ajan
- Ei tukea
- Lisenssi yhdelle AIR-sovellukselle
- Kaikki päivitykset 12 kuukauden ajan
- Vastaus sähköpostitse 7 päivän kuluessa
- Lisenssi yhdelle AIR-sovellukselle
- Kaikki päivitykset 12 kuukauden ajan
- Vastaus sähköpostitse 48 tunnin kuluessa
Vaatimukset
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 13 tai uudempi |
| Android | Android 6 tai uudempi, Google Play -palvelut |
| macOS | macOS 10.15 tai uudempi |
| Apple | Sign in with Apple -ominaisuus App ID:ssäsi |
| OAuth-asiakkaat Google Cloud -konsolissa |