2017-03-05 1 views
0

C'est correct d'utiliser body-parser + expressjs. Mais mon problème est: comment puis-je obtenir le tampon du corps de la requête brute dans Hapijs?Comment puis-je obtenir le tampon du corps de la requête brute dans Hapijs?

La chose que je parle à est comme le buf param dans cette fonction du paquet de NPM corps-analyseur: verify(req,res, buf, encoding)

J'ai besoin pour cette fonction dans messenger-platform-samples exemple:

function verifyRequestSignature(req, res, buf) { 
    var signature = req.headers["x-hub-signature"]; 
    if (!signature) { 
    console.error("Couldn't validate the signature."); 
    } else { 
    var elements = signature.split('='); 
    var method = elements[0]; 
    var signatureHash = elements[1]; 
    var expectedHash = crypto.createHmac('sha1', APP_SECRET) 
          .update(buf) 
          .digest('hex'); 
    if (signatureHash != expectedHash) { 
     throw new Error("Couldn't validate the request signature."); 
    } 
    } 
} 

EDIT: Je dois utiliser ceci dans mon middle ware en utilisant server.ext(), comme ceci:

Répondre

4

En [email protected]:

Voici comment vous pouvez obtenir le tampon brut et les en-têtes brutes:

'use strict'; 

const Hapi = require('hapi'); 

const server = new Hapi.Server(); 
server.connection({ 
    host: 'localhost', 
    port: 8000 
}); 

server.route({ 
    method: 'POST', 
    path:'/', 
    handler: function (request, reply) { 
     console.log(request.payload); 
     console.log(request.raw.req.headers); 
     return reply('hello world'); 
    }, 
    config: { 
     payload: { 
      output: 'data', 
      parse: false 
     } 
    } 
}); 

server.start((err) => { 
    if (err) throw err; 
    console.log('Server running at:', server.info.uri); 
}); 

exemple Exécution:

$ curl -X POST 'http://localhost:8000/' -d name=nehaljwani --trace-ascii /dev/stdout 
Note: Unnecessary use of -X or --request, POST is already inferred. 
== Info: Trying 127.0.0.1... 
== Info: TCP_NODELAY set 
== Info: Connected to localhost (127.0.0.1) port 8000 (#0) 
=> Send header, 148 bytes (0x94) 
0000: POST/HTTP/1.1 
0011: Host: localhost:8000 
0027: User-Agent: curl/7.51.0 
0040: Accept: */* 
004d: Content-Length: 15 
0061: Content-Type: application/x-www-form-urlencoded 
0092: 
=> Send data, 15 bytes (0xf) 
0000: name=nehaljwani 
== Info: upload completely sent off: 15 out of 15 bytes 
<= Recv header, 17 bytes (0x11) 
0000: HTTP/1.1 200 OK 
<= Recv header, 40 bytes (0x28) 
0000: content-type: text/html; charset=utf-8 
<= Recv header, 25 bytes (0x19) 
0000: cache-control: no-cache 
<= Recv header, 20 bytes (0x14) 
0000: content-length: 11 
<= Recv header, 23 bytes (0x17) 
0000: vary: accept-encoding 
<= Recv header, 37 bytes (0x25) 
0000: Date: Sun, 05 Mar 2017 07:51:14 GMT 
<= Recv header, 24 bytes (0x18) 
0000: Connection: keep-alive 
<= Recv header, 2 bytes (0x2) 
0000: 
<= Recv data, 11 bytes (0xb) 
0000: hello world 
== Info: Curl_http_done: called premature == 0 
== Info: Connection #0 to host localhost left intact 
hello world 

sortie du serveur:

Server running at: http://localhost:8000 
<Buffer 6e 61 6d 65 3d 6e 65 68 61 6c 6a 77 61 6e 69> 
{ host: 'localhost:8000', 
    'user-agent': 'curl/7.51.0', 
    accept: '*/*', 
    'content-length': '15', 
    'content-type': 'application/x-www-form-urlencoded' } 

Pour accéder au tampon brut, vous devrez le déplacer à route-prequisites. Donc la configuration de la route ressemblera à quelque chose comme:

config: { 
    pre: [ 
     { 
      method: (request, reply) => { 
       //signature verification steps 
       return reply.continue(); 
      } 
     } 
    ], 
    payload: { 
     output: 'data', 
     parse: false 
    } 
} 
+0

Merci beaucoup. Mais dans mon gestionnaire, je dois utiliser 'request.payload', alors je dois l'analyser moi-même? –

+1

@TrieuDang Malheureusement, oui. Parce que si vous définissez parse à vrai, alors je ne pouvais trouver aucun moyen d'aller chercher le tampon brut. Il semble être englouti :) –

+0

Mais il y a un autre problème maintenant, que je veux utiliser ce tampon dans un middleware, pas un gestionnaire. J'utilise 'server.ext()' pour définir mon middleware, alors comment puis-je obtenir ce buffer? –