Authentifier des utilisateurs Couchbase avec OpenID

Attention, pour les non techniciens, ça va piquer.

Donc, j’ai démarré récement une mission, dans laquelle je dois synchroniser une application mobile avec un serveur. le client comme le serveur utilise Couchbase, donc on va utiliser Sync Gateway. Sur le papier, ça paraît tout à fait raisonnable.

Là où ça l’est moins, c’est qu’on ne veut pas stocker de bases d’authentification (la CNIL, tout ça, c’est trop pénible). On va donc passer par de l’OpenID Connect (ce qui est conceputellement très cool). Et comme l’application est mobile-only, on va utiliser ce qu’ils appellent le flow implicite.

Il est assez bien décrit dans la doc de Couchbase Sync Gateway, et en particulier dans ce diagramme

images-003

Présenté comme ça, c’est simple. Mais en fait, c’est rempli de subtilités.

Un token, Quel token ?

D’abord, il faut obtenir le token JWT auprès de votre fournisseur.

Dans mon cas, c’était Auth0, donc un appel à /authorize avec les bons paramètres va renvoyer (via l’url de redirection) le token JWT. Pour ceux qui développent une application JavaFX, il y a une chouette question StackOverflow qui donne un bon exemple … mais je n’arrive plus à remettre la main dessus.

Poster le token ?

Bon alors vous voyez cette jolie image là-haut ? Elle donne toute la doc de Couchbase sur ce qu’il faut faire du token. J’ai essayé pendant une semaine différentes méthodes avant d’utiliser la seule vraie solution : regarder le source !

Ben oui, parce que la sync gateway de Couchbase est écrite en Go.

Donc, j’ai compris assez vite que ça se passait dans le dossier /rest, et en particulier dans le fichier session.go, qui sert de handler pour les urls de … session.

SAUF QUE en go, comme en d’autres langages, on utilise des intercepteurs pour la sécurité. Donc la gestion des authentifications se partage entre handler.go et auth.go. Pour être plus clair, dans handler.go, la gestion de l’authentification se fait dans cette fonction

En fait, si vous regardez le code, vous verrez que h.getBearerToken() lit en fait le token OpenId depuis les entêtes de la requête. Ca fait déja une réponse facile à trouver :

Il faut mettre le bearer token dans les entêtes HTTP, et PAS dans le corps du POST.

Oui, mais quel token ?

Donc, j’en étais là, et à chaque fois que je postais mon token, avec tous les logs activés en mode debug, j’avais à peu près cette suite de messages

Bon, je vous fais grâce des détails, mais dites-vous que ça signifie que mon token est bien passé à la couche go-oidc, qui le refuse. Et là, j’ai dû lire le code environ 2 jours dans tous les sens avant de comprendre.

Alors, autant vous le dire, il y a plusieurs types de token JWT.

maxresdefault

Et en fait, la différence se fait dans l’algorithme. Vous avez le choix entre HS256 et RS256. Et la seule différence, c’est que le RS256 est signé avec un algorithme assymétrique.

Par défaut, Auth0 propose du HS256.

Et évidement, go-oidc ne décode que les tokens RS256. Et le choix de l’algorithme se fait dans les paramètres avancés du client Auth0.

Autrement dit

Utilisez l’algorithme RS256.

Une fois que vous aurez fait tout ça, vous pourrez bénéficier de l’authentification OpenId Connect pour vos synchronisations. Et ça vous créera les utilisateurs automatiquement. Bon, le nom des utilisateurs dans votre sync gateway sera leur id Auth0, mais franchement, vous allez vous laisser arrêter par ce genre de détail ? Moi non plus. D’ailleurs, je m’en vais de ce pas proposer une pull request à Couchbase pour modifier les différents éléments manquants.

Changement de cap

Souvenez vous de l’article Cap sur 2015

Celui-ci en est une suite directe.

Il y a deux ans, j’avais donc décidé de tenter de travailler dans cet énorme multinationale. J’espérais y découvrir des choses …

  • Comment travailler sur des gros projets
  • Comment être efficace dans des organisations complexes
  • Comment discuter avec des clients du CAC40, ou semi-publics
  • Comment faire avancer des projets d’entreprise

