web-dev-qa-db-fra.com

Authentifié REST demande de devenir utilisateur anonyme

Je suis nouveau dans les services et les modules rest_server (et les API RESTful au total.) Si je comprends bien, les étapes sont essentiellement les suivantes:

  1. Envoyez une demande de publication à/api/user/login avec le nom d'utilisateur et le mot de passe définis dans les données
  2. Stockez le jeton que vous obtenez dans la réponse
  3. Lors des demandes de publication suivantes, ajoutez le jeton à l'en-tête avec la clé X-CSRF-TOKEN

Lorsque j'utilise l'extension Postman Chrome pour ce faire, cela fonctionne très bien. Lorsque je le fais en code, il fonctionne bien api/user/login, j'obtiens le jeton, mais accès/api/autre/point de terminaison, j'obtiens 403 Accès refusé pour l'erreur anonyme de l'utilisateur.

La première requête (/ user/login) ressemble à ceci:

POST /api/user/login HTTP/1.0
Content-Type: application/json
Accept: application/json
User-Agent: Drupal (+http://drupal.org/)
Host: mysiteurl.com
Content-Length: 41

{"username":"NAME","password":"PASSWORD"}

Et la deuxième requête (/ other/endpoint) ressemble à ceci:

POST /api/other/endpoint HTTP/1.0
Content-Type: application/json
Accept: application/json
X-CSRF-TOKEN: vGJm5GNDGumf-SoHnLsBU6d46EkrOZkvUY0CSa08GA0
User-Agent: Drupal (+http://drupal.org/)
Host: mysiteurl.com
Content-Length: 0

Si je fais des demandes à/user/token après l'authentification, j'obtiens de nouveaux jetons à chaque fois. Si j'essaie de me déconnecter immédiatement après la connexion (et d'envoyer ce jeton), j'obtiens le message "406 Not Acceptable: l'utilisateur n'est pas connecté". Erreur. il me dit que l'utilisateur n'est pas connecté.

Si je vérifie le site, il montre que l'utilisateur s'est connecté avec succès et qu'il est toujours connecté après coup.

Dois-je enregistrer/envoyer quoi que ce soit concernant le nom/l'identifiant de session ou le cookie? Tout ce que j'ai regardé suggère que seul le jeton de session est nécessaire.

7
UnsettlingTrend

(Répondre à ma propre question et essayer de ressembler à un tiers pour que cela ait plus de sens lors de la lecture ...)

Il semble que cela ait définitivement quelque chose à voir avec la session/cookie/etc., car les appels ultérieurs semblent provenir d'un client différent (du point de vue du serveur REST.) Je suppose que nu PHP n'a aucun moyen de maintenir ce cookie, comme le ferait un navigateur. Après avoir regardé ici , il semble que le cookie doit être formaté comme tel dans l'en-tête de la demande:

Cookie: session_name=sessid

(Le cookie peut également être récupéré à partir de la variable headers-> set_cookie de la réponse. Cette dernière inclura également toutes les informations d'expiration/lien dans la chaîne. Bien que l'une ou l'autre méthode semble fonctionner, je ne suis pas sûr qu'il y ait des erreurs effets de l'un ou de l'autre. Je viens d'utiliser la première méthode car c'est la première solution que j'ai rencontrée.)

Session_name et sessid peuvent être extraits de la zone de données de la réponse après une demande d'utilisateur/de connexion. Donc, la demande ressemblerait finalement à ceci pour un utilisateur/déconnexion

POST /api/user/logout HTTP/1.0
Content-Type: application/json
Accept: application/json
X-CSRF-Token: igHUQD11Y8LYdyzHi8m5t33U_tCVZNHE6BbptE4mrwQ
Cookie: SESSd3a1acd26f95229c67cd0a9a1e455bd4=rv-Kbyb8znaGlYBBU5Dn7M2GzkYdWnun5aXcVYLVfvY
User-Agent: Drupal (+http://drupal.org/)
Host: mysiteurl.com
Content-Length: 0
2
UnsettlingTrend

A eu ce même problème avant lorsque vous essayez de vous connecter ou d'obtenir le jeton X-CSRF (/ services/session/token) via l'api, il change simplement le jeton à chaque fois lors de l'actualisation ou sur demande. Ma solution est celle de définir avecCredentials sur true avant de poster la demande. Après l'avoir défini, la page peut maintenant lire le cookie de session

Exemple xhr.withCredentials = true;

ou dans mon cas en utilisant Vue

Vue.http.interceptors.Push((request, next) => {
    request.credentials = true;
    next();
});
0
Jry