2017-09-29 4 views
0

Je travaille sur la connexion à un site django avec un facteur. En utilisant Charles, je peux voir qu'un jeton csrfmiddlewaretoken est créé d'une manière ou d'une autre.Comment construire csrfmiddlewaretoken à partir d'un csrftoken donné en utilisant javascript?

Étant donné

csrftoken=JDmmXqnLK35WCLha1PVOhFWITaKZs9eeAWBfuqXUxZEt3yDHmNoOyzMyJUQF5aQd 

le csrfmiddlewaretoken envoyé a été

v3I6Io9H8OoZcp4ATyszhAepdQAEp617mmXZfoJQVKXwDcq7ewVzyu4f3AGk27D6 

peut v3I6Io9H8OoZcp4ATyszhAepdQAEp617mmXZfoJQVKXwDcq7ewVzyu4f3AGk27D6 être construit à partir
JDmmXqnLK35WCLha1PVOhFWITaKZs9eeAWBfuqXUxZEt3yDHmNoOyzMyJUQF5aQd en utilisant javascript?

+0

Que voulez-vous atteindre avec construire le jeton csrf en Javascript? – Swapnil

+0

La seule chose qui est différente de ce qui fonctionne et ce qui échoue de ce que je peux voir est de fournir csrfmiddlewaretoken. Utiliser un navigateur et charles csrfmiddlewaretoken est présent dans les appels http. Je cherche à créer csrfmiddlewaretoken à envoyer avec une demande de poste de facteur et, espérons-le, se connecter au système. –

+0

En posant la question, j'ai eu l'idée que le site pourrait le générer ... et c'était le cas! –

Répondre

0

La clé de cette question a été de comprendre où csrfmiddlewaretoken venait. Je pensais qu'il a été construit en quelque sorte à partir de csrftoken. J'ai réalisé qu'il devait être une variable cachée fournie par le serveur.

Le problème est alors devenu de savoir comment extraire la valeur csrfmiddlewaretoken de l'appel get initial à login. Note Postman utilise maintenant Cheerio ayant abandonné jQuery. En utilisant le jetpack postman dans l'appel get, c'est le test que j'ai utilisé pour extraire la valeur d'entrée cachée.

tests["responseCode.code === 200"] = responseCode.code === 200 ; 
var csrftoken = postman.getResponseCookie("csrftoken").value ; 
tests['csrftoken: ' + csrftoken ] = csrftoken.length > 0 ; 
var html ; 
html = cheerio(responseBody) ; 
inputs = html.find('input') ; 
csrfmiddlewaretoken = '' ; 
postman.setEnvironmentVariable("csrfmiddlewaretoken", csrfmiddlewaretoken) ; 
for(var index = 0 ; index < inputs.length ; index++) { 
    var input = inputs[index] ; 
    if (input.attribs.name === 'csrfmiddlewaretoken') { 
     csrfmiddlewaretoken = input.attribs.value ; 
     postman.setEnvironmentVariable("csrfmiddlewaretoken", csrfmiddlewaretoken) ; 
    } 
} 
tests['csrfmiddlewaretoken: ' + csrfmiddlewaretoken ] = csrfmiddlewaretoken.length > 0 ; 

puis dans l'appel de poste pour se connecter réellement.

J'ai dû ajouter un en-tête Referer conformément à la politique de sécurité des sites.

Content-Type:application/x-www-form-urlencoded 
Referer:{{referer}} 

La forme des valeurs

csrfmiddlewaretoken:{{csrfmiddlewaretoken}} 
username:{{username}} 
password:{{password}} 
next:{{next}} 

puis sur l'envoi de l'appel après le script postier connecté avec succès dans

pm.test("Status code is 200", function() { 
    pm.response.to.have.status(200); 
}); 

:-)

0

Afin d'obtenir le CSRF jeton juste pour se connecter via postier, vous pouvez faire deux choses:

  1. Soit utiliser les outils de développement et obtenir le jeton middleware csrf en examinant votre formulaire et recherche caché Champ de saisie csrfmiddleware. (Cela fonctionnera en cas de rendu côté serveur)

  2. Récupère le jeton csrf du cookie. Voici un utilitaire JQuery que les docs Django ont mentionné here

    function getCookie(name) { 
        var cookieValue = null; 
        if (document.cookie && document.cookie !== '') { 
         var cookies = document.cookie.split(';'); 
         for (var i = 0; i < cookies.length; i++) { 
          var cookie = jQuery.trim(cookies[i]); 
          // Does this cookie string begin with the name we want? 
          if (cookie.substring(0, name.length + 1) === (name + '=')) { 
           cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
           break; 
          } 
         } 
        } 
        return cookieValue; 
    } 
    var csrftoken = getCookie('csrftoken'); 
    

Une fois que vous obtenez le jeton CSRF, il suffit d'ajouter un en-tête à votre demande POSTMAN avec la clé X-CSRFToken et la valeur que le jeton CSRF.

Espérons que cela est utile :)

+0

J'ai déjà essayé mais merci! –

+0

Cela n'a pas fonctionné pour vous? – Swapnil

+0

Non. J'ai trouvé une solution. Je l'afficherai une fois que je l'aurai travaillé. –