7 votes

Comment émuler une requête curl en utilisant le module node-fetch

J'ai une application de commerce électronique et j'essaie d'accéder à l'api de repos de paypal, le service "paypal pour les partenaires" en particulier, j'ai lu l'avis de la Commission européenne. Documentation Paypal et c'est tout bon mais le problème est qu'ils ont mentionné l'exemple de requête utilisant curl comme ceci :

curl -v https://api.sandbox.paypal.com/v1/oauth2/token \
   -H "Accept: application/json" \
   -H "Accept-Language: en_US" \
   -u "client_id:secret" \
   -d "grant_type=client_credentials"

Ou

en utilisant postman avec une authentification de base :

  • Nom d'utilisateur : Votre identifiant client.

  • Mot de passe : Votre secret.

j'essaie d'implémenter la même chose mais en utilisant node-fetch depuis node.js

const fetch = require('node-fetch');

function authenticatePaypal() {
    fetch('https://api.sandbox.paypal.com/v1/oauth2/token', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'Accept-Language': 'en_US',
            'client_id': 'secret'
        },
        body: {
            "grant_type": "client_credentials"
        }
    }).then(reply => {
        console.log('success');
        console.log(reply);
    }).catch(err => {
        console.log('error');
        console.log(err);
    });
}

module.exports = {
    authenticatePaypal: authenticatePaypal
};

et j'obtiens cette réponse de 401 Unauthorized :

Response {
  size: 0,
  timeout: 0,
  [Symbol(Body internals)]:
   { body:
      PassThrough {
        _readableState: [ReadableState],
        readable: true,
        _events: [Object],
        _eventsCount: 2,
        _maxListeners: undefined,
        _writableState: [WritableState],
        writable: false,
        allowHalfOpen: true,
        _transformState: [Object] },
     disturbed: false,
     error: null },
  [Symbol(Response internals)]:
   { url: 'https://api.sandbox.paypal.com/v1/oauth2/token',
     status: 401,
     statusText: 'Unauthorized',
     headers: Headers { [Symbol(map)]: [Object] } } }

J'ai essayé postman et cela a fonctionné dans postman, je sais qu'il y a quelque chose qui ne va pas dans mon implémentation de node-fetch, c'est la première fois que je m'occupe d'Auth basique au format json.

3voto

karoluS Points 393

L'en-tête d'autorisation est erronée.

-u "client_id:secret"

dit que curl utilise un Authentification de base .

Vous devez ajouter l'en-tête d'autorisation

Authorization: Basic <base64 encoded "client_id:secret">

1voto

1911z Points 868

Solution utilisant la vôtre comme base, puisque j'ai lutté quelques minutes pour la faire fonctionner.

// get the client_id and secret from https://developer.paypal.com/developer/applications/
const clientIdAndSecret = <client_id:secret>
const base64 = Buffer.from(clientIdAndSecret).toString('base64')

fetch('https://api.sandbox.paypal.com/v1/oauth2/token', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Accept-Language': 'en_US',
        'Accept': 'application/json',
        'Authorization': `Basic ${base64}`,
      },
      body: 'grant_type=client_credentials'
})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X