Rails de l'api et de l'application mobile native d'authentification
Je sais il y a beaucoup d'informations à ce sujet, mais je ne trouve pas que tout est à jour.
Je vois des sujets comme ce un sur les rails et android authentification mais je vois que TokenAuthenticatable
est maintenant retiré de concevoir.
Ma question est simple: est-il un bon moyen pour authentifier les utilisateurs de native Android et iPhone apps à l'aide de Rails 4? Quelqu'un sait-il de bons tutoriels ou des articles qui offrent une solution ?
Adam Waite Ajout d'un bounty:
Je viens d'ouvrir un 500 bounty sur cette question, parce que je ne peux pas trouver la bonne pratique pour l'authentification d'un utilisateur à partir d'une application iOS pour Rails de l'API n'importe où. C'est ce que j'envisage de faire, mais n'ont aucune idée de si c'est le cas ou pas?!:
Imaginons que nous avons un User
enregistrement. Un utilisateur a signé pour un compte qui a créé un User
enregistrement dans la base de données avec un email
colonne et un password_digest
colonne.
Lorsque l'utilisateur se connecte à l', je voudrais que l'utilisateur de rester authentifié sur l'application mobile jusqu'explicitement signature-out.
J'imagine que nous allons avoir besoin d'un jeton d'authentification. J'aurais peut-être créer un ApiKey l'enregistrement lorsque le User
est créé et qui ont enregistré une association sur le User
enregistrement.
Lorsque l'utilisateur se connecte/haut, la réponse contiendra une clé API (quelque chose comme SecureRandom.hex
) qui seront enregistrées dans l'iOS Trousseau et utilisé à toutes les demandes ultérieures à la vérification de l'utilisateur en le passant dans un en-tête et en vérifiant à l'aide de quelque chose comme:
before_filter :restrict_access
private
def restrict_access
authenticate_or_request_with_http_token do |token, options|
ApiKey.exists?(access_token: token)
end
Est-ce sécurisé? Dois-je être rafraîchissant le jeton à chaque requête et de l'inclure dans la réponse?
Ce que d'autres options s'offrent à moi? Ce qui ne les aime de Facebook, Twitter et Pinterest faire?
Je suis conscient de OAuth2.0, mais n'est-ce pas, pour l'octroi des applications externes?
Est-il un joyau qui gère tout ça?
Désolé, complètement savez pas ici.
500 à la meilleure réponse.
- J'ai enfin le succès de ma quête, j'ai maintenant un des Rails de backend, et l'application android la possibilité de s'inscrire, se connecter et se déconnecter, et pas besoin de se ré-authentifier à chaque fois. Je vais prendre l'exemple des trucs bientôt. Il fonctionne très bien mais je ne sais pas si c'est le cas ou pas, je ne suis pas bon à ça... Donc j'attends une réponse.
- Je pourrais faire la même chose sur iOS, mais, comme vous, n'ont aucune idée de si ça va être facile de pirater!
- Peut-être que ma réponse à cette autre question sera utile.
- Ce que je fais, c'est de modifier la génération du jeton dans ce github.com/danahartweg/authenticatable_rest_api app avec le apiauth gem Troy mentionné. L'app a toutes les étapes Ashitaka mentionné.
- pouvez-vous expliquer la façon dont vous le faire?
Vous devez vous connecter pour publier un commentaire.
Essentiel d'une solution à partir de mes recherches. N'hésitez pas à modifier, de corriger, d'invalider, etc.
Note le ApiAuth.authentique? la méthode et l'objet de la requête. La demande doit être signée avec un algorithme HMAC sur le client.
La création d'un utilisateur/enregistrement
Clé Api de modèle. Semblable à la clé api de modèle à #352 railscast seule différence est ApiAuth la génération de clés.
Modèle utilisateur.
Sur le côté client, la HMAC algorithme doit être utilisé pour signer des demandes.
Le code est:
[HMAC SHA1 de génération de la Clé et authentification] https://github.com/mgomes/api_auth
[Contrôleurs & Modèles] https://github.com/danahartweg/authenticatable_rest_api
J'ai eu ce problème, je suis un développeur d'API. Vous pourrait le faire à la dure avec des jetons et personnalisé autorisation, mais je vais vous dire ce que nous faisons avec notre application, qui sert des utilisateurs dans les six chiffres de la figure.
Au moins pour iOS, le dispositif de gérer les sessions pour vous, ce qui signifie que si un utilisateur sur une application iOS effectue une requête POST à
/users/sign_in
avec les paramètresl'appareil iOS va stocker la session pour vous, en toute sécurité et de façon persistante.
Maintenant, si vous voulez aller à la OAuth 2 route, j'ai fait de maintenir un joyau pour les rails 4 appelé OAuth 2 providable, à laquelle j'ai ajouté une super fonctionnalité qui vous permet de vous demandez à l'utilisateur de passer à travers la "autorisation" de l'écran, parce que, évidemment, si vous avez développé le logiciel, vous n'avez pas besoin de l'utilisateur de confirmer qu'il a confiance en vous.
Si vous décidez de l'utiliser OAuth 2, vous aurez besoin d'utiliser ce que l'on appel l'implicite jeton d'accès.
C'est la longue et très ennuyeux OAuth2 spec pour que
Les rails 4 projet peut être trouvé sur github
https://github.com/bwheeler96/devise-oauth2-provider-rails4
Si vous n'êtes pas sur rails 4, vous pouvez utiliser l'original gem
https://github.com/socialcast/devise_oauth2_providable
Par la manière, le gem a besoin de travail, donc si il y a quelqu'un lisant ce qui veut aider à l'améliorer, s'il vous plaît par tous les moyens de fourche ce référentiel
Vous êtes sur la bonne voie, mais le jeton de l'utilisateur doit uniquement être utilisés pour identifier l'utilisateur qui effectue la demande. Vous avez encore besoin d'un certain type d'authentification, puisque, comme vous spéculer avec l'évolution de l'jeton sur chaque demande, un pirate peut intercepter le flux de données, récupérer le jeton, puis "être" que de l'utilisateur dans les demandes ultérieures.
En changeant le jeton sur chaque demande, vous éliminez l'interception problème, mais une fois que quelqu'un a intercepté le jeton, ils peuvent ensuite exploiter davantage le système en continuant de les intercepter et même la modification de la réponse. Une solution à ce problème est l'utilisation de HMAC (qui est utilisé par Amazon Web Services). C'est un algorithme qui fournit une signature (hash) pour votre demande qui est unique pour chaque demande, ne nécessite pas un changement de clé, et ne peut pas être prévue pour les demandes futures.
Il y a un rubis gemme pour les rails qui implémente l'algorithme HMAC sur le côté serveur pour la signature HMAC demandes ainsi que de générer lors de serveur-à-serveur de communications. Pour les client-serveur de requêtes comme dans votre cas, vous avez besoin de générer la signature sur l'iOS ou Android de côté et de s'authentifier sur le serveur.
Envisager la ApiAuth joyau de faire le travail sur le côté serveur. Sur l'iOS côté client, examiner les HBHMAC bibliothèque de génération de la signature. Jetez un oeil à la ApiAuth spécifiques de mise en œuvre, car il ajoute un horodatage de données pour prévenir les attaques de relecture, de sorte que vous pouvez avoir besoin d'ajouter un champ à vos données avant de les passer à HBHMAC.
En résumé, à l'aide de l'authentification HMAC permettra d'éviter de l'homme dans le milieu attaques et les attaques replay en utilisant un algorithme de hachage qui empêche les attaquants de la génération authentique demandes, même si elles sont en mesure d'intercepter les requêtes valides.
Si vous souhaitez utiliser OAuth2.0 en ruby on rails, vous serait d'utiliser Portier, vous pouvez voir un exemple (pas gratuit) ici:
http://railscasts.com/episodes/353-oauth-with-doorkeeper
Mais vous pouvez utiliser un jeton avec SecureRandom.hex, un exemple (pas libre) pour ce qui est ici (au niveau 6):
https://www.codeschool.com/courses/surviving-apis-with-rails
J'espère que ma réponse vous aider!