Présentation de la connexion avec Apple - Système d'autorisation Apple

Bonjour, Habr!

Cet été, lors de la conférence WWDC 2019, Apple a présenté son propre système d'autorisation de connexion avec Apple et l'a rendu obligatoire pour toutes les applications de l'App Store qui utilisent la connexion aux médias sociaux. L'exception concerne les applications éducatives, d'entreprise, gouvernementales et commerciales qui utilisent leur propre autorisation. Pour se connecter avec Apple, Apple a créé une documentation de haute qualité et dans cet article, nous utiliserons l'exemple de CIAN pour décrire comment l'implémenter dans notre service.



Configurer le compte développeur Apple


Le travail d'intégration commence par la création d'un compte développeur. Vous devez d'abord activer l'option Se connecter avec Apple pour votre ID d'application. Pour ce faire, accédez à la liste des identifiants dans le compte de développeur Apple , sélectionnez l'ID d'application nécessaire et activez l'option Se connecter avec Apple.

Nous configurons maintenant le Service ID - un identifiant unique pour l'application Web dont vous aurez besoin pour accéder à l'API de connexion avec Apple. Au total, jusqu'à 5 ID de service peuvent être créés par ID d'application. Pour ce faire, cliquez sur le bouton pour créer des identifiants, sélectionnez ID service, remplissez les champs requis et cliquez sur Modifier dans le champ Se connecter avec Apple. Un formulaire s'ouvre dans lequel nous sélectionnons l'ID d'application principal correct, spécifions le domaine Web et listons les URL pour la redirection après une connexion réussie. N'oubliez pas que vous ne pouvez saisir que 10 URL de retour:



Pour enregistrer, cliquez sur Enregistrer, continuer et enregistrer. Oui, pour toute modification de configuration, vous devez cliquer sur les trois boutons, sinon les modifications ne prendront pas effet.

Maintenant, dans la liste Service ID, sélectionnez l'identifiant créé et cliquez à nouveau sur Modifier dans le champ Se connecter avec Apple. Dans la fenêtre qui s'ouvre, à côté du champ d'adresse Web, nous voyons deux nouveaux boutons:



Ce fichier est requis pour qu'Apple vérifie votre ressource. Téléchargez-le et placez-le sur votre ressource. Immédiatement, cette feinte n'a pas fonctionné pour nous: lorsque nos administrateurs ont ajouté le fichier, la redirection (302) vers le fichier situé à un autre endroit a fonctionné sur l'URL spécifiée, et Apple ne l'a pas vérifié. Ensuite, j'ai dû placer le fichier pour un accès direct par URL (200). Une fois qu'Apple a correctement vérifié le fichier, une coche verte à côté du domaine s'allume:



Dans la section des identifiants, accédez à la section Clés et créez une nouvelle clé. Pour ce faire, cochez la case Se connecter avec Apple et cliquez d'abord sur Configurer pour vérifier l'ID d'application, puis continuer:



Sur l'écran suivant, assurez-vous de télécharger le fichier avec la clé et de l'enregistrer dans un endroit sûr, car après avoir quitté cet écran, la clé ne sera pas disponible pour le téléchargement. Sur la même page, vous pouvez voir l'ID de clé, dont nous avons toujours besoin:



Se connecter avec Apple a un bonus pour les utilisateurs: il vous permet de fournir un faux e-mail, auquel vous ne pouvez écrire qu'à partir d'adresses de confiance. Dans ce cas, une configuration supplémentaire est nécessaire. Ouvrez la section Plus, cliquez sur Configurer dans la section Se connecter avec Apple et entrez votre URL:



Ajoutez le bouton Se connecter avec Apple à l'application iOS.


CIAN fonctionne sur trois plateformes: iOS, Android, Web. Il existe un SDK natif pour iOS, donc l'autorisation ressemblera à ceci:



Pour ajouter Se connecter avec Apple à l'application iOS, ajoutez le bouton ASAuthorizationAppleIDButton et accrochez le gestionnaire de clics dessus:

let appleIDProvider = ASAuthorizationAppleIDProvider() let request = appleIDProvider.createRequest() request.requestedScopes = [.fullName, .email] let authorizationController = ASAuthorizationController(authorizationRequests: [request]) authorizationController.delegate = self authorizationController.presentationContextProvider = self authorizationController.performRequests() 

En plus de ASAuthorizationAppleIDProvider, faites attention à ASAuthorizationPasswordProvider, qui vous permet d'obtenir un tas de "login-mot de passe" de Keychain.

Maintenant, nous implémentons ASAuthorizationControllerPresentationContextProviding:

 func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {    return self.view.window! } 

