Activer le support JSONP avec Express

Activer le support JSONP avec Express

Si vos services webs sont destinés à être appelés depuis d’autres domaines dans un browser web, il sera nécessaire d’activer le support du JSON Padding pour vos services REST JSON.

Le support du JSON Padding selon le serveur utilisé est très variable. Côté node.JS avec Express, la fonctionnalité est très bien supportée, mais n’est pas activée par défaut. Il faut donc l’activer dans la configuration de votre serveur.

Malheureusement, il faut chercher un peu pour trouver comment faire. Voici donc pour vous faire gagner un peu de temps comment configurer votre serveur:

    app.set 'jsonp callback name', 'callback'

La configuration de la clé: ‘jsonp callback name’ permet de spécifier le nom du paramètre de queryString qui correspondra au callback encapsulant le JSON de retour. Dans notre cas, ici, la variable s’appellera: ‘callback’.

Un appel sans callback donnera le résultat suivant:

akinsella@~$ curl http://localhost:8000/api/v1/conferences
[
  {
    "id": 12,
    "backgroundUrl": "http://blog.xebia.fr/images/devoxxuk-2014-background.png",
    "logoUrl": "http://blog.xebia.fr/images/devoxxuk-2014-logo.png",
    "iconUrl": "http://blog.xebia.fr/images/devoxxuk-2014-icon.png",
    "from": "2014-06-12",
    "name": "DevoxxUK 2014",
    "description": "The Devoxx UK annual event.",
    "location": "Business Design Center",
    "enabled": true,
    "to": "2014-06-13"
  }, ...]

Les en-têtes spécifieront un Content-Type de type ‘application/json’:

akinsella@~$ curl -I http://localhost:8000/api/v1/conferences              
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 4397
Date: Sat, 14 Jun 2014 14:11:36 GMT
Connection: keep-alive

Alors qu’en appellant des resources avec le paramètre de queryString: ‘callback’, le serveur générera des réponses avec un Content-Type de type ‘text/javascript’:

akinsella@~$ curl -I http://localhost:8000/api/v1/conferences\?callback\=cb
HTTP/1.1 200 OK
Content-Type: text/javascript; charset=utf-8
Content-Length: 4430
Date: Sat, 14 Jun 2014 13:56:03 GMT
Connection: keep-alive

Le contenu de la réponse sera le suivant:

akinsella@~$ curl http://localhost:8000/api/v1/conferences\?callback\=cb
typeof cb === 'function' && cb([
  {
    "id": 12,
    "backgroundUrl": "http://blog.xebia.fr/images/devoxxuk-2014-background.png",
    "logoUrl": "http://blog.xebia.fr/images/devoxxuk-2014-logo.png",
    "iconUrl": "http://blog.xebia.fr/images/devoxxuk-2014-icon.png",
    "from": "2014-06-12",
    "name": "DevoxxUK 2014",
    "description": "The Devoxx UK annual event.",
    "location": "Business Design Center",
    "enabled": true,
    "to": "2014-06-13"
  }, ...]);

Cerise sur le gâteau, la génération du résultat est parfaitement gérée: la sortie obtenue intègre les best pratices de codage permettant d’éviter d’être vulnérable à certaines attaques XSS associées à l’utilisation du JSON Padding.

Leave a Reply