web-dev-qa-db-fra.com

Laravel Sanctum auth: middleware sanctum avec Angular Réponse non authentifiée SPA

J'ai une application qui a la configuration suivante:

Laravel

Hôte: appname.local: 8000

Variables d'environnement:

  • SESSION_DRIVER = base de données
  • SESSION_LIFETIME = 480
  • SESSION_CONNECTION = mysql
  • SESSION_DOMAIN = .nomapp.local
  • SESSION_SECURE_COOKIE = faux
  • SESSION_COOKIE = appnameapi_session
  • SANCTUM_STATEFUL_DOMAINS = '. Appname.local, localhost, 127.0.0.1'

Angulaire

Hôte: appname.local: 4200

Ce qui fonctionne actuellement:

  • Je peux appeler le point de terminaison csrf-cookie de Sanctum qui définit le jeton CSRF dans mon navigateur.
  • Je peux alors appeler le point de terminaison de connexion de mon API pour authentifier l'utilisateur dans mon Laravel app en utilisant Auth :: try (). Cela crée une nouvelle entrée dans le tableau des sessions comme indiqué ci-dessous.

Méthodes angulaires pour obtenir un jeton et authentifier l'utilisateurAngular methods to get token and login

Entrée de la base de données de session après une authentification réussieSession database entry after successful authentication

Ce qui ne fonctionne pas:

Les requêtes ultérieures adressées aux routes protégées par le middleware suivant: auth: sanctum aboutissent toutes à des réponses non authentifiées. Les requêtes HTTP ne parviennent jamais à mes contrôleurs.

auth: routes protégées sanctumauth:sanctum protected routes

Mais je peux voir dans la console du développeur que les cookies sont envoyés. Donc je ne comprends pas pourquoi Sanctum ne prend pas l'authentification enter image description here

J'ai suivi plusieurs tutoriels et je n'arrive pas à comprendre pourquoi le middleware Authenticate de Laravel est incapable de voir que j'ai déjà authentifié mon utilisateur.

Est-ce que quelqu'un sait ce que je pourrais faire de mal?

2
Gloire

Je pense qu'Eden a raison. Je visite cette question pour des raisons indépendantes, mais pour prendre en charge les sous-domaines, vous pouvez avoir un point dans SESSION_DOMAIN variable env, mais jamais SANCTUM_STATEFUL_DOMAINS.

Voici une configuration d'environnement valide pour le local et la production:

./. env

# localhost
SANCTUM_STATEFUL_DOMAINS="angular-site.test"
SESSION_DOMAIN=".angular-site.test"

# production
# SANCTUM_STATEFUL_DOMAINS="hockeysticks.net"
# SESSION_DOMAIN=".hockeysticks.net"

Cela permettra aux cookies de fonctionner sur plusieurs sous-domaines tels que auth.hockeysticks.net, product.hockeysticks.net, service.hockeysticks.net, et api.hockeysticks.net.

Si une personne met le point dans SESSION_DOMAIN, les cookies fonctionneront toujours s'il n'y a pas de sous-domaines, mais il devrait être théoriquement plus sûr de l'omettre dans ce cas.

Voici une vidéo de Mohamed Said, développeur chez Laravel, parlant de Sanctum: https://www.youtube.com/watch?v=Kd3hcrxtTHA . Dans celui-ci, il parcourt la logique d'authentification.

1
agm1984

J'ai eu le même problème. J'ai trouvé que l'API sanctum SPA fonctionne correctement si la demande est faite à partir d'une application non définie sur un port no.

vous pouvez héberger votre application frontale sur

appname.local

au lieu de appname.local: 4200

0
varun sharma