Donc mon intention est d'avoir une connexion dans mon application iOS qui permet soit notre inscription standard par email/mot de passe, soit la connexion avec Facebook. Nous créons également des services REST pour obtenir des informations sur l'application pour un utilisateur donné, par exemple https://url/getPosts/\[userId\]?userPwd=foo
J'ai déjà mis en place un SSO avec Facebook dans une application web mais j'ai quelques préoccupations concernant la sécurité de l'authentification dans un scénario client iOS. La différence clé par rapport à ce que j'ai fait auparavant est qu'avec une application web, je faisais un appel serveur à serveur à Facebook pour obtenir le jeton d'accès, ce qui me permettait de m'assurer raisonnablement que l'utilisateur était authentifié et que le serveur web effectuait des appels privilégiés à la base de données. Dans le cas d'iOS, c'est l'application client mobile qui effectue la demande d'authentification iOS Facebook par elle-même et le serveur doit d'une manière ou d'une autre avoir confiance que cet utilisateur de l'application client est effectivement authentifié par rapport à l'enregistrement utilisateur correspondant dans notre base de données.
Ma question est comment générer une clé unique durable et secrète à partir du SDK iOS afin de pouvoir créer et associer un enregistrement utilisateur correspondant dans notre base de données pour les utilisateurs qui s'authentifient uniquement avec Facebook. Je veux que cela se fasse de manière transparente afin que l'utilisateur n'ait pas à remplir manuellement un autre formulaire, et que nous créions automatiquement cet enregistrement utilisateur correspondant dans notre base de données.
Je pourrais insérer un enregistrement dans ma propre table d'utilisateurs lorsqu'ils fbDidLogin avec Facebook, en utilisant l'identifiant Facebook comme identifiant unique et le jeton d'accès fb comme pseudo mot de passe/clé pour mon propre enregistrement utilisateur. Je devrais valider le jeton d'accès avec Facebook pour m'assurer qu'il est valide avant de le sauvegarder comme mot de passe pour l'utilisateur (l'utilisateur ne verrait jamais ce mot de passe, il serait juste transmis par l'application cliente lors des appels API). De cette manière, lorsque l'utilisateur effectue un appel à notre propre API REST via l'application iPhone, nous pouvons authentifier et autoriser en utilisant ce secret/mot de passe/clé.
Une alternative qui rendrait toute cette question obsolète serait de simplement gérer la logique d'autorisation sur l'application cliente et de vérifier s'il y a une session fb valide avant de faire des appels à nos propres APIs que je sécurise avec un seul secret global pour l'application, mais cela ne semble pas aussi sécurisé car obtenir ce seul secret donne l'autorisation d'accéder aux données de tous les utilisateurs. Je préfèrerais autoriser au niveau de chaque utilisateur. Est-ce le bon choix? Suis-je paranoïaque concernant la sécurité iOS?
Le jeton d'accès fb expire donc cela peut ne pas sembler durable, cependant si j'active l'accès hors ligne ce jeton ne sera pas expiré mais générera une fenêtre de dialogue oauth plus effrayante. Une alternative au jeton d'accès est de hacher l'identifiant fb avec une clé secrète d'application sur l'application iOS, et d'utiliser cela comme mot de passe pour l'utilisateur Facebook dans notre base de données. Cependant, encore une fois, il s'agit d'une seule clé secrète qui pourrait peut-être être recompilée à partir de l'application cliente iOS?