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

Objectif: Autoriser un utilisateur à s'authentifier avec Facebook dans une application iOS qui nécessite l'accès à un service Web protégé que j'exécute.

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 voulons offrir la possibilité à un utilisateur de se connecter avec Facebook sans créer de Compte/informations d'identification 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 identifiants d'utilisateur et émettons un jeton d'authentification qui est utilisé pour les interactions suivantes après la validation initiale des informations d'identification.

Je suis surpris que Facebook n'ait pas les meilleures pratiques pour cela dans leur documentation de développeur. Toute la documentation existante suppose soit que vous construisez FB auth dans un site Web, soit une application mobile autonome sans service qui nécessite Authentication.

Voici mes premières réflexions sur la façon dont cela serait conçu, mais je veux une validation pour savoir si c'est correct.

  1. le Client ouvre la connexion Facebook iOS
  2. l'utilisateur de L'interface utilisateur se connecte avec des informations D'identification Facebook et obtient un jeton d'accès
  3. l'application iOS transmet le jeton d'accès à notre serveur
  4. Notre serveur parle à L'API FB graph en utilisant le jeton d'accès pour (A) valider le jeton et (b) obtenir L'ID utilisateur FB pour ce jeton d'accès.

    Par exemple, notre serveur appel https://graph.facebook.com/me/?access_token=XYZ {[34] } qui retournerait des informations de profil dans un objet JSON

  5. En supposant qu'il est 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 nouveau avec L'ID utilisateur Facebook, attribuons notre propre ID utilisateur unique et émettons notre ticket d'authentification.

  6. Client puis passe le ticket auth sur les interactions suivantes qui nécessitent une authentification.

Cela semble être la bonne approche pour moi, mais je ne sais pas si je manque quelque chose d'incroyablement basique et si je vais dans le mauvais chemin (compliqué).

379
demandé sur TMC 2011-01-07 12:11:05

4 réponses

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

Dans votre étape 5... Il est possible pour un utilisateur de s'inscrire à un compte avec vous entièrement séparé de son identifiant Facebook, non? Puis une autre fois, ils se connectent avec Facebook.... Et vous venez de leur créer un deuxième compte et perdu leur premier.

Il doit y avoir un moyen d'être connecté à votre web service, puis connectez-vous à facebook, et la capture de l'association entre le facebook ID et le local compte.

En dehors de cela, votre plan semble solide.

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

72
répondu Dan Ray 2018-07-17 17:16:00

Utiliser 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 tout partage d'un jeton D'accès pour votre application avec toute autre application. Cependant, nous permettons aux développeurs de partager des jetons entre une implémentation native et un serveur mise en œuvre de la même application (ie. utiliser le même ID D'application) tant que le transfert a lieu en utilisant HTTPS.

27
répondu zoomcrypt 2013-03-11 03:53:12

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. Pour autant que je sache, il n'y a aucun moyen de vérifier que le jeton d'accès est pour votre application, donc vous allez simplement continuer et l'utiliser.

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

Un exploit possible de ce serait, pour quelqu'un de créer son propre site ou application mobile, obtenir accédez aux jetons pour leurs utilisateurs et essayez de les authentifier, en utilisant votre API. Si cela réussit (l'Utilisateur a un compte facebook dans votre site), le site malveillant pourra utiliser votre API se faisant passer pour l'utilisateur.

C'est un peu long, mais je pense que ça pourrait marcher.

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).

12
répondu ivant 2017-05-23 11:47:23

Votre solution fonctionne totalement.

Peut-être une alternative: pourquoi ne pas simplement obtenir l'e-mail sur le client à partir de la demande initiale de service social et l'Envoyer à votre service web? Le service web pourrait simplement stocker l'email, et peut-être aussi un social_provider. Je comprends que votre service web ne sera pas en mesure de valider l'origine de l'e-mail, mais n'y a-t-il pas une relation de confiance élevée entre votre service web et votre client? S'il y a, semble que vous pouvez dépendre de l'e-mail à venir depuis le bon endroit. Quelqu "un s" il vous plaît laissez-moi savoir quelle chose évidente je manque qui rend l " approche par courriel stupide...

3
répondu hamsterdam 2014-03-04 05:07:56