web-dev-qa-db-fra.com

Conception pour l'authentification Facebook dans une application iOS qui accède également à un service Web sécurisé

Objectif: Permettre à un utilisateur de s'authentifier avec Facebook dans une application iOS nécessitant l'accès à un service Web protégé que je cours.

Hypothèses: Un système d'authentification (et d'enregistrement) natif est en place pour les utilisateurs qui choisissent de ne pas utiliser Facebook pour se connecter.

Détails:

  • Supposons que nous voulions offrir à un utilisateur la possibilité de se connecter avec Facebook sans créer de compte/identifiant distinct pour notre système.
  • Parce que nous prenons en charge notre propre mécanisme d'authentification natif (nom d'utilisateur et mot de passe), nous avons nos propres ID utilisateur et émettons un jeton d'authentification utilisé pour les interactions ultérieures après la validation initiale des informations d'identification.

Je suis surpris que Facebook n'ait pas de meilleures pratiques à ce sujet dans la documentation destinée aux développeurs. Toute la documentation existante suppose que vous construisez une autorisation FB dans un site Web ou une application mobile autonome sans aucun service nécessitant une authentification.

Voici mes réflexions initiales sur la façon dont cela serait conçu, mais je veux savoir si c'est correct.

  1. Le client ouvre la connexion Facebook iOS
  2. L'interface utilisateur se connecte avec les identifiants Facebook et obtient un jeton d'accès.
  3. l'application iOS transmet le jeton d'accès à notre serveur
  4. Notre serveur communique avec l'API graphique FB à l'aide d'un jeton d'accès pour (a) valider le jeton et (b) obtenir l'ID utilisateur du FB correspondant à ce jeton d'accès.

    par exemple. Notre serveur appellerait https://graph.facebook.com/me/?access_token=XYZ qui renverrait les informations de profil dans un objet JSON

  5. En supposant qu'il soit valide, notre serveur extrait l'ID utilisateur de l'objet JSON et vérifie si l'utilisateur a déjà un compte. Si c'est le cas, nous émettons notre propre ticket d'authentification au client à utiliser pour cette session. Si l'utilisateur n'a pas de compte, nous en créons un avec l'ID utilisateur Facebook, attribuons notre propre ID utilisateur unique et émettons notre ticket d'authentification.

  6. Le client transmet ensuite le ticket d'authentification aux interactions ultérieures nécessitant une authentification.

Cela semble être la bonne approche pour moi, mais je ne suis pas sûr si je manque quelque chose de fondamentalement insensé et que je prends le mauvais chemin (compliqué).

393
TMC

Je viens juste de m'en occuper moi-même et voici la partie qui m'a mordue:

Dans votre étape 5 ... Il est possible pour un utilisateur de s'inscrire pour un compte avec vous complètement distinct de son identifiant Facebook, n'est-ce pas? Puis, à un autre moment, ils se connectent avec Facebook ... Et vous venez de leur créer un deuxième compte et de perdre leur premier compte.

Il doit y avoir un moyen de vous connecter à votre service Web, puis de vous connecter à Facebook et de capturer l'association entre l'ID de Facebook et le compte local.

En dehors de cela, votre plan semble solide.

Mise à jour : Facebook a ajouté un document décrivant un tel scénario ICI

76
Dan Ray

Utilisez https pour transmettre le jeton d'authentification à votre serveur, comme indiqué par Facebook

Partage des jetons d'accès

Nos politiques de données interdisent explicitement le partage d'un jeton d'accès pour votre application avec une autre application. Cependant, nous autorisons les développeurs à partager des jetons entre une implémentation native et une implémentation de serveur de la même application (c'est-à-dire utilisant le même identifiant d'application) tant que le transfert a lieu via HTTPS.

28
zoomcrypt

Un problème que je peux voir avec cette stratégie est que quelqu'un peut vous donner un jeton d'accès obtenu pour une application facebook différente. Autant que je sache, il n’existe aucun moyen de vérifier que le jeton d’accès est destiné à votre application. Vous devez donc continuer à l’utiliser.

Cela ne semble pas très dangereux, cependant. Généralement, les personnes/applications tentent de protéger les jetons d'accès plutôt que de les partager.

Un exploit de cette possibilité serait que quelqu'un crée son propre site ou sa propre application mobile, obtienne des jetons d'accès pour ses utilisateurs et tente de les authentifier à l'aide de votre API. Si cela réussit (l'utilisateur possède un compte facebook sur votre site), le site malveillant pourra utiliser votre API sous l'identité de l'utilisateur.

C'est un peu long, mais je pense que cela pourrait fonctionner.

Edit: il semble qu'il existe un moyen de valider le jeton d'accès après tout. Voir la réponse de @Daaniel à la question Obtenir l'ID de l'application à partir du jeton d'accès utilisateur (ou vérifier l'application source pour un jeton) .

14
ivant

votre solution fonctionne totalement.

Peut-être une alternative: pourquoi ne pas simplement obtenir le courrier électronique sur le client à partir de la demande initiale de service social et l'envoyer à votre service Web? Le service Web pourrait simplement stocker le courrier électronique, et peut-être également un fournisseur de réseaux sociaux. Je comprends que votre service Web ne sera pas en mesure de confirmer l’origine de l’e-mail, mais n’y at-il pas une relation de grande confiance entre votre service Web et votre client? Si tel est le cas, vous semblez pouvoir compter sur le courrier électronique provenant du bon endroit. Quelqu'un s'il vous plaît laissez-moi savoir ce qui me manque, ce qui rend l'approche stupide basée sur la messagerie électronique ...

4
hamsterdam