J’ai découvert tout ça, et bien plus.

Je ne vais pas détailler tout ça publiquement. Si vous voulez plus de détails, je pourrais vous en donner de façon plus personnelle.

Toujours est-il qu’au bout de deux ans, même si je suis loin d’avoir fait le tour de l’entreprise, j’ai au moins compris une chose, grâce à ce dessin de XKCD

settling

Je dois bien admettre que prendre une décision de travail sur la base d’un dessin peut sembler ridicule … mais il s’agit plus d’un déclencheur que d’autre chose. Un déclencheur qui a bien aidé certaines personnes à me placer dans une orbite plus incertaine, mais aussi plus excitante.

En effet, je rejoins dès mardi Zenika, pour continuer à y fournir mes services de développeur Java un peu expérimenté et d’architecte … un peu moins expérimenté.

Pourquoi ?

Parce que je vais au chtijug très régulièrement, et que Zenika en est un sponsor depuis un moment.

Parce que j’ai vraiment beaucoup aimé aller à DevoxxFr, et que Zenika en est également un sponsor.

Parce qu’au-delà de ça, un certain nombre de consultants Zenika contribuent à l’open-source.

Autrement dit, parce que je me sens plus aligné avec les valeurs de Zenika.

Une nouvelle aventure, donc, dont je ne sais pas encore où elle me mènera.

En tout cas, elle évitera que je me retrouve propulsé au management

dt170216

Ca me fait le même effet

Ou, pire encore, que je me retrouve coincé dans la matrice des buzzwords

index

Et en terme de réalignement des objectifs sur les deadlines, croyez-moi, c’est pas une bonne idée.

Sincèrement, j’espère éviter ça chez Zenika … A moins que je ne le souhaite d’une façon obscure.

En tout cas, une chose est sûre, la nouveauté m’attend dès mardi !

Pourquoi mes messages sont tronqués (ou absents) ?

J’écris ce message histoire de clarifier un peu les choses.

Comme je passe doucement de Twitter à mastodon, j’en profite pour faire un nettoyage dans mes systèmes d’information et pour ajouter un peu de documentation.

Donc, actuellement, pe publie des informations en utilisant les solutions suivantes

flux_de_publication.png

Il y a évidement des troncages, en particulier quand les textes arrivent dans twitter. Mais dans l’ensemble, c’est assez correct.

Il y a toutefois un défaut, que j’ai l’intention de changer. Regardez en bas : Goodreads, WordPress et StackOverflow publient directement dans Twitter sans passer par mastodon. C’est mal.

Et autant pour Goodreads et WordPress, je pense utiliser brutalement le flux RSS, autant pour Stackoverflow, comme je ne publie pas systématiquement mes questions, je pense que je vais garder une publication manuelle.

Mais j’ai une question :

Pour l’instant, je n’ai pas la réponse … mais je pense me décider assez vite.

Bon, cela dit, je n’ai pas non plus la réponse à « comment embarquer un pouet dans WordPress …

Un mastodonte est-il plus léger qu’un oiseau ?

Ouais, bon, je tente le titre accrocheur.

Donc, j’ai entendu parler toute la semaine dernière de mastodon, un réseau social de microblogging décentralisé.

Autrement dit, un équivalent de twitter (avec une limite des messages à 500 caractères) qui présente l’avantage (en termes de scalabilité) de permettre l’ajout de nouvelles instances au réseau. Pour être plus clair, le réseau social n’est plus un unique site web, mais un ensemble de sites web sur des serveurs différents, dans des pays différents.

