Mettre en œuvre une authentification OAuth 2.0 avec un Laravel API
Je suis actuellement à la construction d'une application web qui est un AngularJS frontend qui communique avec une API RESTful construit à l'aide de Laravel. Je suis en train de faire de bons progrès, mais trouver qu'il est difficile d'obtenir ma tête autour de la façon de gérer l'authentification utilisateur.
J'ai été informé que je devrais être en utilisant OAuth pour l'authentification, et j'ai décidé de l'utiliser vu que ça pourrait être une expérience d'apprentissage pour moi. Le paquet que j'utilise pour gérer cela est oauth2-serveur-laravel.
La base de l'utilisateur de l'histoire est que les utilisateurs peuvent enregistrer leur nom d'utilisateur/mot de passe pour l'application et vous connecter à l'application avec le même nom d'utilisateur et mot de passe. Ils ne sont authentifiés par leur nom d'utilisateur et le mot de passe, et pas par n'importe quel client secret. Après la connexion, ils doivent être donné un jeton d'accès qui vous sera envoyé avec chaque demande de s'authentifier sur les différentes API des points de terminaison.
La OAuth2 la bibliothèque dispose d'un "flux de mots de passe" type de subvention qui semble être ce dont j'ai besoin, mais il prend également client_id
et client_secret
paramètres, que je ne veux pas. L'URI de la demande est quelque chose comme ceci:
POST https://www.example.com/oauth/access_token?
grant_type=password&
client_id=the_client_id&
client_secret=the_client_secret&
username=the_username&
password=the_password&
scope=scope1,scope2&
state=123456789
Mais ce que je veux, c'est juste:
POST https://www.example.com/oauth/access_token?
grant_type=password&
username=the_username&
password=the_password
Comment suis-je censé fournir un numéro de client et le secret de l'utilisateur qui n'a pas encore authentifier?
Est là une autre subvention que j'ai peut-être l'aide, ou est ce que je veux réaliser tout simplement pas adapté pour OAuth?
OriginalL'auteur John Dorean | 2014-06-08
Vous devez vous connecter pour publier un commentaire.
Prendre en compte, que
client id
etclient secret
ne sont pas les paramètres que vous avez à la force de votre utilisateur final à passer. Ils sont statiques et définie dans/pour votre application cliente (angulaire de l'application dans ce cas).Tout ce que vous devez faire est de créer un dossier pour votre application principale dans
oauth_clients
table, et de créer un champ avec un accès complet àoauth_scopes
table, et envoyer ces valeurs lors de la demande de jeton.Et c'est tout en fait.
Aussi, vous pouvez envisager d'utiliser de reconnaissance implicite de l'écoulement dans le cas de la construction de js seule application, étant donné que le stockage de secrets du client et de l'actualisation de la marque dans un js app est précaire. À l'aide de la reconnaissance implicite dans un produit final peut ressembler à la fenêtre de connexion sur soundcloud et est plus sécurisé que le jeton est obtenu à côté serveur sans exposer les secrets du client.
Une autre façon d'aller, si vous voulez continuer à utiliser les flux de mots de passe est de créer un proxy pour l'actualisation des jetons. La procuration peut masquer votre jeton d'actualisation dans chiffrés http seule cookie, et votre js-app ne demandez pas à vos api pour les nouveaux jeton, mais le proxy. Proxy lit d'actualisation jeton de cookie crypté, demande à l'api pour les nouveaux jeton et le renvoie. Si le jeton d'actualisation n'est jamais exposé. Si vous définissez jeton de durée de vie pour une heure, disons-le, puis de voler un jeton serait assez "inutile*" dans le cas d'une application normale, et le vol d'actualisation jeton serait "impossible*".
*Bien sûr, si quelqu'un veux vraiment il aurait probablement pu le pirater aucune façon.
Et ouais, je sais que cela semble un peu hacky - modal windows pour la connexion, proxy etc. Mais aussi de la recherche sur ce sujet, je ne pouvais pas trouver mieux et de façon plus élégante de le faire. Je pense que c'est un manque que tous les js-apps ont à traiter si vous voulez un jeton d'authentification.
OriginalL'auteur plunntic iam
Il vous manque quelque chose avec OAuth au cahier des charges. Le
client_id
etclient_secret
sont vraiment important quand vous demandez un jeton d'accès lors de l'utilisation de la méthode par mots de passe de l'authentification OAuth v2. En fait, ils sont importants pour chaque méthode qui vous donne un jeton d'accès. Ils permettent d'identifier l'application ou le serveur qui a effectuer la demande.Par exemple, disons que vous avez votre API, 2 applications mobiles et sur un autre serveur que certaines tâches avec votre API. Vous allez créer 3 clients avec leurs propres
client_id
etclient_secret
. Si votre application a différents niveaux d'accès (ils sont appelésscopes
dans OAuth, v2), laclient_id
correspondant à l'autre serveur sera en mesure d'appeler des fonctions de votre API qui nécessitent la portéeadmin
alors que votre application mobile ne sera en mesure d'appeler des fonctions de votre API qui nécessitent labasic
portée si vous avez défini des étendues comme ça.Si votre API grandit dans l'avenir, c'est vraiment essentiel. Un autre exemple, imaginons que vous ayez donné une clé API (une paire
client_id
etclient_secret
) à l'un de vos ami et il a une belle application mobile avec votre API. Si un jour, il commence à faire des choses coquines avec votre API, vous ne pouvez pas arrêter de lui très facilement. Alors que vous pourriez avoir tout enlevé sa paire de clés si vous aviez suivi le protocole OAuth v2 principes.OAuth v2 n'est pas une chose facile à comprendre, prendre le temps de lire les spécifications et les bons tutoriels avant de développer votre API.
Quelques liens utiles :
OriginalL'auteur Antoine Augusti
Juste pour ajouter un peu de plunntic excellente réponse: n'oubliez pas de "client" n'est pas liée à "l'utilisateur", donc quand j'utilise un flux de mots de passe je viens de définir le client_id et client_secret comme constantes sur l'application AngularJS pour raconter l'api backend: hey, c'est l'application navigateur, qui est utilisé pour demander un jeton.
Grâce jezmck. J'ai mis à jour le lien. Le post est assez vieux maintenant et il y a eu des développements importants comme le Passeport pour en faire un beaucoup plus facile.
OriginalL'auteur Jannie Theunissen