2008-12-09 3 views
8

Je construis une application iPhone qui parle à un backend Ruby on Rails. L'application Ruby on Rails servira également les utilisateurs Web. Le plugin restful_authentication est un excellent moyen de fournir une authentification utilisateur rapide et personnalisable. Cependant, je voudrais que les utilisateurs de l'application iPhone aient un compte créé automatiquement par l'identifiant unique du téléphone ([[UIDevice device] uniqueIdentifier]) stocké dans une nouvelle colonne. Plus tard, lorsque les utilisateurs sont prêts à créer un nom d'utilisateur/mot de passe, le compte sera mis à jour pour contenir le nom d'utilisateur et le mot de passe, laissant l'identifiant unique de l'iPhone intact. Les utilisateurs ne devraient pas pouvoir accéder au site Web tant qu'ils n'ont pas configuré leur nom d'utilisateur/mot de passe. Ils peuvent cependant utiliser l'application iPhone, car l'application peut s'authentifier en utilisant son identifiant.Quelle est la meilleure façon d'étendre restful_authentication/AuthLogic pour prendre en charge les connexions paresseuses par un iPhone anonyme?

Quelle est la meilleure façon de modifier restful_authentication pour ce faire? Créer un plugin? Ou modifier le code généré?

Qu'en est-il des cadres alternatifs, tels que AuthLogic. Quel est le meilleur moyen de permettre aux iPhones d'obtenir un jeton d'authentification généré verrouillé sur leurs UUID, mais de laisser ensuite l'utilisateur créer un nom d'utilisateur/mot de passe plus tard?

+0

Pas vraiment une réponse, mais quelque chose de plus à penser: comment votre design peut gérer le cas où quelqu'un a un compte iphone, enregistre un compte utilisateur/mot de passe sur le site de manière indépendante, et veut fusionner les deux comptes? – Stobor

+0

J'ai réfléchi un peu plus à ce problème, et même si je n'ai pas encore trouvé de solution satisfaisante, j'ai essayé quelques petites choses. La création d'un compte anonyme avec un nom d'utilisateur/mot de passe aléatoire lié à un objet Device fonctionne quelque peu. Cependant, cela nécessite que le périphérique obtienne le nom d'utilisateur/mot de passe lors de sa création et le stocke. Le problème avec cette solution est que le site est alors jonché de contributions de compte anonymes (facilement réparable en ayant un champ de type de compte dans l'utilisateur appelé anonyme, que vous pouvez ensuite filtrer si nécessaire). Cette solution fonctionne mais n'est pas géniale. –

Répondre

6

Je pense que vous ne devriez pas utiliser l'identificateur de téléphone seul pour s'authentifier car ce n'est pas un secret et il est probablement aussi devinable/prévisible. N'oubliez pas que si quelqu'un veut pirater votre application Web, il n'est pas obligé d'utiliser votre code. Il peut simplement deviner les ID de périphérique et essayer de manipuler les données de vos utilisateurs à l'aide de n'importe quel client Web.

Vous devez traiter l'ID de périphérique comme un nom d'utilisateur. Il s'agit d'une identification et non d'une authentification. Je vous suggère à l'utilisateur de choisir un mot de passe, ou mieux encore générer un code aléatoire automatiquement, pour aller avec elle - puis envoyer l'appareil ID + ce mot de passe/code pour enregistrer l'appareil tout d'abord, puis par la suite pour authentifier l'appareil.

Vous pouvez également parier que certains utilisateurs auront plus d'un appareil - soit ils remplaceront un terme, ou vous obtiendrez quelqu'un comme Stephen Fry qui se promène avec 4 iphones. Pour faire face à cela, je suggère que vous cherchiez un moyen d'instancier reposful_authentication deux fois, une fois pour l'authentification des utilisateurs, et une seconde fois pour l'authentification des périphériques. Je n'ai pas utilisé ce plugin mais je suppose que vous avez juste besoin d'utiliser différents paramètres de table pour que cela se produise. Ensuite, dans votre logique d'application, les utilisateurs peuvent associer plusieurs appareils à leur compte. Pour ce faire en toute sécurité, faites-le à partir de l'appareil ou demandez à l'appareil d'afficher un code aléatoire qu'il saisira ensuite dans l'application Web pour prouver qu'il est propriétaire de l'appareil (cela semble plus douloureux qu'il ne l'est - il en est de même processus que l'utilisation de la pomme dans itunes, apple TV et l'application à distance - regardez comment ils le font - il ne sera pas surprenant pour les utilisateurs). (Assurez-vous également que lorsque vous générez des mots de passe aléatoires, vous utilisez un générateur de nombres aléatoires cryptographiques - il existe probablement une API iPhone pour cela - sinon vos mots de passe peuvent être prévisibles).

+0

Merci Franks. Ce sont tous de bons conseils sur un système de sécurité pour autoriser les appareils. Cela ne répond pas tout à fait à ma question sur une technique de modification de restful_authentication. Je pense que vous soulevez d'excellents points cependant! –

+0

Eh bien, je vous suggère de ne pas modifier restful_authentication - repensez votre schéma afin de pouvoir utiliser deux instances différentes - une pour authentifier les périphériques et une autre pour identifier les utilisateurs. Plus la logique de l'application pour autoriser la liaison de périphériques N à un utilisateur. – frankodwyer

+0

Avez-vous des suggestions sur la façon de faire cela? –

0

Avez-vous essayé d'utiliser un autre schéma d'autorisation tel que Authlogic? J'ai trouvé reposful_authentication plutôt intrusif (bien que j'ai triché en utilisant bort).

+0

Oui, restful_authentication semble assez intrusif. Je vais jeter un oeil à Authlogic, bien que, j'ai trouvé une alternative temporaire en modifiant directement reposful_authentication (mais cela ne met pas à jour les mises à jour de celui-ci). –

0

Générer un mot de passe aléatoire dans Rails link text J'utilise le plugin restful_authentication pour un de mes projets. Dans le cadre de mon flux de travail de création de l'utilisateur, le système devrait pour générer un mot de passe aléatoire pour le nouvel utilisateur.Que pensez-vous de l'utilisation de l'UDID et d'un mot de passe aléatoire généré à l'aide de l'UDID + un sel défini au niveau du site?

0

Quelque chose comme:

salt = 'afG553Dvbf3' 

udid = '1234567890' 
pass = Digest::MD5.hexdigest(udid + salt) 

et envoyer ce mot de passe à l'iPhone pour la prochaine fois qu'il se connecte.

Questions connexes