Web Widgets !

avec WS, CAS, JSONP

Pascal.Rigaux @ univ-paris1.fr

Réutilisation de code

Les classiques :

  • bibliothèques de code
  • frameworks
  • web services
  • jquery widgets

Combinaison intéressante :

Web Widgets s'appuyant sur des web-services

Exemple : chercher une personne

Idée : transformer un bête <input> en autocomplétion

Utilisé à Paris1 :

  • annuaire
  • sympa
  • grouper lite
  • uportal3 "user switch"
  • esup-agent "gestion"
  • g2t

Exemple : chercher une personne

Web Service

  • en PHP s'appuyant sur LDAP
  • limite le nombre de réponses
  • accès anonyme ou CASifié
    (pour les personnes en liste rouge)
  • jsonp compatible

Javascript

jquery-ui autocomplete

Exemple : bandeau-ENT

Idée :

  • alternative à l'intégration iframe,
  • l'application intègre le web widget "bandeau-ENT"

Facile à intégrer :


<script>  
  window.bandeau_ENT = { current: "nuxeo" };  
</script>  
<script src="https://bandeau-ENT.univ-paris1.fr/bandeau-ENT-loader.js"></script>

bandeau-ENT : comparaison uportal

Avantages

  • asynchrone, donc pas de SPOF
  • n'interfère pas avec la mise en onglet
  • fonctionne en http, en cross-domain
  • les applis restent maitre de leur viewport (mobile)
  • pour les applications javascript, moins d'inconvénients que l'iframe

Inconvénients

  • une seul application par page (pas de dashboard)
  • nécessite parfois des ajustements CSS pour les applications full-page
  • bypass les stats esup-uportal
  • les URLs sont visibles

bandeau-ENT : technologie

  • JSONP avec auth CAS + authorisation sur attrs LDAP
    ou JSONP avec auth shib avec proxy dans l'application
  • cache dans localStorage pour fonctionner sans cookie

XHR, CORS, JSONP

GET POST DELETE,
PUT
Cross domain Cookies Error handling HTTP header
XHR X X X X X X
CORS X X X controlé limité X X
JSONP X X X partiel
<form> + hidden iframe oui,
aveugle
oui,
aveugle
X X ?

XHR, CORS, JSONP

Précisions

CORS
  • bien répandu (IE >= 8)
  • limité : impossible d'avoir cookies + redirect

JSONP

  • possibilité de contrôler partiellement le cross-domain en vérifiant le referer

<form> + hidden iframe

  • impossible de lire le résultat des requêtes GET/POST

JSONP vs Ajax

REST/JSON

Requête Ajax http://foo.fr/bar qui renvoie

{ "Name": "Foo", "Id": 1234 }

JSONP

Balise script src=http://foo.fr/bar?callback=f qui renvoie

f({ "Name": "Foo", "Id": 1234 })

Pour faire du JSONP en PHP, on remplace

echo $data
par

echo $_GET['callback'] . '(' . $data . ');';

JSONP

Avec un web-service compatible JSONP, on peut l'utiliser de la même manière que XHR tout en étant cross-domain.

⚠ Autoriser JSONP ouvre le web-service à des vols de données par XSS.

⚠ Pour éviter les attaques CSRF, le web-service doit respecter la norme HTTP : GET ne doit pas faire d'effet de bord.

Safari refuse les cookies des sites non visités. Cela concerne uniquement les sites externes. Si besoin, le web-service peut contourner le problème en utilisant sessionStorage.

JSONP & CAS

Si cookie CAS dans le navigateur,
possibilité d'autolog requête JSONP : NB : CAS gateway est recommandée pour la gestion d'erreur

Web-service cross-domain sécurisé

  • pour /login : utiliser JSONP / window.open+postMessage
  • pour les autres urls: utiliser CORS pour limiter les sites utilisateurs du web-widget
  • respecter la norme HTTP : GET ne doit pas faire d'effet de bord.
  • protéger POST avec un token passé en header HTTP : si le token manque, le WS renvoie un nouveau token, il suffit de rejouer la requête.