Créez un délégué ASAuthorizationControllerDelegate qui signale la réussite ou l'erreur:

 public func authorizationController( controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization ) { guard let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential, let code = appleIDCredential.authorizationCode, let codeStr = String(data: code, encoding: .utf8) else {        // -            //           return } let email = appleIDCredential.email let firstName = appleIDCredential.fullName?.givenName let lastName = appleIDCredential.fullName?.familyName //           codeStr } public func authorizationController( controller: ASAuthorizationController, didCompleteWithError error: Error ) { //   } 

Nous envoyons le code d'autorisation reçu au serveur et attendons une réponse du backend sur le succès de l'autorisation dans notre système.

Nous implémentons la connexion avec Apple pour le Web et Android


Du coup, pour Android et Web, Apple ne fournit pas de SDK, donc dans les deux cas vous devez ouvrir la page d'autorisation Apple et le processus sera différent:



L'URL de la page de connexion est la suivante:

 https://appleid.apple.com/auth/authorize?\ state=abvgd&\ response_type=code&\ client_id=ServiceID&\ scope=email+name&\ response_mode=form_post&\ redirect_uri=https%3A%2F%2Fcian.ru%2Fauth%2Fsome-callback%2F%3Ftype%3Dappleid 

Considérez ses paramètres:

  • client_id - ID de service qui a été enregistré ci-dessus.
  • redirect_uri - L'URI où l'utilisateur est redirigé après une authentification réussie via l'AppleID. Nous avons spécifié cet URI ci-dessus lors de la configuration d'Apple Developer.
  • état - l'identifiant de session de l'utilisateur que Apple renverra lorsque redirect_uri est appelé afin que nous puissions vérifier l'expéditeur. Vous pouvez inventer vous-même une règle pour générer ce paramètre, par exemple, une chaîne aléatoire.
  • portée - ce paramètre indique les informations dont l'utilisateur a besoin. Par exemple, nom, e-mail ou les deux, comme dans l'exemple ci-dessus.
  • response_type - ce paramètre indique sous quelle forme la réponse est nécessaire. Il peut s'agir de code ou id_token. Si vous sélectionnez id_token, vous devez le spécifier avec le paramètre response_mode, dans lequel vous pouvez spécifier query, fragment et form_post.

Après une authentification à deux facteurs réussie via appleID, Apple appellera le redirect_uri spécifié et transmettra les paramètres d'état et de code:

 curl -X POST \ 'https://www.cian.ru/some-callback/?type=appleid' \ -H 'Content-Type: application/x-www-form-urlencoded' \ --data ' \ state=abvgd&\ code=12345&\ user={"name":{"firstName":"Tanya","lastName":"Sviridova"},"email":"someemail@gmail.com"}' 

Dans le paramètre de code, un code d'authentification utilisateur unique est transmis, qui est valide pendant 5 minutes. Dans le paramètre d'état, l'identifiant de session envoyé lors de la création du formulaire d'autorisation, et dans le paramètre utilisateur, les données utilisateur.

Récupération de données


Sur tous les clients, pour enregistrer les données utilisateur, vous devez obtenir access_token auprès d'Apple. Pour ce faire, demandez d'abord le code d'autorisation:

 curl -X POST https://appleid.apple.com/auth/token -d '\ client_id=some_client_id&\ code=12345&\ client_secret=jwt_part1.jwt_part2.jwt_part3&\ grant_type=authorization_code' 

Dans cette demande:

  • le client_id indique le ServiceID créé pour l'application Web et l'AppID pour l'application iOS.
  • code - nous avons reçu plus haut après la redirection ou transféré du client iOS
  • dans le paramètre grant_type nous passons le but d'obtenir le token: autorisation (autorisation_code) ou renouvellement du token (refresh_token)
  • dans le paramètre client_secret - Jetons Web JSON basés sur la clé secrète obtenue lors de l'enregistrement de l'application.

Vous pouvez créer des jetons Web JSON en Python:

 claims = { 'iss': APPLEID_TEAM_ID, 'aud': 'https://appleid.apple.com', 'sub': client_id, 'iat': current_timestamp, 'exp': current_timestamp + expire_period, } headers = {'kid': 'APPLEID_KEY_ID', 'alg': 'ES256'} client_secret = jwt.encode(payload=claims, key=secret_key, algorithm='ES256', headers=headers).decode('utf-8') 

Si tout s'est bien passé, les paramètres suivants viendront dans la réponse:
 {  "access_token":"ufhzch",  "token_type":"Bearer",  "expires_in":3600,  "refresh_token":"some_refresh_token",  "id_token":"some_long_signed_jwt_token" } 

Hourra, voici access_token. Avec elle vient rafraîchir_token, qui peut être mis à jour si nécessaire access_token.

Les informations utilisateur sont stockées dans le champ id_token, mais elles doivent être décodées:
 public_key = jwt.algorithms.RSAAlgorithm.from_jwk(    json.dumps(apple_public_key) ) data = jwt.decode(    id_token,    public_key,    algorithm="RS256",    verify=True,    audience=client_id, ) 

Apple_public_key est une clé publique qui peut être obtenue à partir du lien.

Après décodage, nous obtenons:

 data = {  "iss": "https://appleid.apple.com",  "aud": client_id,  "exp": 1570379521,  "iat": 1570378921,  "sub": "  ",  "at_hash": "8ZDF6j786IQf9mA",  "email": "someemail@gmail.com",  "email_verified": "true",  "auth_time": 1570378804 } 

L'e-mail n'est transmis qu'une seule fois lorsque l'utilisateur se connecte pour la première fois à votre service via Connexion avec Apple. La prochaine fois, Apple ne transférera ces données que si l'utilisateur dissocie votre application par lui-même. Cette autorisation d'Apple diffère des autres services où les données peuvent être obtenues via l'API, et nous n'avons pas trouvé d'informations sur leur intention d'implémenter quelque chose comme ça.

Dans cette réponse, nous avons besoin des sous-paramètres, qui sont transmis à chaque fois, et du courrier électronique, nous les enregistrons donc dans notre système et informons le client de l'autorisation réussie. PROFIT.

Premiers résultats


Après la sortie de la nouvelle version de CIAN avec Connexion avec Apple, le premier jour de la journée, il représentait un tiers des nouvelles inscriptions pour iOS 13, et maintenant il occupe la deuxième place pour toutes les versions d'iOS, juste après VK. Il y a peu d'inscriptions sur le site utilisant AppleID, mais leur nombre augmente lentement. Et maintenant, nous prévoyons d'activer l'autorisation via AppleID sur les applications Android, et de voir combien d'utilisateurs s'enregistreront de manière aussi délicate.

Source: https://habr.com/ru/post/fr475062/


All Articles