Ca me plaisait pas mal (moins d’adhérence à la silicon valley, plus de possibilité de survie du réseau, tout ça tout ça.

J’attendais juste de trouver une instance « sympathique ».

Et soudain, grâce à Camille Gévaudan, la lumière

Donc j’y suis allé, j’y ai créé un compte.

Pour l’instant, c’est sûr que le réseau est encore peut-être un peu jeune. Mais

  • Les fonctionnalités sont équivalentes à celle de Twitter
  • La liberté est plaisante
  • Le nombre d’instances est déjà élevé

Je vais donc tenter la migration complète vers mastodon : envoyer le flux RSS de Shaarli vers mastodon, puis générer un flux RSS de mastodon et l’envoyer vers Twitter.

Il est un peu moins RAID …

Mais ça va s’arranger.

Parce que j’ai reçu aujourd’hui mon disque de remplacement.

J’ai d’abord essayé de remplacer le disque à l’arrache, avant de me souvenir qu’il y a sur le site de Alt-F une page complète sur le changement d’un composant dans un disque RAID.

J’ai donc repris la procédure en suivant méthodiquement les étapes.

Hélas, dès la suppression du composant, c’est le drame :

[root@dlink-6A4EB1]# mdadm --manage /dev/md0 --fail /dev/sda2
mdadm: set device faulty failed for /dev/sda2:  Device or resource busy

Et j’ai passé du temps avant d’avoir l’éclair de lucidité.

En fait, j’ai partitionné mes disques « simplement » : une grosse partition en RAID1 avec tout dedans. Tout … y compris ffp … Lequel ffp fournit évidement les services SSH et compagnie. Du coup, évidement, quand j’essaye d’enlever le composant (enfin, le disque, mais en RAID, apparemment, ça s’appelle un composant), ça ne marche pas … Attendez, c’est du RAID1, donc ça devrait marcher, non ?

Du coup, si c’est pas ça … je fais quoi, moi ? Ben j’en sais rien. Enfin, j’ai bien une idée : je peux toujours copier tout le contenu de mon montage RAID1 sur mon nouveau disque, et le faire évoluer vers un disque RAID1 en reformattant le composant qui reste dans le RAID1.

Bon, en théorie, la solution idéale serait quand même de mettre mon nouveau disque directement dans le conteneur RAID1 … mais je ne sais pas trop comment faire ça, ni dans l’interface d’Alt-F, ni même dans mdadm. Je sens que je vais encore aller écumer ServerFault, moi …

Il n’y aurait pas une bulle, là ?

Après la fameuse halle F de Xavier Niel

Après, évidement, Euratechnologies (qui cela dit est déja un acteur installé du domaine)

Et là, je me pose sérieusement une question.

Quand on voit le nombre d’investisseurs potentiels, la pression pour faire augmenter la valorisation des start-ups doit être assez élevée. Au détriment sans aucun doute de la qualité des produits.

Du coup, j’ai tendance à penser ces temps-ci que, si quelqu’un a une idée valable, il vaut peut-être mieux ne pas se lancer maintenant. ou tout au moins ne pas se lancer dans la croissance à tout prix, histoire d’éviter de se faire parasiter par des business pas si angels.

Jenkins, sers-moi donc un Chtijug !

Nicolas Géraud était venu nous parler des pipelines il y déja deux ans.Est-ce que cette présentation allait être mieux ? En tout cas, elle est bien différente.

Petit point sponsoring de l’IUT sur la taxe d’apprentissage : les entreprises peuvent déclarer des organismes de formation bénéficiaires de leur taxe d’apprentissage. Ca peut avoir une influence sur le budget de ces organismes.

Et c’est parti !

Avec d’abord un petit sondage :

  • qui connait Jenkins ? A main levée, tout le monde dans la salle.
  • qui a déja migré vers Jenkins 2 ? Encore à main levée, pas grand monde.

Jenkins 2

Donc Jenkins 2 … est totalement compatible avec Jenkins 1. Et c’est bien, parce que la montée de version va être simple. Dans l’ensemble, les plugins sont compatibles.

Avec Jenkins 2, il y a aussi de nouveaux sites

  • http://jenkins.io qui est bien plus grand public
  • le project Voltron sert de plugin store avec une chouette présentation. Limite comme le google play store, en fait.

Il y a maintenant au premier démarrage un mot de passe à aller chercher dans les logs de la machine. Ca va permettre de sécuriser le serveur Jenkins avec un admin par défaut. Evidement, on peut toujours avoir un Jenkins non sécurisé, mais il faut le vouloir. Ce qui change pas mal de Jenkins 1 qui, par défaut, n’était pas sécurisé. En bonus, une liste de plugins par défaut est disponible, pour faire une première personnalisation de Jenkins.

Et ensuite, on arrive aux fameux pipeline-as-code.

Pipeline as code

Un job est défini par un Jenkinsfile, écrit dans un DSL Groovy, qu’on peut stocker dans son SCM. L’avantage, c’est aussi de permettre d’utiliser les structures de contrôle de Groovy pour personnaliser le job.

Et ensuite

Il y a tout un tas de nouveaux trucs qui ne vont pas tarder à arriver

BlueOcean (déja disponible en pas beta, mais pas release non plus)

La fameuse nouvelle interface graphique pour Jenkins. Les captures sont très chouettes !

Franchement, l’affichage des pipelines est très chouette. Si j’avais eu ça chez Perigee, j’aurais pu montrer un vraiment très beau pipeline. Le plus incroyable, c’est quand même de pouvoir faire « pousser » un pipeline graphiquement. Il faut voir l’écran pour le croire, je trouve.

Pipeline déclaratif

En bonus, ça permet à des non-développeurs de modifier le build, ce qui n’est pas une si mauvaise idée, puisque le code exécuté est toujours en SCM. En fait, le pipeline généré n’est pas exactement identique à celui qu’un développeur écrirait : c’est un pipeline déclaratif.

D’une façon amusante, le speaker décrit la syntaxe d’un DSL Groovy comme « à mi-chemin entre YAML et Groovy ». Guillaume Laforge et tous ses amis pleurent des larmes de sang en entendant ça. Parce que quand on regarde un DSL Groovy, comme par exemple le MarkupBuilder, on est exactement dans la syntaxe visible à l’écran. Bon, je ne vais pas en vouloir au speaker : il connaît sans doute mieux Jenkins que je connais Groovy.

Back-end storage

Manifestement, l’objectif est de découpler le fonctionnement de Jenkins et le stockage des configurations d’exécution et des résultats. C’est une chouette idée, mais pas vraiment assistée par les capacités des plugins à écrire eux-mêmes des fichiers.

Donc Jenkins 2, c’est ?

Jenkins 2, c’est mieux, et orienté sur le continuous delivery. Et pas le continuous deployment. Autrement dit, l’équipe de cloudbees ne vise pas trop à utiliser Jenkins pour le déploiement en prod.

Quelques questions

Si les pipelines sont déclaratifs, comme maven ou gradle, pourquoi ne pas réutiliser leur outillage ?

Jenkins est utilisé pour faire le delivery, ce que ne font pas ces outils. En un sens, je comprend cette réponse : le scope fonctionnel est différent, et ce serait assez curieux de dire « on peut faire du gradle pour le déploiement ». Et puis, Cloudbees et Gradle inc ne vont pas fusionner demain.

Mais quand même, en transformant les jobs en bouts de code, je trouve que Cloudbees fait rentrer Jenkins dans une espace de continuum de build qui va de mon poste jusqu’aux artefacts déployables en prod.

Comment se compare l’API de pipeline-as-code et de job-dsl ?

L’inspiration initiale de pipeline-as-code était buildflow, mais ça a vite divergé.

Et la démo

  • Premier truc cool : les plugins installés sont toujours installés à la dernière version.
  • Deuxième truc cool : BlueOcean est déjà disponible comme plugin, et donc installable.
  • Troisième truc cool : le travail d’administrateur Jenkins s’arrête, pour les jobs, à créer les jobs et les connecter à des SCM. Tout le reste vient du Jenkinsfile.

Et donc, on passe à la création du Jenkinsfile. Et là, la structure des DSL Groovy réapparaît vraiment, et c’est bien.

  • Quatrième truc cool : les commandes checkout de SCM utilisent la révision du Jenkinsfilecomme référence. Par conséquent, l’enchaînement d’étapes se passera beaucoup mieux que dans Jenkins 1, puisqu’il n’y aura pas de révision à passer. Par contre, curieusement, le DSL ne semble pas contenir de commande maven, puisque notre speaker exécute les commandes maven via un sh "mvn clean package". Arf … apparement, le plugin exécutant maven est « mauvais ».
  • Cinquième truc cool : l’interface de Jenkins inclut un générateurs de snippets façon vieux wizards qui permet d’apprendre très rapidement le DSL des pipelines.
  • Sixième truc cool : l’affichage des pipelines en cours est vraiment très sympa, avec des logs par noeud du pipeline affichés en temps réel.
  • Septième truc cool : le DSL inclut une notion de stashes, valable uniquement pour la durée du pipeline, qui permet donc de ne pas déployer dans Nexus les artefacts temporaires.
  • Premier truc pas cool : le pipeline est toujours exécuté sur le master. Du coup, la montée en charge pourrait mal se passer.
  • Huitième truc cool : pour les pipelines déclaratifs, il est possible de demander à Jenkins d’analyser la syntaxe.
  • Deuxième truc pas cool : on peut relancer un pipeline à partir d’une étape uniquement dans la version commerciale de Jenkins. C’est moins bien … mais je comprend tout à fait.
  • Neuvième truc cool : il est possible de créer des morceaux de code partagés entre pipelines.
  • Dixième truc cool : les milestones permettent d’éviter de lancer plusieurs builds concurrents sur une ressource critique.

Et si vous voulez voir le Jenkinsfile utilisé pour ce live-coding, il est disponible sur github.

D’autres questions

Comment tester un pipeline ?

Eh bien, on ne peut pas : il faut le lancer dans une instance de Jenkins. Autrement dit, c’est le genre de truc où il faut une instance de test de Jenkins. Et mon collègue me souffle à l’oreille qu’on peut très bien utiliser l’annotation @StaticCompile de Groovy pour vérifier la syntaxe autant que possible (parce que @StaticCompile, sur un DSL, il doit bien s’amuser, tiens).

Conclusion

J’ai quand même hâte de voir les projets passer au moins aux pipelines as code, histoire d’avoir dans mon SCM, à côté de mon pom.xml, le Jenkinsfile qui va bien. Et histoire aussi d’ajouter un peu de Groovy dans tout ça !

Art et science sont-ils miscibles ?

Cette question pas si simple a été posée par Robin sur PodcastScience il y a quelques semaines.

Plus exactement, il disait que l’art et la vulgarisation scientifique avaient des buts contraires. Parce que si la vulgarisation cherche à expliquer simplement une idée complexe, l’objectif d e l’art est tout autre. Et si j’utilise le terme de vulgarisation, c’est à dessein : je n’ai personnellement rien contre (mais je m’éloigne un peu du sujet).

Personnellement, je ne crois pas que les buts en soient si éloignés. Parce que l’art, dans la plupart des cas, est avant tout un appel à l’existence de la part de l’artiste, une création qui n’existe pas forcément pour transmettre une information, mais plus pour créer.

Seulement cette création, cette incarnation d’une idée, a toujours besoin de moyens, de supports. Et ces supports sont des objets, et ont souvent utilisé des techniques de leur temps.

L’exemple le plus classique est éventuellement celui de l’incursion des mathématiques dans la peinture, avec l’apparition de la perspective à la renaissance.

Mais d’autres exemples sont plus intéressants, et devraient toucher plus Robin. J’en ai très particulier en tête : l’oeuvre de Greg Egan, et en particulier ses recueils de nouvelles Axiomatique , Océanique ou Radieux. Il me semble qu’on trouve dans chacun de ces recueils au moins une nouvelle dont le sujet est la manière dont les mathématiques sont, en un sens, un acte de création de l’univers.

On pourrait y ajouter évidement tous ces films de science-fiction à dominante très scientifique, comme par exemple Interstellar, où la science n’est pas seulement un décor aux aventures des héros.

Bref, dire que l’art et la science ne sont pas miscibles me paraît, au mieux, une exagération. En revanche, effectivement, la vulgarisation, elle ne peut que difficilement s’appuyer sur l’art.

Pédophile, criminel ou malade ?

Ah, ça, c’est sûr, vous ne vous attendiez pas à un titre pareil.

Surtout qu’à priori, je ne vais pas vous parler de ça, … mais en fait si, par un angle détourné.

J’ai récemment ajouté Samedi Noir à la liste de mes podcasts. C’est un podcast de lecture de récits policiers, noirs, fantastiques ou science-fictionesques.

Et le dernier épisode, « le Neither » de Jennifer Haley, explore avec une finesse perturbante la pédophilie. Je ne peux que vous recommander de l’écouter pour comprendre ce qu’est le monde pour un pédophile. Honnêtement, c’est moche, et je n’aimerai pas être à leur place. Pas pour la condamnation morale. Plus parce qu’il s’agit authentiquement d’un délit d’opinion. Pour être plus clair, en France, aujourd’hui, on est condamné pour pédophilie dès qu’on détient des images représentant, réellement ou virtuellement, des images représentant les actes incriminés. C’est un authentique crime iconique : le simple fait de détenir une icône, sans préjuger de son origine, suffit à faire de son détenteur un criminel.
En fait, je ne sais pas dire à quel point, dans le contexte d’une société de l’image elle-même pédophile (regardez les images de mannequins prépubères pour comprendre l’image qu’on veut donner de la beauté : une chose qui n’appartiendrait qu’aux plus jeunes), criminaliser des représentations me paraît dangereux philosophiquement. Je comprend que, pour le législateur, c’est plus simple que de chercher la vérité, et ça achète facilement des voix. Mais je trouve cette solution bien trop criminelle. le législateur, en l’occurrence, sacrifie encore une fois des « malades » pour apaiser l’opinion. Et si je mets « malades » entre guillemets, c’est parce que je suis bien trop conscient que toute pulsion sexuelle peut être criminalisée.

Petit projet d’hiver : une webradio sur raspberry

Il y a quelques années, j’ai acheté une radio philips NP 3300. C’était un chouette petit gadget qui me permettait d’écouter des radios sur le web (bon, ça, c’est sympa, mais sans plus), mais aussi toute ma bibliothèque musicale via UPnP (oui, encore un protocole qui n’a pas perçé). Et tout ça en se connectant en wifi au web. Et c’est très cool.

Ca marchait bien au début.

Et très vite, on a rencontré des soucis : l’appareil ne trouvait pas les radios, ou alors il restait complètement bloqué et on devait redémarrer. En plus, les rares mises à jour n’ont jamais apporté de corrections, mais juste des saletés comme le support de Spotify. Spotify … Quand je peux avoir toute ma bibliothèque UPnP ! Quelle honte.

Donc, depuis quelques temps, ce petit appareil dort dans un coin du salon. Et c’est très frustrant. Parce que quand il marche, le son est bon.

Du coup, en bon vieux geek qui a déjà mis en place un raspberry, j’avais déjà vu « quelques trucs » qui avaient l’air cool (connecter des trucs comme un écran LCD, des boutons, des haut-parleurs, ou alors installer une webradio). Et j’y ai réfléchi. Et encore réfléchi. Et donc, aujourd’hui, j’ai pris le taureau par les cornes. J’ai démonté mon NP 3300 pour regarder ce qu’il y avait dedans histoire de savoir quelle était l’ampleur de la tâche.

Il va donc me falloir

  1. Un raspbery 3 (pour avoir le wifi déjà configuré, c’est pratique !)
  2. Une carte MicroSD d’au moins 8 Go
  3. Un moyen d’alimenter mon Raspberry depuis une alimentation 9V/1.1A
  4. Une connexion pour mes deux hauts-parleurs 6 ohms/1.5 Watts (pour lesquels je n’ai, semble-t-il qu’une paire de câble directement connectés à la bobine)
  5. Une connexion pour les boutons sur le dessus de l’appareil … c’est une nappe de 13 fils dont un rouge … la masse, j’imagine)
  6. Une connexion pour l’écran LCD. Et là, je dois dire que je suis bien embêté, parce que la nappe de l’écran intègre également la LED de la télécommande infrarouge.

D’où le terme de projet d’hiver : tout ça va être sans doute assez long à mettre en place. J’essayerai de rassembler tout ça sur ce blog, histoire d’avoir une trace du bazar. Mais ça pourrait ne pas être simple.