Vue d’ensemble
La plupart des utilisateurs abandonnent au formulaire d’inscription : un nom d’utilisateur, un mot de passe à retenir, un code par e-mail qui atterrit dans les spams. Avec KlugAuth, ils touchent Continuer avec Apple ou Continuer avec Google, et c’est terminé.
KlugAuth affiche la connexion native de chaque plateforme : la feuille d’Apple avec Face ID / Touch ID sur iOS et macOS, la feuille de compte Android (Credential Manager) pour Google, et la fenêtre de connexion système pour Google sur iOS et macOS. Il renvoie le jeton d’identité du fournisseur avec votre nonce, prêt à être vérifié sur votre serveur, ainsi que le code d’autorisation Apple dont vous avez besoin pour révoquer le lien lors de la suppression d’un compte (directive App Store 5.1.1(v)).
Aucun SDK Google n’est intégré : la connexion Google sur iOS et macOS utilise le flux OAuth standard avec PKCE dans la feuille du navigateur système, ce qui garde l’extension légère.
KlugAuth fonctionne dans la version actuelle de nos applications, notre preuve de concept, pour l’inscription, la connexion et la confirmation d’une déconnexion d’appareil avec Apple ou Google.
Fonctionnalités
- Autonome : une seule ANE, sans bibliothèque centrale ni ANE de dépendance à ajouter
- Sign in with Apple sur iOS 13+, macOS 10.15+ et applications iPad sur Mac Apple silicon
- Sign in with Google sur Android (Credential Manager) et sur iOS / macOS (fenêtre de connexion système, sans SDK Google)
- Jeton d’identité, identifiant utilisateur, e-mail et nom ; code d’autorisation Apple pour le renouvellement et la révocation
- Assistant de nonce pour la protection contre le rejeu (Apple transporte son SHA-256, Google la valeur brute)
- Vérification de l’état des identifiants Apple (autorisé / révoqué) pour les utilisateurs de retour
- Événements distincts de réussite, d’annulation et d’erreur ; l’annulation est signalée, jamais comme une erreur
Plateformes prises en charge
Sign in with Apple sur Android est possible avec le flux web d’Apple et une petite page serveur ; nous pouvons la fournir dans le cadre d’un projet. isSupported (Apple) et isGoogleSupported indiquent à votre code ce que l’appareil propose.
Prise en main
Ajoutez l’extension au descripteur de votre application :
<extensions>
<extensionID>com.klug.auth.KlugAuth</extensionID>
</extensions>
Pour Sign in with Apple, ajoutez le droit (entitlement) (iOS : Entitlements dans le descripteur ; macOS : lors de la signature) :
<key>com.apple.developer.applesignin</key> <array><string>Default</string></array>
Pour Google, créez des clients OAuth dans la console Google Cloud : un client web (son identifiant est l’audience du jeton sur Android), un client Android avec le nom de votre paquet et votre SHA-1, et un client iOS pour iOS et macOS.
Exemples de code
Cinq flux complets, des boutons jusqu’à votre serveur. Chaque appel retourne immédiatement ; les résultats arrivent sous forme de KlugAuthEvents. Documentation complète →
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
Aperçu de l’API
| KlugAuth.getInstance() | Renvoie l’instance unique. |
| isSupported | Vrai là où Sign in with Apple est disponible (iOS, macOS). |
| isGoogleSupported | Vrai là où Sign in with Google est disponible (Android, iOS, macOS). |
| generateNonce() | Statique. Un nonce aléatoire neuf (32 octets en hexadécimal) ; utilisez-le une seule fois et envoyez la même valeur à votre serveur. |
| signInWithApple(nonce) | Ouvre la feuille de connexion d’Apple. Renvoie false si elle n’a pas pu démarrer (non prise en charge, ou connexion déjà en cours). |
| signInWithGoogle(clientId, nonce) | Ouvre la connexion Google. Android : l’identifiant du client web ; iOS / macOS : l’identifiant du client iOS. Renvoie false si elle n’a pas pu démarrer. |
| getCredentialState(userID) | Demande à Apple si l’utilisateur est toujours autorisé ; la réponse arrive sous forme d’APPLE_CREDENTIAL_STATE. iOS et macOS. |
| KlugAuthEvent | identityToken, authorizationCode, userID, email, givenName, familyName, fullName, state, errorCode, errorMessage. |
Événements
| APPLE_SUCCESS | identityToken, authorizationCode, userID ; email et les noms uniquement lors de la première autorisation. |
| APPLE_CANCELED | L’utilisateur a fermé la feuille. |
| APPLE_ERROR | errorCode et errorMessage du système. |
| APPLE_CREDENTIAL_STATE | userID et state : authorized · revoked · notFound · transferred · unknown |
| GOOGLE_SUCCESS | identityToken, userID (l’e-mail du compte), email, givenName, familyName. |
| GOOGLE_CANCELED | L’utilisateur a fermé la feuille. |
| GOOGLE_ERROR | errorCode et errorMessage ; sur Android, NO_ACCOUNT lorsque l’appareil n’a aucun compte Google. |
Acheter KlugAuth
Une licence annuelle pour une application AIR, avec toutes les mises à jour pendant 12 mois. Après le paiement, vous recevez l’extension, la bibliothèque ActionScript et la documentation par e-mail, généralement sous un jour ouvré. Licence et conditions
- Licence pour une application AIR
- Toutes les mises à jour pendant 12 mois
- Sans support
- Licence pour une application AIR
- Toutes les mises à jour pendant 12 mois
- Réponse par e-mail sous 7 jours
- Licence pour une application AIR
- Toutes les mises à jour pendant 12 mois
- Réponse par e-mail sous 48 heures
Prérequis
| SDK AIR | 51.x (HARMAN) |
| iOS | iOS 13 ou version ultérieure |
| Android | Android 6 ou version ultérieure, Google Play services |
| macOS | macOS 10.15 ou version ultérieure |
| Apple | Capacité Sign in with Apple sur votre App ID |
| Clients OAuth dans la console Google Cloud |