2017-06-25 4 views
1

Généralement, OAuth dans Rails est géré par OmniAuth, directement utilisé ou avec Devise. Cependant, cela ne semble pas fonctionner dans un backend API uniquement; OmniAuth s'appuie sur des cookies et possède son propre middleware (opaque), alors que les cookies ne sont pas très intéressants avec les clients natifs. C'est pourquoi je cherche un moyen de faire OAuth sans cookies. J'essaye de construire un site Web avec l'interface et le backend séparés; le flux de travail OAuth par page Web, dans mon esprit, estOAuth dans Rails sans cookies?

  1. utilisateur clique sur un bouton à mon frontend, lié au fournisseur de OAuth, avec un rappel à mon frontend.
  2. L'utilisateur s'authentifie et autorise sur la page du fournisseur, et est redirigé vers mon interface avec des informations d'identification.
  3. Mon frontend attrape le jeton de la chaîne de requête, et les envoie au serveur pour se connecter ou enregistrer un nouveau compte, comme AJAX. Le serveur vérifie et enregistre le jeton avant de répondre avec un identificateur de session.
  4. AJAX à venir de frontend a l'identifiant de session attaché, soit dans un en-tête ou dans une chaîne de requête.

Je pense que je sais comment faire cela à partir de zéro; En fait, j'ai déjà créé un magasin de sessions Redis qui ignore les cookies, et l'identificateur de session est extrait de l'en-tête Authorization. (Non, JWT n'est pas la solution car elle ne peut pas être révoquée facilement.) Mais je veux quand même savoir s'il y a une solution prête à l'emploi, ou si Devise ou OmniAuth couvre déjà le serveur cookie. FWIW, je suis sur macOS Sierra, toutes les dernières versions de gem.

Répondre

0

Je pense que vous pouvez fournir un stockage de session différent pour omniauth: https://github.com/omniauth/omniauth#integrating-omniauth-into-your-rails-api

Vous pouvez également désactiver les sessions à base de cookies sur concevoir, ou simplement outrepasser connexion/déconnexion avec votre propre flux.

Et vous pouvez rouler votre propre débit, vous pouvez vérifier certaines stratégies omniauth pour voir comment vous pouvez le faire pour chaque fournisseur. Il s'agit essentiellement de rediriger les URLs avec certains paramètres jusqu'à ce que vous obteniez le jeton. Sur ce que je suis en train de développer, j'utilise essentiellement omniauth pour me connecter via Oauth2, et concevoir pour la connexion par e-mail. Avec omniauth, j'utilise le hachage de réponse pour créer ma propre session et je détourne fondamentalement le sign_in pour log_in avec ma propre "méthode". Ensuite, je compte sur cette même session tout au long de l'expérience utilisateur.

Je ne sais pas comment vous pourriez le faire en termes d'API, mais aussi longtemps que vous pouvez vérifier le flux OAuth est allé correctement et vous avez leur e-mail puis faire tout ce que vous voulez régulièrement faire pour les garder connecté.