<?xml 
version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
>

<channel xml:lang="fr">
	<title>OpenID Connect OAuth Server d&#233;di&#233; </title>
	<link>https://oa.dnc.global/</link>
	<description>OAuth Server by DnC (OAuthSD) est un serveur d'authentification qui impl&#233;mente OAuth 2.0 et OpenID Connect.
Avec la connexion unique, une entit&#233; permet aux utilisateurs de ses applications de naviguer de l'une &#224; l'autre de fa&#231;on trans-parente. En centralisant l'authentification des applications et des utilisateurs, un serveur OpenID Connect permet de contr&#244;ler parfaitement l'acc&#232;s des applications et des utilisateurs aux informations sensibles.</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>

	<image>
		<title>&lt;small&gt;OpenID Connect&lt;/small&gt; OAuth Server &lt;small&gt; d&#233;di&#233; &lt;/small&gt;</title>
		<url>https://static.oa.dnc.global/local/cache-vignettes/L144xH126/siteon0-a21bf.png?1733820003</url>
		<link>https://oa.dnc.global/</link>
		<height>126</height>
		<width>144</width>
	</image>



<item xml:lang="fr">
		<title>OIDC et les Application &#224; page unique : exemple d'une belle mascarade !</title>
		<link>https://static.oa.dnc.global/-Authentifier-l-application-.html#oidcetlesapplicationapageuniqueexempledunebellemascarade</link>
		<guid isPermaLink="true">https://static.oa.dnc.global/-Authentifier-l-application-.html#oidcetlesapplicationapageuniqueexempledunebellemascarade</guid>
		<dc:date>2022-09-16T16:37:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>DnC</dc:creator>



		<description>
&lt;p&gt;Une application &#224; page unique (SPA) est une application Web qui charge une seule page HTML &#224; partir du serveur Web, puis la met &#224; jour de mani&#232;re dynamique en r&#233;ponse &#224; l'interaction de l'utilisateur et &#224; d'autres &#233;v&#233;nements. &lt;br class='autobr' /&gt;
Tirant argument des progr&#232;s des navigateurs, permettant &#224; Javascript de mettre en &#339;uvre les r&#232;gles CORS et d'acc&#233;der au cryptage, certains pr&#233;conisent de mettre en &#339;uvre le flux de code avec autorisation plut&#244;t que le flux implicite. &lt;br class='autobr' /&gt;
La magie du flux &#034;Authorization Code&#034; est alors (...)&lt;/p&gt;


-
&lt;a href="https://static.oa.dnc.global/-Authentifier-l-application-.html" rel="directory"&gt;Authentifier l'application&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logo spip_logo_right spip_logos' alt=&#034;&#034; style='float:right' src='https://static.oa.dnc.global/local/cache-vignettes/L150xH150/arton177-aabd3.png?1733820003' width='150' height='150' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Une application &#224; page unique (SPA) est une application Web qui charge une seule page HTML &#224; partir du serveur Web, puis la met &#224; jour de mani&#232;re dynamique en r&#233;ponse &#224; l'interaction de l'utilisateur et &#224; d'autres &#233;v&#233;nements.&lt;/p&gt;
&lt;p&gt;Tirant argument des progr&#232;s des navigateurs, permettant &#224; Javascript de mettre en &#339;uvre les r&#232;gles CORS et d'acc&#233;der au cryptage, certains pr&#233;conisent de mettre en &#339;uvre le flux de code avec autorisation plut&#244;t que le flux implicite.&lt;/p&gt;
&lt;p&gt;La magie du flux &#034;Authorization Code&#034; est alors &#233;voqu&#233;e pour pr&#233;tendre que l'acc&#232;s aux donn&#233;es est s&#233;curis&#233;. Ce n'est que pure mascarade ! Bling bling bling ...&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h3 class=&#034;spip&#034;&gt;Une application &#224; page unique est une application &#034;sans back-end&#034;&lt;/h3&gt;
&lt;p&gt;Plusieurs architectures permettent de cr&#233;er des applications &#224; page unique. La tendance est l'architecture &#034;serveur l&#233;ger&#034;, qui installe sur l'agent utilisateur ( en g&#233;n&#233;ral le navigateur de l'utilisateur ) la page initiale contenant du code Javascript. Ce code assurera la logique et les transitions d'&#233;tat de l'application, celle-ci obtenant ses donn&#233;es d'API RESTful prot&#233;g&#233;es par OAuth 2.0. Dans cette configuration, l'application r&#233;side sur l'agent utilisateur et non sur le serveur : une application &#224; page unique est donc une application &#034;sans back-end&#034;.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Les SPA pourraient (maintenant ?) mettre en &#339;uvre le flux de code avec autorisation (Authorization Code Grant)&lt;/h3&gt;
&lt;p&gt;Il est de nombreuses configurations dans lesquelles les h&#244;tes de l'application et les points de terminaison des services se situent sur des serveurs diff&#233;rents : serveur d'authentification, ressources prot&#233;g&#233;es (RS) ou API.&lt;/p&gt;
&lt;p&gt;Les applications &#224; page unique en sont un bon exemple.&lt;/p&gt;
&lt;p&gt;En utilisation Web normale, cette approche multi-h&#244;te ou, plus pr&#233;cis&#233;ment, &#034;multi-origines&#034; est restreinte pour de bonnes raisons de s&#233;curit&#233;. Les d&#233;clarations de partage de ressources multi-origines ( Cross-Origin Resource Sharing, CORS ) permettent de contourner la contrainte.&lt;/p&gt;
&lt;p&gt;Les navigateurs se sont am&#233;lior&#233;s depuis la conception du flux implicite. La mise en &#339;uvre de CORS pour autoriser la demande de jeton &#224; partir de JavaScript est maintenant disponible, ainsi que les API de cryptographie n&#233;cessaires pour valider la signature du jeton JWT. &lt;br class='autobr' /&gt;
Il est donc techniquement possible d'utiliser le flux de code d'autorisation pour l'authentification et l'autorisation des applications sans back-end, y compris pour les applications &#224; page unique.&lt;/p&gt;
&lt;p&gt;Faut-il en d&#233;duire pour autant que l'utilisation de ce flux, dans cette configuration, garantit la s&#233;curit&#233; des donn&#233;es ?&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Avec les SPA, les probl&#232;mes de la s&#233;curit&#233; de l'authentification restent pos&#233;s&lt;/h3&gt;
&lt;p&gt;Les SPA sont des applications &#034;sans-back-end&#034;. Leur code se trouve sur l'agent utilisateur, donc n'importe o&#249;, contrairement aux applications &#034;avec back-end&#034; dont le code, unique, est prot&#233;g&#233; au sein d'un serveur. A ce titre :&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Sont expos&#233;s dans le code, de fa&#231;on plus ou moins accessible au public :&lt;br class='autobr' /&gt; - l'identifiant et le secret de l'application, &lt;br class='autobr' /&gt; - les jetons d'acc&#232;s ou d'identit&#233;.&lt;/p&gt;
&lt;p&gt;Avec l'identifiant et le secret, une application malicieuse peut se procurer des jetons. Avec les jetons, elle pourrait demander des donn&#233;es au nom de la v&#233;ritable application.&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; L'URL de redirection est celle de l'application, donc celle de son h&#244;te, c'est &#224; dire l'user-agent. Elle ne peut &#234;tre inscrite sur le serveur et doit &#234;tre fournie par l'application. &lt;br class='autobr' /&gt;
Si on est dans le cas d'user-agent de station de travail ( desktops ) situ&#233;s dans un espace de confiance ( un ou plusieurs domaines connus ), il reste encore possible de comparer cette URL &#224; un mod&#232;le enregistr&#233; sur le serveur d'autorisation. Mais m&#234;me dans ce cas, si l'application malveillante se trouve sur le m&#234;me h&#244;te&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb1' class='spip_note' rel='appendix' title='ce qui est non seulement le cas courant mais aussi le cas ( worst case ) (...)' id='nh1'&gt;1&lt;/a&gt;]&lt;/span&gt;, la distinction est impossible. Si on a affaire &#224; une application de mobile, cela devient vraiment risqu&#233;.&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Dans le cas d'une application de mobile, la demande de jeton au point d'entr&#233;e Token et la r&#233;ponse ne circulent pas dans une liaison de serveur ( celui de l'application ) &#224; serveur ( le serveur d'authentification ) dans laquelle les deux extr&#233;mit&#233;s sont identifi&#233;es, mais entre diff&#233;rents mobiles non identifi&#233;s et le serveur d'authentification. &lt;strong&gt;Ainsi dispara&#238;t une des qualit&#233;s reconnues du flux de code d'autorisation appliqu&#233; aux clients avec back-end&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Il existe bien des &lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#typologiedesapplicationsauregarddelasecuritedesdonnees' class='spip_in'&gt;m&#233;thodes compl&#233;mentaires&lt;/a&gt; permettant de lier les jetons &#224; l'user-agent ou bien &#224; l'identifiant de connexion TLS (TLS Token Binding). Cela permet de prouver que l'user-agent ( ex. le navigateur de l'utilisateur final ) est bien celui avec lequel l'authentification a &#233;t&#233; effectu&#233;e et le jeton cr&#233;&#233;. Mais cela ne permet pas de discriminer la bonne application d'un malware ex&#233;cut&#233; sur la m&#234;me liaison TLS. Dans le m&#234;me ordre d'id&#233;es, la technique de preuve de possession &lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#proofofpossessionpop' class='spip_in'&gt;Proof of Possession (PoP)&lt;/a&gt; semble conduire &#224; la m&#234;me conclusion.&lt;/p&gt;
&lt;p&gt;En particulier, la m&#233;thode &#034;&lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#cledeverificationpourlechangedecodepkce' class='spip_in'&gt;Proof Key for Code Exchange, PKCE&lt;/a&gt;&#034; , appliqu&#233;e aux applications sans back-end dans le cadre du flux Authorization Code, renforce la s&#233;curit&#233; en &#233;vitant le d&#233;tournement du code d'autorisation. Avec cette technique, le secret de l'application n'est pas utilis&#233;, ce qui permet de ne pas le divulguer. Cependant, cela interdit d'identifier l'application. PKCE permet de s'assurer que l'application qui pr&#233;sente le code d'autorisation est bien celle dans laquelle a &#233;t&#233; effectu&#233;e la proc&#233;dure d'identification de l'utilisateur final, quelle que soit cette application.&lt;/p&gt;
&lt;p class=&#034;important&#034;&gt;Dans le cas d'une SPA comme dans celui de toute application sans back-end&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb2' class='spip_note' rel='appendix' title='Tout comme dans le cas d'une application native de mobile et de toute (...)' id='nh2'&gt;2&lt;/a&gt;]&lt;/span&gt;, il n'est pas possible de s'assurer que l'application qui pr&#233;sente le jeton est bien l'application attendue, et pas un malware. &lt;br class='autobr' /&gt;
De fait, il revient &#224; l'utilisateur d'identifier l'application ! Cela va bien dans le premier paradigme (prot&#233;ger les donn&#233;es de l'utilisateur), mais pas dans le deuxi&#232;me (prot&#233;ger les donn&#233;es de l'entit&#233;).&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Encapsuler les donn&#233;es crypt&#233;es dans une classe Javascript ???&lt;/h3&gt;
&lt;p&gt;Avec les SPA, il n'est pas possible de stocker des informations d'identification selon les m&#233;thodes classiques, telles que les jetons d'acc&#232;s dans les cookies et le stockage de session. Au lieu de cela, on imagine de conserver les donn&#233;es sensibles dans des variables JavaScript.&lt;/p&gt;
&lt;p&gt;Certains recommandent alors d'utiliser une classe Javascript pour stocker et fournir ces variables. Cette m&#233;thode re&#231;oit le joli nom d'&#034;encapsulation&#034; qui donne un aspect s&#233;rieux et innovant &#224; une m&#233;thode pourtant bien banale.&lt;/p&gt;
&lt;p&gt;Cependant, il ne s'agit l&#224; que d'une m&#233;thode d'obfuscation dont l'efficacit&#233; est insuffisante face &#224; un attaquant d&#233;termin&#233;. Un simple debugger web (tous les navigateurs modernes en int&#232;grent un) permet d'ex&#233;cuter pas &#224; pas le code et de voir passer les variables.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Pourquoi les sp&#233;cifications confirment-elles une pratique douteuse ?&lt;/h3&gt;
&lt;p&gt;On peut lire dans le document &lt;a href=&#034;https://openid.net/specs/openid-heart-oauth2-1_0.html#rfc.section.2.1.3&#034; class='spip_out' rel='external'&gt;Health Relationship Trust Profile for OAuth 2.0&lt;/a&gt;&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb3' class='spip_note' rel='appendix' title='Qui peut traduire &#034;Health Relationship Trust Profile&#034; ? Google Translator (...)' id='nh3'&gt;3&lt;/a&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;
2.1.3. Client int&#233;gr&#233; au navigateur avec d&#233;l&#233;gation d'utilisateur&lt;/p&gt;
&lt;p&gt;Ce type de client s'applique aux clients qui agissent pour le compte d'un propri&#233;taire de ressource particulier et n&#233;cessitent la d&#233;l&#233;gation des droits de cet utilisateur pour acc&#233;der &#224; la ressource prot&#233;g&#233;e. De plus, ces clients sont int&#233;gr&#233;s &#224; un navigateur Web et partagent efficacement une session active entre les syst&#232;mes.&lt;/p&gt;
&lt;p&gt;Ces clients utilisent le flux implicite de OAuth 2 en envoyant un propri&#233;taire de ressource au point terminal Authorize pour obtenir une autorisation. L'utilisateur DOIT s'authentifier aupr&#232;s du point terminal Authorize. Le navigateur Web de l'utilisateur est ensuite redirig&#233; vers un URI h&#233;berg&#233; par le client, &#224; partir duquel le client peut directement obtenir un jeton d'acc&#232;s. &#201;tant donn&#233; que &lt;strong&gt;le client lui-m&#234;me ne s'authentifie jamais aupr&#232;s du serveur et que le jeton est mis directement &#224; la disposition du navigateur&lt;/strong&gt;, ce flux ne convient que pour les clients incorpor&#233;s dans un navigateur Web, tel qu'un client JavaScript sans composant de serveur principal. Dans la mesure du possible, &lt;strong&gt;il est pr&#233;f&#233;rable d'utiliser le flux de code d'autorisation en raison de ses propri&#233;t&#233;s de s&#233;curit&#233; sup&#233;rieures&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ce type de client NE DOIT PAS demander ou recevoir un jeton d'actualisation. Les jetons d'acc&#232;s &#233;mis &#224; ce type de client DOIVENT &#234;tre de courte dur&#233;e et DEVRAIENT &#234;tre rejet&#233;s &#224; l'expiration de la session authentifi&#233;e de l'utilisateur avec le client.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Il est donc bien reconnu qu'il y a un probl&#232;me que le flux de code d'autorisation ne r&#233;soudra pas. Ce flux est sans doute &#034;de s&#233;curit&#233; sup&#233;rieure&#034;, mais dans le cas des applications sans back-end il &#233;choue &#224; authentifier l'application, &#224; laquelle peut se substituer un malware situ&#233; sur l'agent utilisateur.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pourtant, la r&#233;daction du paragraphe donne &#224; penser que le flux de code d'autorisation fera mieux que le flux implicite. Et on &#233;vite de fa&#231;on simple l'exposition du secret de l'application, et pour cause : &#034;le client lui-m&#234;me ne s'authentifie jamais aupr&#232;s du serveur&#034;.&lt;/p&gt;
&lt;p&gt;Dans ce contexte, &#233;voquer la s&#233;curit&#233; offerte par le flux &#034;Authorization Code&#034; est une &lt;i&gt;mascarade : n.f. com&#233;die hypocrite, mise en sc&#232;ne trompeuse&lt;/i&gt;.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Un article pr&#233;sentant le contre et concluant sur le pour&lt;/h3&gt;
&lt;p&gt;Voici un article int&#233;ressant pour l'analyse qui est faite : &lt;a href=&#034;https://medium.com/@robert.broeckelmann/securely-using-the-oidc-authorization-code-flow-and-a-public-client-with-single-page-applications-55e0a648ab3a&#034; class='spip_out' rel='external'&gt;SECURELY USING THE OIDC AUTHORIZATION CODE FLOW AND A PUBLIC CLIENT WITH SINGLE PAGE APPLICATIONS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;L'auteur pr&#233;conise l'utilisation du flux d'autorisation avec code pour les SPA publiques, mais en fait une analyse d&#233;taill&#233;e qui met bien en &#233;vidence les multiples insuffisances de la configuration. Contrairement au titre &#034;Securely ...&#034; et &#224; la conclusion de l'article, voil&#224; encore une ambig&#252;it&#233;.&lt;/p&gt;
&lt;p&gt;En titrant sur les applications publiques, l'auteur &#233;vite au moins la divulgation du secret de l'application, puisqu'il n'y en a pas. Cela va faciliter le travail des applications malicieuses ! n'allons pas demander des donn&#233;es prot&#233;g&#233;es comme cela.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Incomp&#233;tence ou mensonge de marketing ?&lt;/h3&gt;
&lt;p&gt;Notre article a &#233;t&#233; motiv&#233; par la lecture de celui-ci : &lt;a href=&#034;https://www.ubisecure.com/single-sign-on/single-page-application-and-openid-connect/&#034; class='spip_url spip_out' rel='external'&gt;https://www.ubisecure.com/single-si...&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le fil rouge de cet article est simple :&lt;/p&gt;
&lt;p&gt;1. Les progr&#232;s des navigateurs (CORS et cryptographie) permettent &#224; Javascript de mettre en &#339;uvre le flux authorization code.&lt;/p&gt;
&lt;p&gt;2. Donc, il ne faut plus mettre en &#339;uvre le flux implicite avec les SPA, mais le flux Authorization Code.&lt;br class='autobr' /&gt;
Sous entendu : puisque vous savez bien que le flux Authorization Code est celui qu'il faut employer avec OIDC, et qu'on vous avait bien dit que le flux implicite &#233;tait de s&#233;curit&#233; douteuse, vous comprenez que tout va bien maintenant.&lt;/p&gt;
&lt;p&gt;3. Bien s&#251;r, on doit stocker les jetons. Il faut les encapsuler dans une classe, comme cela ils seront bien cach&#233;s.&lt;/p&gt;
&lt;p&gt;Alors, incomp&#233;tence ou intox ? Ne s'agirait-il pas de faire croire &#224; un dispositif nouveau et cr&#233;diter ainsi l'existence d'un avantage comparatif sur la concurrence ?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pourquoi mentir ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;OpenID Connect a une bonne image, cela se vend bien. Tant pis si les donn&#233;es ne sont s&#233;curis&#233;es que dans le cas des applications Web classiques. Vous voulez suivre la tendance des applications pour mobile ? Alors les marketeurs vous vendront OIDC sans vous avertir des limitations. &lt;br class='autobr' /&gt;
Mieux : ils mettront en avant les m&#233;thodes compl&#233;mentaires, telles que PKCE ou POP, en laissant croire qu'elles apportent la solution au probl&#232;me de l'authentification d'une l'application cliente sans back-end.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Qu'en est-il des serveurs headless ?&lt;/h3&gt;
&lt;p&gt;La configuration &#034;serveur headless&#034; est une architecture qui permet aux r&#233;dacteurs de produire et d'organiser du contenu, tout en fournissant aux d&#233;veloppeurs des donn&#233;es structur&#233;es qui peuvent &#234;tre affich&#233;es &#224; l'aide d'un syst&#232;me distinct sur le front-end d'un site Web ou d'une application.&lt;/p&gt;
&lt;p&gt;On aboutit souvent, c&#244;t&#233; front-end, &#224; une SPA.&lt;br class='autobr' /&gt;
Mais, puisque les donn&#233;es sont servies par une application avec back-end, il y a moyen de demander &#224; l'utilisateur final une authentification OIDC sur cette application, inscrite comme cliente du serveur OIDC. Si cela donne une garantie sur l'habilitation de l'utilisateur &#224; acc&#233;der aux donn&#233;es, cela ne permettra pas d'identifier la SPA et ce qu'elle fait des donn&#233;es.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Il n'y a donc aucun espoir de s&#233;curiser les SPA ?&lt;/h3&gt;
&lt;p&gt;Il y a une piste int&#233;ressante avec les applications install&#233;es sur mobile en mode Progressive Web App (PWA). Sous certaines conditions, le code et les donn&#233;es des PWA sont maintenus, c&#244;t&#233; mobile, identiques &#224; leur mod&#232;le c&#244;t&#233; serveur. Une telle architecture SPA - Serveur Headless (voyez &lt;a href=&#034;https://degoy.com/nos-techniques/spip-cms-headless-gatsby.html&#034; class='spip_out' rel='external'&gt;SPIP CMS headless + Gatsby&lt;/a&gt;) pourrait donc &#234;tre convenablement s&#233;curis&#233;e avec OIDC.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;i-Tego vous accompagne&lt;/h3&gt;
&lt;p&gt;i-Tego (h&#233;riti&#232;re de DnC) exerce un conseil et une assistance. Nous aidons nos clients &#224; mettre en &#339;uvre leur propre serveur OAuthSD. Nous accompagnons les Dev/Ops en leur transf&#233;rant notre comp&#233;tence, ce qui aboutit &#224; n'utiliser OIDC que dans des configurations s&#233;curis&#233;es. &lt;br class='autobr' /&gt;
Et nous reconnaissons &#224; sa juste valeur le travail des IT pour prot&#233;ger l'acc&#232;s au r&#233;seau, et cr&#233;er ainsi &#034;l'espace de confiance&#034; requis pour la bonne application d'OpenID Connect.&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id='nb1'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh1' class='spip_note' title='Notes 1' rev='appendix'&gt;1&lt;/a&gt;] &lt;/span&gt;ce qui est non seulement le cas courant mais aussi le cas ( worst case ) que l'on doit prendre en compte pour une analyse de s&#233;curit&#233;&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb2'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh2' class='spip_note' title='Notes 2' rev='appendix'&gt;2&lt;/a&gt;] &lt;/span&gt;Tout comme dans le cas d'une application native de mobile et de toute application sans back-end. C'est le m&#234;me probl&#232;me, sauf peut-&#234;tre pour les applications de desktop dans un espace de confiance&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb3'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh3' class='spip_note' title='Notes 3' rev='appendix'&gt;3&lt;/a&gt;] &lt;/span&gt;Qui peut traduire &#034;Health Relationship Trust Profile&#034; ? Google Translator donne &#034;Profil de confiance des relations de sant&#233;&#034;. Ce titre incompr&#233;hensible aurait-il pour but de donner un aspect pseudo-scientifique &#224; un texte par ailleurs bien obscur ?&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Liaison du jeton &#224; la connexion TLS (TLS Token Binding)</title>
		<link>https://static.oa.dnc.global/-Authentifier-l-application-.html#liaisondujetonalaconnexiontlstlstokenbinding</link>
		<guid isPermaLink="true">https://static.oa.dnc.global/-Authentifier-l-application-.html#liaisondujetonalaconnexiontlstlstokenbinding</guid>
		<dc:date>2021-01-23T06:39:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>DnC</dc:creator>



		<description>
&lt;p&gt;Avertissement : &#224; ce jour (d&#233;but 2021), cette technique ne semble pas op&#233;rationnelle du fait de la complexit&#233; de son int&#233;gration dans les navigateurs. Faut-il l'abandonner ou attendre encore ? &lt;br class='autobr' /&gt;
Un jeton ne devrait fonctionner que pour le client auquel il a &#233;t&#233; &#233;mis, sinon nous nous retrouvons avec une catastrophe majeure en mati&#232;re de s&#233;curit&#233;. La liaison du jeton est con&#231;ue pour corriger la faiblesse du &#034;Jeton au porteur&#034; (Bearer Token), en rendant le jeton inutilisable dans une connexion TLS (HTTPS) (...)&lt;/p&gt;


-
&lt;a href="https://static.oa.dnc.global/-Authentifier-l-application-.html" rel="directory"&gt;Authentifier l'application&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;&lt;i&gt;Avertissement : &#224; ce jour (d&#233;but 2021), cette technique ne semble pas op&#233;rationnelle du fait de la complexit&#233; de son int&#233;gration dans les navigateurs. Faut-il l'abandonner ou attendre encore ?&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Un jeton ne devrait fonctionner que pour le client auquel il a &#233;t&#233; &#233;mis, sinon nous nous retrouvons avec une catastrophe majeure en mati&#232;re de s&#233;curit&#233;. La liaison du jeton est con&#231;ue pour corriger la faiblesse du &#034;Jeton au porteur&#034; (Bearer Token), en rendant le jeton inutilisable dans une connexion TLS (HTTPS) &#233;tablie par un client autre que le d&#233;tenteur l&#233;gitime.&lt;/p&gt;
&lt;p&gt;Mais cela n'apporte rien de nouveau au probl&#232;me de l'identification de l'application et de son int&#233;grit&#233;, puisque c'est l'application elle-m&#234;me qui g&#233;n&#232;re la cl&#233; et puisque c'est le navigateur qui est identifi&#233;.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h3 class=&#034;spip&#034;&gt;R&#233;f&#233;rences&lt;/h3&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; &lt;a href=&#034;https://openid.net/specs/openid-connect-token-bound-authentication-1_0.html&#034; class='spip_out' rel='external'&gt;OpenID Connect Token Bound Authentication 1.0 - draft 04&lt;/a&gt;&lt;br class='autobr' /&gt;
Cette sp&#233;cification permet aux impl&#233;mentations OpenID Connect d'appliquer la liaison jeton-TLS jeton au jeton ID OpenID Connect. Cela lie cryptographiquement le jeton d'identit&#233; aux connexions TLS sur lesquelles l'authentification s'est produite. Cette utilisation de la liaison de jetons prot&#232;ge le flux d'authentification contre les attaques de r&#233;exportation et de r&#233;ex&#233;cution de jetons et de man-in-the-middle.&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; &lt;a href=&#034;https://tools.ietf.org/html/draft-ietf-oauth-token-binding-08&#034; class='spip_out' rel='external'&gt;OAuth 2.0 Token Binding&lt;/a&gt;. &lt;br class='autobr' /&gt;
La section 5.2 de ce document reste valable dans le cas d'OpenID Connect pour s&#233;curiser le code d'autorisation dans le cas des clients Web Services :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;5.2. Web Server Clients&lt;br class='autobr' /&gt;
Cette section d&#233;crit une m&#233;thode PKCE adapt&#233;e aux clients de serveur Web, qui lie cryptographiquement le code d'autorisation &#224; un jeton Paire de cl&#233;s de liaison sur le navigateur. Le code d'autorisation est li&#233; &#224; l'ID de liaison de jeton que le navigateur utilise pour fournir le code d'autorisation &#224; un client de serveur Web, qui est envoy&#233; au serveur d'autorisation en tant qu'ID de liaison du jeton r&#233;f&#233;renc&#233; pendant la demande d'autorisation. Le client du serveur Web transmet le jeton ID de liaison au serveur d'autorisation lors de la cr&#233;ation du jeton d'acc&#232;s avec la demande de code d'autorisation. Cette liaison garantit que le code d'autorisation ne peut pas &#234;tre lu ou rejou&#233; avec succ&#232;s sur le client du serveur Web &#224; partir d'un navigateur diff&#233;rent de celui qui a cr&#233;&#233; la demande d'autorisation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; &lt;a href=&#034;https://www.rfc-editor.org/rfc/rfc8705.html&#034; class='spip_out' rel='external'&gt;RFC 8705&lt;br class='autobr' /&gt;
OAuth 2.0 Mutual-TLS Client Authentication and Certificate-Bound Access Tokens&lt;/a&gt;&lt;br class='autobr' /&gt;
Ce document d&#233;crit un m&#233;canisme d'authentification du client utilisant l'authentification mutuelle r&#233;alis&#233;e avec des certificats TLS qui offre de meilleures caract&#233;ristiques de s&#233;curit&#233; que le secret du client inscrit sur l'OP.&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;
Les jetons d'acc&#232;s li&#233;s au certificat Mutual-TLS garantissent que seule la partie en possession de la cl&#233; priv&#233;e correspondant au certificat peut utiliser le jeton pour acc&#233;der aux ressources associ&#233;es. Une telle contrainte est parfois appel&#233;e confirmation de cl&#233;, preuve de possession ou d&#233;tenteur de cl&#233; et est diff&#233;rente du cas du jeton porteur d&#233;crit dans la [RFC6750], o&#249; toute partie en possession du jeton d'acc&#232;s peut l'utiliser. pour acc&#233;der aux ressources associ&#233;es. La liaison d'un jeton d'acc&#232;s au certificat du client emp&#234;che l'utilisation de jetons d'acc&#232;s vol&#233;s ou la relecture de jetons d'acc&#232;s par des parties non autoris&#233;es.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Mutual-TLS certificate-bound access tokens &lt;i&gt;versus&lt;/i&gt; mutual-TLS client authentication&lt;br class='autobr' /&gt;
TBC&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;OpenID Connect : la bonne fa&#231;on de passer l'ID de liaison&lt;/h3&gt;
&lt;p&gt;En transmettant avec le jeton JWT des informations dont l'int&#233;grit&#233; peut-&#234;tre v&#233;rifi&#233;e au moyen de la signature, OpenID Connect apporte un b&#233;n&#233;fice essentiel par rapport &#224; OAuth 2.0 : l'ID de liaison du jeton est incorpor&#233; &#224; la charge utile du JWT et se trouve donc certifi&#233; par la signature.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;h3 class=&#034;spip&#034;&gt;TLS Token Binding : est-ce la panac&#233;e ?&lt;/h3&gt;
&lt;p&gt;Cette m&#233;thode permet d'assurer que les jetons sont pr&#233;sent&#233;s sur la m&#234;me connexion TLS que celle sur laquelle l'authentification a &#233;t&#233; &#233;tablie. Mais cela n'authentifie pas l'application dans tous les cas de figure, car, dans le cas d'une application cliente s'ex&#233;cutant sur un navigateur, sans back-end, ce peut-&#234;tre n'importe quelle autre application s'ex&#233;cutant sur ce m&#234;me navigateur.&lt;/p&gt;
&lt;p&gt;Ceci est parfaitement pr&#233;visible : HTTP Over TLS est une s&#233;curisation de la couche de transport &#233;tendue au premier niveau de la couche applicative : le serveur Web d'un c&#244;t&#233;, l'user-agent de l'autre. Au niveau applicatif de l'user-agent, les applications sont &#224; l'extr&#233;mit&#233; du m&#234;me canal et ne peuvent &#234;tre distingu&#233;es par ce seul moyen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;https://connect2id.com/learn/token-binding&#034; class='spip_url spip_out auto' rel='nofollow external'&gt;https://connect2id.com/learn/token-binding&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Questions : &lt;br /&gt;&lt;img src='https://static.oa.dnc.global/squelettes-dist/puce.gif' width=&#034;8&#034; height=&#034;11&#034; class=&#034;puce&#034; alt=&#034;-&#034; /&gt; des fen&#234;tres diff&#233;rentes d'un m&#234;me instance du navigateur ont-elle (ou non) le m&#234;me TLS ID ?
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/squelettes-dist/puce.gif' width=&#034;8&#034; height=&#034;11&#034; class=&#034;puce&#034; alt=&#034;-&#034; /&gt; Que se passe-t-il au passage d'un proxy ?&lt;/p&gt;
&lt;p&gt;Une excellente r&#233;f&#233;rence :&lt;br class='autobr' /&gt;
&lt;a href=&#034;https://medium.facilelogin.com/oauth-2-0-token-binding-e84cbb2e60&#034; class='spip_url spip_out auto' rel='nofollow external'&gt;https://medium.facilelogin.com/oauth-2-0-token-binding-e84cbb2e60&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;https://curity.io/resources/architect/oauth/oauth-client-authentication-mutual-tls/&#034; class='spip_url spip_out auto' rel='nofollow external'&gt;https://curity.io/resources/architect/oauth/oauth-client-authentication-mutual-tls/&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>V&#233;rification de l'origine de la requ&#234;te re&#231;ue par un serveur de ressource</title>
		<link>https://static.oa.dnc.global/-Authentifier-l-application-.html#verificationdeloriginedelarequeterecueparunserveurderessource</link>
		<guid isPermaLink="true">https://static.oa.dnc.global/-Authentifier-l-application-.html#verificationdeloriginedelarequeterecueparunserveurderessource</guid>
		<dc:date>2020-01-23T17:09:36Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>DnC</dc:creator>



		<description>
&lt;p&gt;La transmission de jetons &#224; des serveurs de ressource (RS) implique que ces derniers soient r&#233;ceptifs &#224; des jetons de toute provenance. Cela pr&#233;sente une opportunit&#233; pour un attaquant (une application &#233;trang&#232;re) d'exploiter un jeton compromis ou vol&#233;. &lt;br class='autobr' /&gt;
Une fois de plus, l'analyse montre que nous ne sommes en mesure d'assurer pleinement la s&#233;curit&#233; des donn&#233;es que dans le cas du flux &#034;Authorization Code&#034; pour des applications &#034;avec back-end&#034;. &lt;br class='autobr' /&gt;
Consid&#233;ration sur la s&#233;curit&#233; de la transmission des jetons (...)&lt;/p&gt;


-
&lt;a href="https://static.oa.dnc.global/-Authentifier-l-application-.html" rel="directory"&gt;Authentifier l'application&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logo spip_logo_right spip_logos' alt=&#034;&#034; style='float:right' src='https://static.oa.dnc.global/local/cache-vignettes/L93xH94/arton132-b058b.png?1733819679' width='93' height='94' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;La transmission de jetons &#224; des serveurs de ressource (RS) implique que ces derniers soient r&#233;ceptifs &#224; des jetons de toute provenance. Cela pr&#233;sente une opportunit&#233; pour un attaquant (une application &#233;trang&#232;re) d'exploiter un jeton compromis ou vol&#233;.&lt;/p&gt;
&lt;p&gt;Une fois de plus, l'analyse montre que nous ne sommes en mesure d'assurer pleinement la s&#233;curit&#233; des donn&#233;es que dans le cas du flux &#034;Authorization Code&#034; pour des applications &#034;avec back-end&#034;.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h3 class=&#034;spip&#034;&gt;Consid&#233;ration sur la s&#233;curit&#233; de la transmission des jetons aux serveurs de ressources&lt;/h3&gt;
&lt;p&gt;La proposition de standard &lt;a href=&#034;https://datatracker.ietf.org/doc/rfc6749/&#034; class='spip_out' rel='external'&gt;RFC 6749&lt;/a&gt; est bien claire sur la n&#233;cessit&#233; de n'utiliser les jetons d'acc&#232;s que dans un espace de parties autoris&#233;es (&#167; 10.3.) :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Les identifiants de jeton d'acc&#232;s (ainsi que tous les attributs de jeton d'acc&#232;s confidentiels) DOIVENT &#234;tre gard&#233;s confidentiels pendant le transit et le stockage, et partag&#233;s uniquement entre le serveur d'autorisation, les serveurs de ressources pour lesquels le jeton d'acc&#232;s est valide et le client auquel le jeton d'acc&#232;s est &#233;mis.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si tous les serveurs de ressources (RS) auxquels sont transmis les jetons appartiennent &#224; une m&#234;me organisation (corporate realm), on peut supposer que les ressources sont situ&#233;es dans un sous-r&#233;seau prot&#233;g&#233; par un pare-feu interdisant les requ&#234;tes depuis des applications ext&#233;rieures au sous-r&#233;seau. C'est ce qui est d&#233;sign&#233; par&lt;strong&gt; &#034;espace de confiance&#034;&lt;/strong&gt;. &lt;br class='autobr' /&gt;
On peut alors :
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; esp&#233;rer que les jetons ne seront pas compromis, c'est &#224; dire accessibles &#224; des applications &#233;trang&#232;res &#224; l'organisation,
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; supposer que toute application situ&#233;e dans ce sous-r&#233;seau et s'adressant aux ressources de ce m&#234;me sous-r&#233;seau est autoris&#233;e &#224; en recevoir les r&#233;ponses.&lt;/p&gt;
&lt;p&gt;Dans le contexte OpenID, un client est d&#233;nomm&#233; Relying Party (RP) ou &lt;strong&gt;&#034;partie de confiance&#034;&lt;/strong&gt;. Du point de vue de l'utilisateur final, il lui est demand&#233; de faire confiance &#224; l'application qui lui demande son autorisation : c'est &#224; lui d'identifier l'application ... ou de se faire hame&#231;onner ! Du point de vue d'un serveur de ressource, la confiance ne r&#233;sulte pas d'un caract&#232;re particulier de l'application que ce serveur pourrait constater par lui-m&#234;me, mais du fait qu'elle se situe &#224; l'int&#233;rieur d'&lt;i&gt;un espace de confiance que l'on suppose inaccessible aux autres applications&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Cependant, m&#234;me dans le cadre d'un client bien identifi&#233;, une attaque bien &#233;labor&#233;e pourrait conduire &#224; voler le jeton pour l'exploiter avec une application &#233;trang&#232;re.&lt;/p&gt;
&lt;p&gt;De toutes fa&#231;ons, &lt;strong&gt;les suppositions ne sont jamais tr&#232;s bonnes en mati&#232;re de s&#233;curit&#233;&lt;/strong&gt;&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb2-1' class='spip_note' rel='appendix' title='C'est un euph&#233;misme pour ne pas dire que nous sommes en pr&#233;sence d'une faille (...)' id='nh2-1'&gt;1&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Bien entendu, si on adresse un jeton &#224; une ressource &#233;trang&#232;re, il faut consid&#233;rer le jeton comme compromis, car il pourra &#234;tre r&#233;utilis&#233; par une application &#233;trang&#232;re.&lt;/p&gt;
&lt;p&gt;La probl&#233;matique de l'identification des applications est d&#233;velopp&#233;e ici : &lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#typologiedesapplicationsauregarddelasecuritedesdonnees' class='spip_in'&gt;Typologie des applications au regard de la s&#233;curit&#233; des donn&#233;es&lt;/a&gt;. On y voit que le flux Authorization Code, s'il permet d'identifier les applications &#034;avec back-end&#034;, ne le permet pas dans le cas des applications &#034;sans back-end&#034;. Il existe des &lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#typologiedesapplicationsauregarddelasecuritedesdonnees' class='spip_in'&gt;m&#233;thodes compl&#233;mentaires&lt;/a&gt; qui r&#233;duisent le risque [3] d'un vol de jeton, mais qui, cependant, ne permettent pas d'authentifier une application cliente sans back-end.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Identifier l'application cliente&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Plut&#244;t que se reposer sur la notion d'espace et d'applications de confiance, le serveur de ressource (Resource Server) doit pouvoir v&#233;rifier la l&#233;gitimit&#233; du d&#233;tenteur du token.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mais comment ?&lt;/p&gt;
&lt;p&gt;La sp&#233;cification d&#233;crit clairement cette limitation (&#167;10.3) :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Cette sp&#233;cification ne fournit aucune m&#233;thode pour que le serveur de ressources s'assure qu'un jeton d'acc&#232;s qui lui est pr&#233;sent&#233; par un client donn&#233; a &#233;t&#233; &#233;mis pour ce client par le serveur d'autorisation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb2-2' class='spip_note' rel='appendix' title='Peut-on trouver des solutions dans d'autres documents ? H&#233;las, non ! On peut (...)' id='nh2-2'&gt;2&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Dans le protocole HTTP, une ressource r&#233;pondra &#224; l'URL origine de la demande.&lt;/p&gt;
&lt;p&gt;Deux &lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#typologiedesapplicationsauregarddelasecuritedesdonnees' class='spip_in'&gt;types d'applications&lt;/a&gt; doivent &#234;tre distingu&#233;es s'agissant de l'origine de la demande&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb2-3' class='spip_note' rel='appendix' title='On classe souvent une application &#034;avec backend&#034; comme &#034;application (...)' id='nh2-3'&gt;3&lt;/a&gt;]&lt;/span&gt; :
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Les &lt;strong&gt;applications &#034;avec back-end&#034;&lt;/strong&gt;, c'est &#224; dire &#233;mettant leurs requ&#234;tes depuis un serveur : la requ&#234;te sera &#233;mise avec l'IP du serveur de l'application.
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Les &lt;strong&gt;applications &#034;sans back-end&#034;&lt;/strong&gt;, &#233;mettant leur requ&#234;te &#224; partir d'un user-agent (du code Javascript ex&#233;cut&#233; par le navigateur de l'utilisateur final, le syst&#232;me d'exploitation de l'ordinateur h&#244;te d'une application native etc.) : la requ&#234;te sera &#233;mise avec l'IP de la connexion de l'user-agent, &#233;ventuellement masqu&#233;e par un proxy.&lt;/p&gt;
&lt;p&gt;Dans l'&#233;tat actuel du d&#233;veloppement d'OpenID Connect, nous ne consid&#233;rerons que les &#034;applications avec back-end&#034; dont l'IP du serveur h&#244;te garantit l'identit&#233;&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb2-4' class='spip_note' rel='appendix' title='On peut parler &#034;d'IP de l'application&#034; mais notons que plusieurs applications (...)' id='nh2-4'&gt;4&lt;/a&gt;]&lt;/span&gt;. Autrement dit :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenID Connect n'est en mesure d'assurer la s&#233;curit&#233; des donn&#233;es que dans le cas du flux &#034;Authorization Code&#034; pour des applications &#034;avec back-end&#034;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;OAuthSD offre deux moyens de v&#233;rifier la l&#233;gitimit&#233; d'une application &#034;avec back-end&#034; pr&#233;sentant le jeton en se fondant sur l'IP de l'origine :
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; par introspection avec l'IP du demandeur,
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; avec les d&#233;clarations suppl&#233;mentaires du jeton JWT 'cip_hash' ou 'cip'.&lt;/p&gt;
&lt;p&gt;Les &lt;strong&gt;IP de l'application cliente&lt;/strong&gt;, auxquelles sera compar&#233;e l'IP du demandeur, sont d&#233;termin&#233;es de la fa&#231;on suivante :
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; si l'application cliente est enregistr&#233;e avec un champ 'ip' de la table 'clients' non vide, OAuthSD utilisera ces IP(s),
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; sinon, les IP(s) seront obtenues en interrogeant le DNS avec le nom d'h&#244;te de l'URL de retour (redirect URI) enregistr&#233;e pour l'application&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb2-5' class='spip_note' rel='appendix' title='Il convient donc de s'assurer de l'int&#233;grit&#233; des DNS. Le mieux serait que les (...)' id='nh2-5'&gt;5&lt;/a&gt;]&lt;/span&gt;&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb2-6' class='spip_note' rel='appendix' title='Cette m&#233;thode peut introduire un d&#233;lai de r&#233;ponse de la ressource ind&#233;sirable, (...)' id='nh2-6'&gt;6&lt;/a&gt;]&lt;/span&gt;.&lt;br class='autobr' /&gt;
OAuthSD permet de prendre en compte un &#233;ventuel proxy (de confiance) pour acc&#233;der &#224; la v&#233;ritable IP de l'application.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;V&#233;rification par introspection avec l'IP du demandeur&lt;/h3&gt;
&lt;p&gt;Le projet de &lt;a href=&#034;https://datatracker.ietf.org/doc/rfc7662/&#034; class='spip_out' rel='external'&gt;RFC 7662&lt;/a&gt; &#233;voque le sujet de fa&#231;on implicite. Il est en effet indiqu&#233; dans la section 2.1 :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;&#034;Le point de terminaison d'introspection PEUT accepter d'autres param&#232;tres OPTIONNELS pour fournir un contexte suppl&#233;mentaire &#224; la requ&#234;te. Par exemple, un serveur d'autorisation peut souhaiter conna&#238;tre l'adresse IP du client acc&#233;dant &#224; la ressource prot&#233;g&#233;e pour d&#233;terminer si le client pr&#233;sentant le jeton est le bon. La d&#233;finition de ce param&#232;tre ou de tout autre param&#232;tre sort du cadre de la pr&#233;sente sp&#233;cification, ... &#034;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;OAuthSD met ceci en &#339;uvre de la mani&#232;re suivante :&lt;br class='autobr' /&gt;
&lt;span class='spip_document_90 spip_documents spip_documents_center'&gt;
&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L500xH133/oidc_identification_app_ip-30625.png?1734010328' width='500' height='133' alt=&#034;V&#233;rification de l'origine de la requ&#234;te par introspection avec l'IP du demandeur&#034; title=&#034;V&#233;rification de l'origine de la requ&#234;te par introspection avec l'IP du demandeur&#034; /&gt;&lt;/span&gt;&lt;br class='autobr' /&gt;
Si le RS appelant le point de terminaison Introspection transmet l'adresse IP de son propre demandeur au moyen du &lt;strong&gt;param&#232;tre 'requester_ip'&lt;/strong&gt;, l'introspection v&#233;rifie que cette adresse IP se trouve dans le m&#234;me sous-r&#233;seau que l'application cliente identifi&#233;e par la d&#233;claration 'aud'.&lt;/p&gt;
&lt;p&gt;Afin d'&#233;viter de r&#233;pondre &#224; un malware &lt;strong&gt;une ressource prot&#233;g&#233;e recevant un jeton d'identit&#233; doit le valider par introspection en transmettant le param&#232;tre 'requester_ip'&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Sur OAuthSD, pour que cette v&#233;rification soit effective, il convient de :
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; renseigner l'IP des applications clientes lors de leur enregistrement (&#224; d&#233;faut l'IP du domaine de l'URI de retour sera utilis&#233;),
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; de r&#233;gler &#224; 'true' la constante de configuration CHECK_CLIENT_IP.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notes : &lt;/strong&gt;
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; D'une fa&#231;on g&#233;n&#233;rale, l'IP des applications faisant appel aux contr&#244;leurs Introspect ou UserInfo est v&#233;rifi&#233;e comme indiqu&#233; ci-dessus, sans qu'il soit n&#233;cessaire de fournir le param&#232;tre 'requester_ip', afin de v&#233;rifier qu'il s'agit bien de l'application cliente enregistr&#233;e. &lt;br class='autobr' /&gt;
On comprendra que, dans le cas d'une demande effectu&#233;e &#224; un serveur de ressource qui fait appel au contr&#244;leur Introspect, il est n&#233;cessaire que le serveur de ressource fournisse l'IP du demandeur, sinon ce serait l'IP du serveur de ressource qui serait contr&#244;l&#233;e, et non celle du demandeur.
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Notons qu'OAuthSD offre &#233;galement une option permettant la v&#233;rification de l'appartenance &#224; un m&#234;me domaine ou sous-domaine (voir la constante de configuration CHECK_SAME_DOMAINS) effectu&#233;e par le contr&#244;leur Introspect.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Exemples d'appel &#224; l'introspection avec le param&#232;tre 'requester_ip'&lt;/h3&gt;
&lt;p&gt;Par en-t&#234;te :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_php code&#034;&gt;&lt;div class=&#034;php&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #666666; font-style: italic;&#034;&gt;// Method Bearer + parameters by Post&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$data1&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; &lt;a href=&#034;http://www.php.net/array&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'requester_ip'&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&gt;&lt;/span&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$_SERVER&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;'REMOTE_ADDR'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; &lt;a href=&#034;http://www.php.net/curl_init&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_init&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$introspection_endpoint&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_HTTPHEADER&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;a href=&#034;http://www.php.net/array&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'Content-Type: application/x-www-form-urlencoded'&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'Authorization: Bearer '&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;.&lt;/span&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$res1&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;'id_token'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_RETURNTRANSFER&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #009900; font-weight: bold;&#034;&gt;true&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_POST&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #cc66cc;&#034;&gt;1&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_POSTFIELDS&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;a href=&#034;http://www.php.net/http_build_query&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;http_build_query&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$data1&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$res&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; &lt;a href=&#034;http://www.php.net/curl_exec&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_exec&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #339933;&#034;&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class='download code_download'&gt;&lt;a href='https://static.oa.dnc.global/local/cache-code/d1ee32b17ef0ba8ee4ba4382025d4fbd.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Par Post : &lt;br class='autobr' /&gt;
&lt;strong&gt;PHP&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_php code&#034;&gt;&lt;div class=&#034;php&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #666666; font-style: italic;&#034;&gt;// Post Methode &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$data1&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; &lt;a href=&#034;http://www.php.net/array&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;'token'&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&gt;&lt;/span&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$res1&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;'id_token'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;'requester_ip'&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&gt;&lt;/span&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$_SERVER&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;'SERVER_ADDR'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$trace&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$_SESSION&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;'trace'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$trace&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;.=&lt;/span&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'----- Step 3 : JWT Introspection -----'&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;.&lt;/span&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;&#034;&lt;br /&gt;&#034;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$trace&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;.=&lt;/span&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'access token : '&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;.&lt;/span&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$access_token&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;.&lt;/span&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;&#034;&lt;br /&gt;&#034;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$trace&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;.=&lt;/span&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'data : '&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;.&lt;/span&gt; &lt;a href=&#034;http://www.php.net/print_r&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;print_r&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$data1&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt;&lt;span style=&#034;color: #009900; font-weight: bold;&#034;&gt;true&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;.&lt;/span&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;&#034;&lt;br /&gt;&lt;br /&gt;&#034;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$_SESSION&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;'trace'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$trace&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; &lt;a href=&#034;http://www.php.net/curl_init&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_init&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$introspection_endpoint&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_RETURNTRANSFER&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #009900; font-weight: bold;&#034;&gt;true&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_TIMEOUT&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #cc66cc;&#034;&gt;100&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt; &lt;span style=&#034;color: #666666; font-style: italic;&#034;&gt;//100 : DEBUG&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_POST&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #009900; font-weight: bold;&#034;&gt;true&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_SSL_VERIFYPEER&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #009900; font-weight: bold;&#034;&gt;false&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_HTTPHEADER&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;a href=&#034;http://www.php.net/array&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;'Content-Type: application/x-www-form-urlencoded'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_POSTFIELDS&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;a href=&#034;http://www.php.net/http_build_query&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;http_build_query&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$data1&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$res&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; &lt;a href=&#034;http://www.php.net/curl_exec&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_exec&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #339933;&#034;&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class='download code_download'&gt;&lt;a href='https://static.oa.dnc.global/local/cache-code/ca59113914b9b8da8220943fd5c3022c.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Voyez &#233;galement :&lt;/strong&gt;
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; &lt;a href='https://static.oa.dnc.global/-API-OpenID-Connect-Points-d-extremite-.html#apiopenidconnectintrospectionintrospectionendpoint' class='spip_in'&gt;API Open ID Connect : Introspection (Introspection Endpoint)&lt;/a&gt;,
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; &lt;a href='https://static.oa.dnc.global/-JSON-Web-Token-JWT-JWS-.html#plusloinaveclintrospection' class='spip_in'&gt;Plus loin avec l'Introspection&lt;/a&gt;,
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; &lt;a href='https://static.oa.dnc.global/-Sujets-communs-a-Oauth-2-et-OpenID-Connect-.html#envoidunerequeteaunserveurderessourcers' class='spip_in'&gt;Envoi d'une requ&#234;te &#224; un serveur de ressource (RS)&lt;/a&gt;.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;V&#233;rification avec les d&#233;clarations suppl&#233;mentaires du jeton d'identit&#233; 'cip_hash' ou 'cip'&lt;/h3&gt;
&lt;p&gt;OAuthSD introduit dans la charge utile du jeton JWT une d&#233;claration 'cip' ou 'cip_hash' pour permettre la v&#233;rification de l'IP du demandeur&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb2-7' class='spip_note' rel='appendix' title='Nous vantons l'int&#233;r&#234;t du jeton d'Identit&#233; au format JWT sign&#233; pour lier (...)' id='nh2-7'&gt;7&lt;/a&gt;]&lt;/span&gt;&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb2-8' class='spip_note' rel='appendix' title='Peut-on utiliser la d&#233;claration 'aud' pour transmettre cette URL ? Cela semble (...)' id='nh2-8'&gt;8&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Cette v&#233;rification pourra &#234;tre effectu&#233;e localement, ou par l'introspection, appel&#233;e comme ci-dessus avec le param&#232;tre 'requester_ip'.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;'cip_hash'&lt;/strong&gt;&lt;br class='autobr' /&gt;
Dans le cas g&#233;n&#233;ral, une application n'a qu'une IP. Dans ce cas, c'est cette d&#233;claration qui sera g&#233;n&#233;r&#233;e, et non 'cip', avec l'avantage de masquer l'IP de l'application cliente en la transmettant sous la forme d'un hash. Si l'application a plusieurs IP, et si la constante de configuration FORCE_CIP_HASH est true, la premi&#232;re IP de la liste sera utilis&#233;e pour g&#233;n&#233;rer la d&#233;claration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;'cip'&lt;/strong&gt;&lt;br class='autobr' /&gt;
La d&#233;claration 'cip' est g&#233;n&#233;r&#233;e lorsque les IP de l'application clientes sont multiples. Sa valeur est une suite d'adresses IPv4 s&#233;par&#233;es par un espace. &lt;br class='autobr' /&gt;
Cependant, si la constante de configuration FORCE_CIP_HASH est true, la d&#233;claration 'cip_hash' sera toujours &#233;mise &#224; la place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notes :&lt;/strong&gt;
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; L'une ou l'autre de ces d&#233;clarations suppl&#233;mentaires sera toujours ajout&#233;e &#224; la charge utile du jeton d'identit&#233; JWT du flux OpenID Connect Authorization Code, mais pas dans son pendant OAuth 2.0.
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Cette m&#233;thode a l'avantage de permettre la v&#233;rification par la ressource prot&#233;g&#233;e (rappelons que la charge utile du jeton JWT est simplement encod&#233;e URL64). Ceci est utile pour bloquer une attaque sans avoir &#224; faire appel &#224; l'introspection, ou quand la validation du jeton JWT est effectu&#233;e localement sans passer par l'introspection. &lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Le contr&#244;leur Introspect effectuera &#233;galement la v&#233;rification de l'IP avec ces d&#233;clarations. Dans le cas d'un serveur de ressource, il est n&#233;cessaire que ce dernier transmettre le param&#232;tre 'requester_ip'.
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Un proxy peut se situer entre l'application cliente et le serveur d'authentification. Les paquets adress&#233;s par le proxy portent l'IP du proxy, et non l'IP de l'h&#244;te de l'application cliente. Dans ce cas, la v&#233;rification par l'IP va &#233;chouer, sauf dans le cas d'un &#034;proxy de confiance&#034; trait&#233; ci-apr&#232;s.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Autre m&#233;thode : avec la d&#233;claration audience du jeton JWT&lt;/h3&gt;
&lt;p&gt; La biblioth&#232;que oauth2-server-php r&#233;duit &#034;aud&#034; &#224; l'identifiant du client client_id.&lt;/p&gt;
&lt;p&gt;Pourtant la sp&#233;cification pr&#233;voit :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;
&#034;Il PEUT aussi contenir des identifiants pour d'autres audiences. Dans le cas g&#233;n&#233;ral, la valeur aud est un tableau de cha&#238;nes sensibles &#224; la casse&#034;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Certaines impl&#233;mentation d'OpenID Connect consid&#232;rent que la d&#233;claration audience rel&#232;ve du niveau applicatif, ce qui signifie que sa valeur est une convention &#233;tablie au sein d'une m&#234;me organisation (corporate realm) entre l'application et le serveur de ressource.&lt;/p&gt;
&lt;p&gt;Dans cette optique, la d&#233;claration &#034;aud&#034; est un tableau qui peut contenir les IPs des applications autoris&#233;es &#224; pr&#233;senter le jeton. Ceci permettra au serveur de ressource de v&#233;rifier directement l'IP et ainsi bloquer les malwares sans avoir &#224; &#233;mettre une demande d'introspection.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;La d&#233;claration audience &#233;tant d&#233;finie au niveau de la biblioth&#232;que oauth2-server-php, nous devons modifier celle-ci pour int&#233;grer l'IP de l'application cliente (fournie lors de l'inscription de l'application sur le serveur) dans la d&#233;claration &#034;aud&#034;. Ce d&#233;veloppement est en cours.&lt;/i&gt;&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Prise en compte d'un &#034;proxy de confiance&#034;&lt;/h3&gt;
&lt;p&gt;La question est de savoir si on peut faire confiance &#224; la d&#233;claration HTTP_X_FORWARDED_FOR par laquelle un proxy retransmet l'IP de la requ&#234;te d'origine.&lt;/p&gt;
&lt;p&gt;Un &#233;ventuel proxy situ&#233; entre le r&#233;seau Internet et le serveur d'authentification est ma&#238;tris&#233; par l'organisation et peut &#234;tre consid&#233;r&#233; comme &#233;tant de confiance.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_88 spip_documents spip_documents_center'&gt;
&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L500xH156/oidc_proxy_confiance-324fb.png?1734010328' width='500' height='156' alt=&#034;V&#233;rification de l'origine de la requ&#234;te re&#231;ue par un serveur de ressource : Prise en compte d'un &#034;proxy de confiance&#034;&#034; title=&#034;V&#233;rification de l'origine de la requ&#234;te re&#231;ue par un serveur de ressource : Prise en compte d'un &#034;proxy de confiance&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;OAuthSD permet de d&#233;signer ces proxys par leur IP dans la constante de configuration TRUSTED_PROXIES. Si la constante de configuration USE_PROXY est true, OAuthSD remplacera ces IP par celle fournie par la d&#233;claration HTTP_X_FORWARDED_FOR.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notes :&lt;/strong&gt;
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Parmi les proxies de confiance on peut trouver les proxies inverses (reverse proxy) dont la fonction est de fournir un syst&#232;me de cache. Le principe m&#234;me de l'authentification exclut l'usage de cache.
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Parmi les proxies de confiance se trouvent &#233;galement les &#233;quilibreurs de charge (load balancer). Un &#034;bon&#034; &#233;quilibreur de charge conserve l'adresse IP du client d'origine en l'ins&#233;rant dans l'en-t&#234;te HTTP adress&#233;e au backend. &lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Il existe un protocole permettant de communiquer l'IP du client entre proxies, voir : &lt;a href=&#034;https://www.haproxy.com/fr/blog/preserve-source-ip-address-despite-reverse-proxies/&#034; class='spip_url spip_out auto' rel='nofollow external'&gt;https://www.haproxy.com/fr/blog/preserve-source-ip-address-despite-reverse-proxies/&lt;/a&gt;.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;SAFEIP : &#201;limination des &#034;proxies priv&#233;s&#034;&lt;/h3&gt;
&lt;p&gt;On notera que cette notion de proxy de confiance est l'inverse de ce qu'un grand nombre d'internautes d&#233;signent sous le vocable de proxy dont ils attendent qu'ils masquent leur adresse IP. De tels proxies se disent &#034;anonymes&#034; et sont d&#233;sign&#233;s sous le vocable &#034;proxy priv&#233;&#034; ou &#034;private proxy&#034; ce qui n'a rien &#224; voir avec le fait qu'ils soient priv&#233;s, mais qu'ils ont pour but d'assurer l'anonymat de l'internaute. L'appellation &#034;anonymizing proxy&#034; traduit mieux la fonction de tels proxies.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_89 spip_documents spip_documents_center'&gt;
&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L500xH156/oidc_proxy_inconnu-771aa.png?1734010328' width='500' height='156' alt=&#034;V&#233;rification de l'origine de la requ&#234;te re&#231;ue par un serveur de ressource : SAFEIP : &#201;limination des &#034;proxies priv&#233;s&#034;&#034; title=&#034;V&#233;rification de l'origine de la requ&#234;te re&#231;ue par un serveur de ressource : SAFEIP : &#201;limination des &#034;proxies priv&#233;s&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;OAuthSD comporte une fonctionnalit&#233; &#034;SAFEIP&#034; permettant de bloquer les adresses IP douteuses, parmi lesquelles se trouvent la plupart de celles de tels proxies.&lt;/p&gt;
&lt;p&gt;OAuthSD offre ainsi deux m&#233;canismes compl&#233;mentaires : La prise en compte des proxies de confiance permet d'autoriser les proxies de l'interface r&#233;seau local / Web, tandis que la fonction &#034;SAFEIP&#034; permettra de bloquer les proxies douteux du Web.&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id='nb2-1'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh2-1' class='spip_note' title='Notes 2-1' rev='appendix'&gt;1&lt;/a&gt;] &lt;/span&gt;C'est un euph&#233;misme pour ne pas dire que nous sommes en pr&#233;sence d'une faille de s&#233;curit&#233; b&#233;ante qui n'est pas assez prise en consid&#233;ration.&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb2-2'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh2-2' class='spip_note' title='Notes 2-2' rev='appendix'&gt;2&lt;/a&gt;] &lt;/span&gt;Peut-on trouver des solutions dans d'autres documents ? H&#233;las, non ! On peut lire dans le document &lt;a href=&#034;https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-12&#034; class='spip_out' rel='external'&gt;OAuth 2.0 Token Exchange&lt;/a&gt; :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;&lt;i&gt;Bien que quelques nouvelles d&#233;clarations JWT soient d&#233;finies pour permettre l'expression de la s&#233;mantique de la d&#233;l&#233;gation, la syntaxe, la s&#233;mantique et les caract&#233;ristiques de s&#233;curit&#233; sp&#233;cifiques des jetons eux-m&#234;mes (&#224; la fois ceux pr&#233;sent&#233;s au serveur d'autorisation et ceux obtenus par le client) sont explicitement hors de port&#233;e et aucune exigence n'est formul&#233;e sur le mod&#232;le de confiance dans lequel une impl&#233;mentation peut &#234;tre d&#233;ploy&#233;e.&lt;br class='autobr' /&gt;
Des profils suppl&#233;mentaires peuvent fournir des exigences plus d&#233;taill&#233;es concernant la nature sp&#233;cifique des parties et la confiance impliqu&#233;es, par exemple si la signature et / ou le cryptage des jetons est n&#233;cessaire ou si des jetons de type preuve de possession seront n&#233;cessaires ou &#233;mis ; Cependant, ces d&#233;tails seront souvent des d&#233;cisions de politique prises en fonction des besoins sp&#233;cifiques de d&#233;ploiements individuels et seront configur&#233;s ou mis en &#339;uvre en cons&#233;quence.&lt;/i&gt;.&lt;/p&gt;
&lt;/blockquote&gt;&lt;/div&gt;&lt;div id='nb2-3'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh2-3' class='spip_note' title='Notes 2-3' rev='appendix'&gt;3&lt;/a&gt;] &lt;/span&gt;On classe souvent une application &#034;avec backend&#034; comme &#034;application confidentielle&#034; ou &#034;priv&#233;e&#034; et une application &#034;sans back-end&#034; comme &#034;application publique&#034;. C'est une confusion, voir : &lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#typologiedesapplicationsauregarddelasecuritedesdonnees' class='spip_in'&gt;Typologie des applications au regard de la s&#233;curit&#233; des donn&#233;es&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb2-4'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh2-4' class='spip_note' title='Notes 2-4' rev='appendix'&gt;4&lt;/a&gt;] &lt;/span&gt;On peut parler &#034;d'IP de l'application&#034; mais notons que plusieurs applications pourraient partager une m&#234;me IP.&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb2-5'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh2-5' class='spip_note' title='Notes 2-5' rev='appendix'&gt;5&lt;/a&gt;] &lt;/span&gt;Il convient donc de s'assurer de l'int&#233;grit&#233; des DNS. Le mieux serait que les DNS des applications et le DNS auquel acc&#232;de le serveur (un DNS local de pr&#233;f&#233;rence) se trouvent dans un espace de confiance, et/ou qu'ils soient prot&#233;g&#233;s par DNSSEC.&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb2-6'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh2-6' class='spip_note' title='Notes 2-6' rev='appendix'&gt;6&lt;/a&gt;] &lt;/span&gt;Cette m&#233;thode peut introduire un d&#233;lai de r&#233;ponse de la ressource ind&#233;sirable, raison pour laquelle OAuthSD propose l'enregistrement de l'IP.&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb2-7'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh2-7' class='spip_note' title='Notes 2-7' rev='appendix'&gt;7&lt;/a&gt;] &lt;/span&gt;Nous vantons l'int&#233;r&#234;t du jeton d'Identit&#233; au format JWT sign&#233; pour lier l'identit&#233; de l'utilisateur final, celle de l'application et les port&#233;es d'autorisation. Cependant, un serveur de ressource HTTP ne peut identifier l'origine de la requ&#234;te que par son IP dans la relation serveur-serveur. L'identifiant du client transmis par le jeton n'est pas probant puisque le jeton peut avoir &#233;t&#233; &#034;vol&#233;&#034;. Il est donc indispensable d'incorporer au jeton d'identit&#233; l'IP de l'application l&#233;gitime afin qu'un serveur de ressource puisse la v&#233;rifier.&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb2-8'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh2-8' class='spip_note' title='Notes 2-8' rev='appendix'&gt;8&lt;/a&gt;] &lt;/span&gt;Peut-on utiliser la d&#233;claration 'aud' pour transmettre cette URL ? Cela semble le cas si l'on s'en tient &#224; la sp&#233;cification du JWT pour laquelle 'aud' peut &#234;tre une liste d'URI. Mais la &lt;a href=&#034;https://openid.net/specs/openid-connect-core-1_0.html&#034; class='spip_out' rel='external'&gt;sp&#233;cification OpenID Connect&lt;/a&gt; est plus restrictive :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;
aud&lt;br class='autobr' /&gt;
OBLIGATOIRE. Audience (s) pour laquelle ce jeton d'identifiant est destin&#233;. Il DOIT contenir le client_id OAuth 2.0 de la partie de confiance en tant que valeur d'audience. Il PEUT aussi contenir des identifiants pour d'autres audiences. Dans le cas g&#233;n&#233;ral, la valeur aud est un tableau de cha&#238;nes sensibles &#224; la casse. Dans le cas sp&#233;cial usuel o&#249; il y a un public, la valeur aud PEUT &#234;tre une cha&#238;ne sensible &#224; la casse.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En cons&#233;quence, la biblioth&#232;que oauth2-server-php fixe la valeur du param&#232;tre 'aud' &#224; l'identifiant de l'application cliente. La d&#233;claration 'aud' n'est pas le bon choix pour permettre &#224; OAuthSD de transmettre l'IP du client.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Canvas Fingerprinting</title>
		<link>https://static.oa.dnc.global/-Authentifier-l-application-.html#canvasfingerprinting</link>
		<guid isPermaLink="true">https://static.oa.dnc.global/-Authentifier-l-application-.html#canvasfingerprinting</guid>
		<dc:date>2019-12-16T09:54:56Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>DnC</dc:creator>



		<description>
&lt;p&gt;La m&#233;thode Canvas Fingerprinting est une de celles qui permettraient de s'assurer que l'instance de l'application interrogeant depuis une page Web une ressource prot&#233;g&#233;e est bien celle &#224; partir de laquelle l'authentification OIDC a &#233;t&#233; effectu&#233;e. &lt;br class='autobr' /&gt;
Pour autant, cela ne permet pas d'identifier l'application et d'&#233;liminer les malwares qui pourraient op&#233;rer sur le m&#234;me user-agent. &lt;br class='autobr' /&gt;
La m&#233;thode est d&#233;crite ici : https://fr.wikipedia.org/wiki/Canva.... &lt;br class='autobr' /&gt;
Cette technique, comme d'autres permettant d'identifier le (...)&lt;/p&gt;


-
&lt;a href="https://static.oa.dnc.global/-Authentifier-l-application-.html" rel="directory"&gt;Authentifier l'application&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logo spip_logo_right spip_logos' alt=&#034;&#034; style='float:right' src='https://static.oa.dnc.global/local/cache-vignettes/L150xH119/arton166-affb4.jpg?1734010329' width='150' height='119' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;La m&#233;thode Canvas Fingerprinting est une de celles qui permettraient de s'assurer que l'instance de l'application interrogeant depuis une page Web une ressource prot&#233;g&#233;e est bien celle &#224; partir de laquelle l'authentification OIDC a &#233;t&#233; effectu&#233;e.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Pour autant, cela ne permet pas d'identifier l'application et d'&#233;liminer les malwares qui pourraient op&#233;rer sur le m&#234;me user-agent.&lt;/p&gt;
&lt;p&gt;La m&#233;thode est d&#233;crite ici : &lt;a href=&#034;https://fr.wikipedia.org/wiki/Canvas_fingerprinting&#034; class='spip_url spip_out' rel='external'&gt;https://fr.wikipedia.org/wiki/Canva...&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cette technique, comme d'autres permettant d'identifier le navigateur et son environnement, est une m&#233;thode de suivi (tracking). A ce titre, elle est bloqu&#233;e par certains navigateurs et logiciels de s&#233;curit&#233; Web. &lt;br class='autobr' /&gt;
O&#249; l'on voit que la finalit&#233; d'identification de l'application cliente s'oppose &#224; la volont&#233; des internautes de ne pas &#234;tre suivis &#224; la trace ...&lt;/p&gt;
&lt;p&gt;Cette m&#233;thode n'est pas document&#233;e pour OAuth 2.0 ou OIDC. Elle sera avantageusement remplac&#233;e par d'autres qui font l'objet de documents normatifs en cours d'&#233;laboration.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Cl&#233; de v&#233;rification pour l'&#233;change de code (PKCE)</title>
		<link>https://static.oa.dnc.global/-Authentifier-l-application-.html#cledeverificationpourlechangedecodepkce</link>
		<guid isPermaLink="true">https://static.oa.dnc.global/-Authentifier-l-application-.html#cledeverificationpourlechangedecodepkce</guid>
		<dc:date>2019-12-14T18:18:50Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>DnC</dc:creator>



		<description>
&lt;p&gt;OAuthSD peut mettre en oeuvre le flux Authorization code + PKCE. La principale diff&#233;rence entre le flux Authorization code + PKCE et le flux standard est que le client ne fournit pas le secret de l'application, mais une cl&#233; de v&#233;rification. &lt;br class='autobr' /&gt;
En revanche, puisqu'il n'y a plus secret, il n'y a plus identification de l'application mise en &#339;uvre par le client, qui est donc de type &#034;public&#034;. La m&#233;thode permet d'&#233;viter de propager un secret, mais n'apporte aucune information nouvelle sur l'identit&#233; de (...)&lt;/p&gt;


-
&lt;a href="https://static.oa.dnc.global/-Authentifier-l-application-.html" rel="directory"&gt;Authentifier l'application&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;OAuthSD peut mettre en oeuvre le flux Authorization code + PKCE. La principale diff&#233;rence entre le flux Authorization code + PKCE et le flux standard est que le client ne fournit pas le secret de l'application, mais une cl&#233; de v&#233;rification.&lt;/p&gt;
&lt;p&gt;En revanche, puisqu'il n'y a plus secret, il n'y a plus identification de l'application mise en &#339;uvre par le client, qui est donc de type &#034;public&#034;. &lt;br class='autobr' /&gt;
La m&#233;thode permet d'&#233;viter de propager un secret, mais n'apporte aucune information nouvelle sur l'identit&#233; de l'application puisque c'est une instance publique qui est ainsi identifi&#233;e. La conformit&#233; de l'application au mod&#232;le original n'est pas garantie.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;PKCE (prononcer &#171; pixy &#187; ) est un acronyme pour &#034;Proof Key for Code Exchange&#034; (cl&#233; de preuve pour l'&#233;change de code).&lt;br class='autobr' /&gt;
Voir &lt;a href=&#034;https://datatracker.ietf.org/doc/rfc7636/&#034; class='spip_out' rel='external'&gt;RFC 7636&lt;/a&gt; : Flux de code d'autorisation avec cl&#233; de v&#233;rification pour l'&#233;change de code (Proof of Key for Code Exchange, PKCE)&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Utilit&#233; de PKCE pour les applications mobiles / natives&lt;/h3&gt;
&lt;p&gt;Lors de l'authentification, les applications mobiles / natives ( &lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#typologiedesapplicationsauregarddelasecuritedesdonnees' class='spip_in'&gt;sans back-end&lt;/a&gt; ) peuvent utiliser le &lt;a href='https://static.oa.dnc.global/-OpenID-Connect-Autorisation-via-un-code-Authorization-Code-Flow-.html'&gt;flux de code d'autorisation&lt;/a&gt;, mais elles requi&#232;rent une s&#233;curit&#233; suppl&#233;mentaire, car elles ne peuvent stocker en toute s&#233;curit&#233; le secret du client qui pourrait &#234;tre r&#233;v&#233;l&#233; par reverse-engineering (le secret client est li&#233; &#224; l'application et est identique pour tous les utilisateurs et appareils).&lt;br class='autobr' /&gt;
Les applications sans back-end peuvent utiliser un sch&#233;ma d'URL personnalis&#233; pour capturer les redirections (par exemple, MyApp ://). Ceci peut &#234;tre d&#233;tourn&#233; par une application malveillante, r&#233;sidant sur le m&#234;me user-agent, pour recevoir un code d'autorisation.&lt;/p&gt;
&lt;p&gt;Pour pallier ce probl&#232;me, OAuth 2.0 et OpenID Connect fournissent un compl&#233;ment au flux de code d'autorisation utilisant une cl&#233; de v&#233;rification pour l'&#233;change de code (PKCE).&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Flux de code d'autorisation + PKCE&lt;/h3&gt;
&lt;p&gt;Une application cliente mettant en &#339;uvre le flux de code d'autorisation avec PKCE doit &#234;tre du type &#034;publique&#034; c'est &#224; dire &#234;tre enregistr&#233;e sur le serveur avec un secret null.&lt;/p&gt;
&lt;p&gt;L'application cliente publique cr&#233;e une valeur de cha&#238;ne al&#233;atoire (unique et ne contenant pas d'information), le &lt;strong&gt;code_verifier&lt;/strong&gt;. Lorsque l'application cliente initie la demande de code d'autorisation, au lieu du secret, elle envoie au contr&#244;leur Authorize le hash du code_verifier sous le &lt;strong&gt;param&#232;tre code_challenge&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Une fois que l'utilisateur s'est authentifi&#233; et que le code d'autorisation est renvoy&#233; &#224; l'application cliente, celle-ci demande les jetons en &#233;change du code d'autorisation, en incluant le param&#232;tre code_verifier. &lt;br class='autobr' /&gt;
Si les codes correspondent, l'authentification est termin&#233;e et un access_token est renvoy&#233;.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Cr&#233;ation du code_challenge&lt;/h3&gt;
&lt;p&gt;Dans la demande du code d'autorisation, l'application doit transmettre le code_challenge et la m&#233;thode de codage &#034;code_challenge_method&#034;&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb3-1' class='spip_note' rel='appendix' title='code_challenge_method peut prendre les valeurs &#034;plain&#034; ou &#034;S256&#034;.' id='nh3-1'&gt;1&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Partant d'une cha&#238;ne al&#233;atoire 'code_verifier', on obtient le code_challenge en appliquant un hachage SHA256 et un codage URL base64. Il faut alors passer code_challenge_method = 'S256'&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_php code&#034;&gt;&lt;div class=&#034;php&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #666666; font-style: italic;&#034;&gt;// Prepare PKCE code_challenge&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$code_verifier&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; &lt;a href=&#034;http://www.php.net/substr&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;substr&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt; &lt;a href=&#034;http://www.php.net/str_shuffle&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;str_shuffle&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;&#034;abcdefghijklmnopqrstuvwxyz0123456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEFabcdefghijklmnopqrstuvwxyz0123456789ABCDEF&#034;&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #cc66cc;&#034;&gt;0&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #cc66cc;&#034;&gt;50&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$code_challenge&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; &lt;a href=&#034;http://www.php.net/strtr&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;strtr&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&#034;http://www.php.net/rtrim&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;rtrim&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&#034;http://www.php.net/base64_encode&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;base64_encode&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&#034;http://www.php.net/hash&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;hash&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;'sha256'&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$code_verifier&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #009900; font-weight: bold;&#034;&gt;true&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'='&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'+/'&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'-_'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$_SESSION&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;'code_verifier'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; encrypt&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$code_verifier&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #339933;&#034;&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class='download code_download'&gt;&lt;a href='https://static.oa.dnc.global/local/cache-code/de81b198d315169dbc2f45dc9aa8d82d.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Javascript&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_javascript code&#034;&gt;&lt;div class=&#034;javascript&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000066; font-weight: bold;&#034;&gt;function&lt;/span&gt; base64URLEncode&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;str&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&#034;color: #009900;&#034;&gt;&#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #000066; font-weight: bold;&#034;&gt;return&lt;/span&gt; str.&lt;span style=&#034;color: #660066;&#034;&gt;toString&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #3366CC;&#034;&gt;'base64'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; .&lt;span style=&#034;color: #660066;&#034;&gt;replace&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #009966; font-style: italic;&#034;&gt;/\+/g&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #3366CC;&#034;&gt;'-'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; .&lt;span style=&#034;color: #660066;&#034;&gt;replace&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #009966; font-style: italic;&#034;&gt;/\//g&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #3366CC;&#034;&gt;'_'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; .&lt;span style=&#034;color: #660066;&#034;&gt;replace&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #009966; font-style: italic;&#034;&gt;/=/g&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #3366CC;&#034;&gt;''&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000066; font-weight: bold;&#034;&gt;var&lt;/span&gt; code_verifier &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; crypto.&lt;span style=&#034;color: #660066;&#034;&gt;randomBytes&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #CC0000;&#034;&gt;50&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;&lt;span style=&#034;color: #000066; font-weight: bold;&#034;&gt;var&lt;/span&gt; code_challenge &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; base64URLEncode&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;code_verifier &lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt;...&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class='download code_download'&gt;&lt;a href='https://static.oa.dnc.global/local/cache-code/a523358c522d7b559d9b4e4ba8d925c1.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 class=&#034;spip&#034;&gt;Constante de configuration ENFORCE_PKCE&lt;/h3&gt;
&lt;p&gt;Si la constante de configuration ENFORCE_PKCE est fix&#233;e &#224; true, tous les clients doivent appliquer PKCE.&lt;br class='autobr' /&gt;
Si false, PKCE est appliqu&#233; seulement aux clients interrogeant Authorize avec le param&#232;tre code_challenge.&lt;br class='autobr' /&gt;
Cette constante est fix&#233;e &#224; False par d&#233;faut.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Erreur 'missing_code_challenge'&lt;/h3&gt;
&lt;p&gt;Si la constante de configuration ENFORCE_PKCE est fix&#233;e &#224; true ou si le client interroge Authorize avec le param&#232;tre code_challenge, et que le client ne fournit pas le code challenge ainsi que la m&#233;thode de codage dans la demande de code d'autorisation, le contr&#244;leur Authorise r&#233;pond avec un code 400 et le message 'missing_code_challenge', 'This application requires you provide a PKCE code challenge'.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Appel au contr&#244;leur Token&lt;/h3&gt;
&lt;p&gt;Lorsque l'application cliente appelle le contr&#244;leur Token pour obtenir les jetons, elle passe le param&#232;tre code_verifier et le client ID dans le corps de la requ&#234;te POST ( au lieu de passer le client ID et le secret dans le header par la m&#233;thode d'authentification HTTP Basic ).&lt;/p&gt;
&lt;p&gt;Exemple en &lt;strong&gt;PHP&lt;/strong&gt; :&lt;/p&gt;
&lt;div class=&#034;coloration_code code&#034;&gt;&lt;div class=&#034;spip_php code&#034;&gt;&lt;div class=&#034;php&#034;&gt;&lt;ol&gt;&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$code_verifier&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; decrypt&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;@&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$_SESSION&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;'code_verifier'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$data&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; &lt;a href=&#034;http://www.php.net/array&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'client_id'&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&gt;&lt;/span&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$client_id&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'grant_type'&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&gt;&lt;/span&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'authorization_code'&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'code'&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&gt;&lt;/span&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$code&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #0000ff;&#034;&gt;'code_verifier'&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&gt;&lt;/span&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$code_verifier&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; &lt;a href=&#034;http://www.php.net/curl_init&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_init&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$token_endpoint&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_RETURNTRANSFER&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #009900; font-weight: bold;&#034;&gt;true&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_TIMEOUT&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #cc66cc;&#034;&gt;10&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #666666; font-style: italic;&#034;&gt;//curl_setopt($h, CURLOPT_USERPWD, &#034;{$client_id}:{$client_secret}&#034;);&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_POST&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #009900; font-weight: bold;&#034;&gt;true&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_SSL_VERIFYPEER&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;span style=&#034;color: #009900; font-weight: bold;&#034;&gt;false&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_HTTPHEADER&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;a href=&#034;http://www.php.net/array&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #0000ff;&#034;&gt;'Content-Type: application/x-www-form-urlencoded'&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;a href=&#034;http://www.php.net/curl_setopt&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_setopt&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; CURLOPT_POSTFIELDS&lt;span style=&#034;color: #339933;&#034;&gt;,&lt;/span&gt; &lt;a href=&#034;http://www.php.net/http_build_query&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;http_build_query&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$data&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #000088;&#034;&gt;$res&lt;/span&gt; &lt;span style=&#034;color: #339933;&#034;&gt;=&lt;/span&gt; &lt;a href=&#034;http://www.php.net/curl_exec&#034;&gt;&lt;span style=&#034;color: #990000;&#034;&gt;curl_exec&lt;/span&gt;&lt;/a&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#034;color: #000088;&#034;&gt;$h&lt;/span&gt;&lt;span style=&#034;color: #009900;&#034;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#034;color: #339933;&#034;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style=&#034;font-weight: normal; vertical-align:top;&#034;&gt;&lt;div style=&#034;&#034;&gt; &lt;span style=&#034;color: #339933;&#034;&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class='download code_download'&gt;&lt;a href='https://static.oa.dnc.global/local/cache-code/cd84239bbcfb779531f2d369bc8fe163.txt'&gt;T&#233;l&#233;charger&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 class=&#034;spip&#034;&gt;Erreur 'code_verifier_missing'&lt;/h3&gt;
&lt;p&gt;Si le client a interrog&#233; Authorize avec un code_challenge (quelque soit la valeur de la constante de configuration ENFORCE_PKCE), et que le client ne fournit pas le param&#232;tre 'code_verifier' dans la demande de jeton, le contr&#244;leur Token r&#233;pond avec un code 400 et le message 'code_verifier_missing', &#034;The PKCE code verifier parameter is required'.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Discussion sur la s&#233;curit&#233; de PKCE&lt;/h3&gt;
&lt;p&gt;Tout d'abord rappelons que PKCE ne remplace pas le secret de l'application, et n'apporte donc aucune r&#233;ponse &#224; la probl&#233;matique de l'identification de l'application cliente.&lt;/p&gt;
&lt;p&gt;Le flux de code d'autorisation am&#233;lior&#233; par PKCE introduit un code al&#233;atoire &#034;code_verifier&#034;, obscur (ne contenant pas d'information), cr&#233;&#233; par l'application appelante et pouvant &#234;tre v&#233;rifi&#233; par le serveur d'autorisation. En outre, l'application appelante cr&#233;e une valeur transform&#233;e du v&#233;rificateur de code appel&#233;e &#034;code_challenge&#034; et envoie cette valeur via HTTPS pour r&#233;cup&#233;rer un code d'autorisation. De cette mani&#232;re, un attaquant malveillant ne peut qu'intercepter le code d'autorisation et ne peut pas l'&#233;changer contre un jeton sans le v&#233;rificateur de code.&lt;/p&gt;
&lt;p&gt;Cependant, apr&#232;s avoir cr&#233;&#233; le code verifier dans la premi&#232;re &#233;tape du flux de code d'autorisation, l'application cliente doit le stocker quelque part pour le fournir &#224; la deuxi&#232;me &#233;tape, lors de la demande de jeton. M&#234;me si cela ne dure qu'un temps tr&#232;s court (de l'ordre de la seconde), le code verifier est expos&#233; &#224; un malware dont force est de constater qu'il a tout ce qu'il faut pour tenter d'obtenir un jeton &#224; la place de l'application l&#233;gitime. En principe, l'application l&#233;gitime devrait avoir demand&#233; le jeton imm&#233;diatement, probablement avant le malware qui butera sur l'interdiction d'utiliser deux fois le m&#234;me code verifier. Sauf si le hacker est capable de jouer sur les priorit&#233;s d'ex&#233;cution ? M&#234;me si cela para&#238;t difficile ou improbable, il y a peut-&#234;tre l&#224; une possibilit&#233; d'exploit.&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id='nb3-1'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh3-1' class='spip_note' title='Notes 3-1' rev='appendix'&gt;1&lt;/a&gt;] &lt;/span&gt;code_challenge_method peut prendre les valeurs &#034;plain&#034; ou &#034;S256&#034;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Proof of Possession (PoP)</title>
		<link>https://static.oa.dnc.global/-Authentifier-l-application-.html#proofofpossessionpop</link>
		<guid isPermaLink="true">https://static.oa.dnc.global/-Authentifier-l-application-.html#proofofpossessionpop</guid>
		<dc:date>2019-11-21T21:18:25Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>DnC</dc:creator>



		<description>
&lt;p&gt;R&#233;pondant &#224; la pr&#233;occupation exprim&#233;e dans la rubrique Authentifier l'application, la technique &#034;preuve de possession&#034; serait-elle ce dont nous avons besoin ? &lt;br class='autobr' /&gt;
La particularit&#233; de la PoP consiste &#224; faire cr&#233;er par l'application cliente une paire de cl&#233; publique-priv&#233;e &#224; chaque proc&#233;dure d'authentification. &lt;br class='autobr' /&gt;
Il s'agit de certifier que l'application qui pr&#233;sente le JWT est bien celle qui a &#233;t&#233; identifi&#233;e au moment de l'authentification. Cependant, certifier que l'application est celle qui a initi&#233; (...)&lt;/p&gt;


-
&lt;a href="https://static.oa.dnc.global/-Authentifier-l-application-.html" rel="directory"&gt;Authentifier l'application&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logo spip_logo_right spip_logos' alt=&#034;&#034; style='float:right' src='https://static.oa.dnc.global/local/cache-vignettes/L150xH150/arton178-e2305.png?1734010329' width='150' height='150' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;R&#233;pondant &#224; la pr&#233;occupation exprim&#233;e dans la rubrique &lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html' class='spip_in'&gt;Authentifier l'application&lt;/a&gt;, la technique &#034;preuve de possession&#034; serait-elle ce dont nous avons besoin ?&lt;/p&gt;
&lt;p&gt;La particularit&#233; de la PoP consiste &#224; faire cr&#233;er par l'application cliente une paire de cl&#233; publique-priv&#233;e &#224; chaque proc&#233;dure d'authentification.&lt;/p&gt;
&lt;p&gt;Il s'agit de certifier que l'application qui pr&#233;sente le JWT est bien celle qui a &#233;t&#233; identifi&#233;e au moment de l'authentification. Cependant, certifier que l'application est celle qui a initi&#233; l'authentification de l'utilisateur final n'est pas prouver que c'est l'application authentique. La preuve de possession n'est pas la preuve de l'identit&#233; de l'application et de son int&#233;grit&#233; ( la conformit&#233; de son code au mod&#232;le d'origine ).&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Le terme &#171; preuve de possession &#187; fait r&#233;f&#233;rence &#224; des m&#233;canismes de chiffrement qui att&#233;nuent le risque de vol de jetons de s&#233;curit&#233; et d'utilisation par un attaquant. &lt;br class='autobr' /&gt;
Dans le cas des jetons &#034;porteur&#034; ( Bearer Token ), la simple possession du jeton permet &#224; une application de l'utiliser vis-&#224;-vis d'une ressource prot&#233;g&#233;e.&lt;/p&gt;
&lt;p&gt;Le document &lt;a href=&#034;https://tools.ietf.org/html/rfc7800&#034; class='spip_out' rel='external'&gt;rfc7800&lt;/a&gt; - Proof-of-Possession Key Semantics for JSON Web Tokens (JWTs) - propose une impl&#233;mentation associ&#233; au JWT.&lt;br class='autobr' /&gt;
&lt;i&gt;Nota : Nous sommes dans OpenID Connect. Nous rempla&#231;ons donc dans le texte :&lt;br class='autobr' /&gt;
&#034;&#233;metteur (issuer)&#034; par &#034;serveur OIDC (OpenID Provider)&#034; ou OP,&lt;br class='autobr' /&gt;
&#034;pr&#233;sentateur (presenter)&#034; par &#034;application cliente ou client ou RP&#034;,&lt;br class='autobr' /&gt;
Nous conservons &#034;destinataire (recipient)&#034; en gardant &#224; l'esprit que ce peut &#234;tre une &#034;ressource prot&#233;g&#233;e&#034; ou RS, une API ou n'importe quel autre ressource ou encore l'OP lui-m&#234;me si le jeton lui est retourn&#233; pour r&#233;-authentification silencieuse.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Cette sp&#233;cification explique comment d&#233;clarer dans un jeton Web JSON (JWT) que le client pr&#233;sentant le JWT poss&#232;de une cl&#233; particuli&#232;re preuve-de-possession et comment le destinataire peut obtenir de mani&#232;re cryptographique la preuve que le pr&#233;sentateur poss&#232;de la cl&#233;.&lt;/p&gt;
&lt;p&gt;Le document pr&#233;sente deux impl&#233;mentations : avec preuve de possession &#224; cl&#233; sym&#233;trique ou asym&#233;trique. Nous ne consid&#233;rerons que la deuxi&#232;me, plus universelle (ne n&#233;cessitant pas la connaissance pr&#233;alable d'une cl&#233; partag&#233;e entre le client et l'OP), demandant moins d'&#233;changes et paraissant plus simple de mise en &#339;uvre et, par-dessus tout, mieux s&#233;curis&#233;e.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le client g&#233;n&#232;re une paire de cl&#233;s publique / priv&#233;e&lt;/strong&gt; et envoie la cl&#233; publique &#224; l'OP. L'OP cr&#233;e un JWT contenant la cl&#233; publique (ou son identifiant).&lt;/p&gt;
&lt;p&gt;Lorsque le client pr&#233;sente le JWT au destinataire, il doit produire la preuve-de-possession. Il pr&#233;sente &lt;strong&gt;un nonce sign&#233; avec la cl&#233; priv&#233;e&lt;/strong&gt; dans une &lt;strong&gt;d&#233;claration 'cnf'&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Le destinataire peut v&#233;rifier qu'il interagit avec le client authentifi&#233; en extrayant la cl&#233; publique de la demande de confirmation du JWT (apr&#232;s v&#233;rification de la signature num&#233;rique du JWT) et en en v&#233;rifiant la signature du nonce.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;h3 class=&#034;spip&#034;&gt;Questions ...&lt;/h3&gt;
&lt;p&gt;Dans l'&#233;tat actuel du d&#233;veloppement exploratoire ( pas encore sur GitHub ), voici quelques questions :&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/squelettes-dist/puce.gif' width=&#034;8&#034; height=&#034;11&#034; class=&#034;puce&#034; alt=&#034;-&#034; /&gt; Pourquoi un malware ne serait-il pas capable de g&#233;n&#233;rer un PoP acceptable avec la technique d&#233;crite, puisque le code n&#233;cessaire est expos&#233; dans l'application originale ? On obtient bien la preuve que l'application est celle avec laquelle l'utilisateur final a &#233;t&#233; authentifi&#233;. Mais cela ne veut pas dire que l'application est la bonne. Dans le cas d'une application avec back-end, l'application peut &#234;tre identifi&#233;e avec certitude comme &#233;tant le mod&#232;le original. Mais dans le cas d'une application sans back-end ( une copie de l'original fournie par le serveur ), un malware peut s'ex&#233;cuter dans le m&#234;me user-agent, ce qui ouvre notamment la possibilit&#233; de tromper l'utilisateur (physhing) auquel il revient d'identifier l'application. De plus, la copie de l'application peut avoir &#233;t&#233; modifi&#233;e.&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/squelettes-dist/puce.gif' width=&#034;8&#034; height=&#034;11&#034; class=&#034;puce&#034; alt=&#034;-&#034; /&gt; Cela permet-il de s&#233;curiser un flux implicite ? La cl&#233; priv&#233;e est expos&#233;e dans le cas d'une application &#034;sans backend&#034;. M&#234;me si elle est calcul&#233;e &#224; chaque fois, exposer la cl&#233; priv&#233;e serait contraire au principe m&#234;me de la cryptographie asym&#233;trique et semble &#244;ter toute valeur au PoP.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Une direction de recherche de DnC vers la PoP&lt;/h3&gt;
&lt;p&gt;Notons que l'&lt;a href='https://static.oa.dnc.global/-Identifier-l-utilisateur-final-.html#lafindesmotsdepassenopassconnect' class='spip_in'&gt;application pour mobile DnC's IdentMaster&lt;/a&gt; peut &#234;tre utilis&#233;e comme base de la PoP des applications install&#233;es sur le mobile consid&#233;r&#233;.&lt;/p&gt;
&lt;p&gt;En effet, si la finalit&#233; premi&#232;re de DnC's IdentMaster est d'identifier de fa&#231;on certaine l'utilisateur final, elle offre quelques pierres pour l'&#233;difice de la PoP, notamment en faisant g&#233;n&#233;rer par le mobile une paire de cl&#233; publique/priv&#233;e, le mobile conservant la cl&#233; priv&#233;e dans un espace prot&#233;g&#233; et l'OP acc&#233;dant &#224; la cl&#233; publique. &lt;br class='autobr' /&gt;
Les applications sont donc en mesure d'&#233;laborer des signatures de jeton. Il ne reste &#034;plus qu'&#224;&#034; int&#233;grer la v&#233;rification de l'int&#233;grit&#233; des applications. Android fournit des outils pour cela.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Et toujours la m&#234;me conclusion ...&lt;/h3&gt;
&lt;p&gt;Une application sans back-end ne peut pas utiliser ce dispositif, car il lui faudrait exposer la cl&#233; priv&#233;e, ce qui est contraire au principe m&#234;me de la cryptographie asym&#233;trique et &#244;terait toute valeur &#224; la PoP&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb4-1' class='spip_note' rel='appendix' title='Notons toutefois que la classe Java KeyStore ( impl&#233;ment&#233;es par iOS et (...)' id='nh4-1'&gt;1&lt;/a&gt;]&lt;/span&gt;. &lt;br class='autobr' /&gt;
On en arrive toujours &#224; la m&#234;me conclusion :&lt;br class='autobr' /&gt;
&lt;strong&gt;l'analyse montre que nous ne sommes en mesure d'assurer pleinement la s&#233;curit&#233; des donn&#233;es que dans le cas du flux &#034;Authorization Code&#034; pour des applications &#034;avec back-end&#034;.&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Typologie des applications au regard de la s&#233;curit&#233; des donn&#233;es</title>
		<link>https://static.oa.dnc.global/-Authentifier-l-application-.html#typologiedesapplicationsauregarddelasecuritedesdonnees</link>
		<guid isPermaLink="true">https://static.oa.dnc.global/-Authentifier-l-application-.html#typologiedesapplicationsauregarddelasecuritedesdonnees</guid>
		<dc:date>2019-09-08T08:40:54Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>DnC</dc:creator>



		<description>
&lt;p&gt;Application &#034;Web&#034;, &#034;publique&#034;, &#034;priv&#233;e&#034;, &#034;confidentielle&#034;, &#034;avec back-end&#034;, &#034;sans-backend&#034;, &#034;native&#034;, &#034;hybride&#034;, &#034;&#224; page unique&#034; (SPA), &#034;Progressive Web App&#034; (PWA) etc. Comment s'y retrouver ? Quelle est leur s&#233;curit&#233; selon les flux d'autorisation mis en oeuvre ? &lt;br class='autobr' /&gt;
Nos &#233;changes r&#233;cents avec des d&#233;veloppeurs ont montr&#233; qu'il importait de bien comprendre la configuration des applications par rapport &#224; l'authentification afin de mettre en lumi&#232;re les limitations d'OIDC et les risques pour la s&#233;curit&#233; des (...)&lt;/p&gt;


-
&lt;a href="https://static.oa.dnc.global/-Authentifier-l-application-.html" rel="directory"&gt;Authentifier l'application&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logo spip_logo_right spip_logos' alt=&#034;&#034; style='float:right' src='https://static.oa.dnc.global/local/cache-vignettes/L139xH150/arton153-4b177.jpg?1734010329' width='139' height='150' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Application &#034;Web&#034;, &#034;publique&#034;, &#034;priv&#233;e&#034;, &#034;confidentielle&#034;, &#034;avec back-end&#034;, &#034;sans-backend&#034;, &#034;native&#034;, &#034;hybride&#034;, &#034;&#224; page unique&#034; (SPA), &#034;Progressive Web App&#034; (PWA) etc. Comment s'y retrouver ? Quelle est leur s&#233;curit&#233; selon les flux d'autorisation mis en oeuvre ?&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;i&gt;Nos &#233;changes r&#233;cents avec des d&#233;veloppeurs ont montr&#233; qu'il importait de bien comprendre la configuration des applications par rapport &#224; l'authentification afin de mettre en lumi&#232;re les limitations d'OIDC et les risques pour la s&#233;curit&#233; des donn&#233;es.&lt;/i&gt;&lt;/p&gt;
&lt;div style=&#034;clear:both;&#034;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 class=&#034;spip&#034;&gt;Application de confiance, espace de confiance&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Un des dangers d'une compr&#233;hension superficielle d'OpenID Connect r&#233;side dans le fait qu'il est impossible dans certaines configurations d'authentifier l'application. La s&#233;curit&#233; des donn&#233;es ( &#224; quelle application sont-elles transmises ? ), repose alors sur la notion d'espace de confiance.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La proposition de standard &lt;a href=&#034;https://datatracker.ietf.org/doc/rfc6749/&#034; class='spip_out' rel='external'&gt;RFC 6749&lt;/a&gt; est bien claire sur la n&#233;cessit&#233; de n'utiliser les jetons d'acc&#232;s que dans un espace de parties autoris&#233;es (&#167; 10.3.)&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb5-1' class='spip_note' rel='appendix' title='L'attention du lecteur est appel&#233;e sur le risque qu'il y a &#224; lire le (...)' id='nh5-1'&gt;1&lt;/a&gt;]&lt;/span&gt; :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Les identifiants de jeton d'acc&#232;s (ainsi que tous les attributs de jeton d'acc&#232;s confidentiels) DOIVENT &#234;tre gard&#233;s confidentiels pendant le transit et le stockage, et partag&#233;s uniquement entre le serveur d'autorisation, les serveurs de ressources pour lesquels le jeton d'acc&#232;s est valide et le client auquel le jeton d'acc&#232;s est &#233;mis.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Voyez ici une approche pratique du sujet : &lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#verificationdeloriginedelarequeterecueparunserveurderessource' class='spip_in'&gt;V&#233;rification de l'origine de la requ&#234;te re&#231;ue par un serveur de ressource&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Avant de choisir un &lt;a href='https://static.oa.dnc.global/-Decouvrir-.html#openidconnectetoauth20synthesedesfluxdautorisationgranttype' class='spip_in'&gt;flux OpenID Connect&lt;/a&gt;, il est important d'identifier la configuration des parties prenantes.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il faut tout d'abord distinguer la Programmation c&#244;t&#233; serveur de la programmation c&#244;t&#233; client, qui produisent respectivement des applications avec ou sans back-end.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Programmation c&#244;t&#233; serveur (server-side programming)&lt;/h3&gt;
&lt;p&gt;Voir : MDN : &lt;a href=&#034;https://developer.mozilla.org/fr/docs/Learn/Server-side/Premiers_pas/Introduction&#034; class='spip_out' rel='external'&gt;Qu'est-ce que la programmation c&#244;t&#233; serveur ?&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Les serveurs web attendent des requ&#234;tes du client, les traitent quand elles arrivent, et r&#233;pondent au navigateur web avec une r&#233;ponse HTTP. La r&#233;ponse contient un statut qui indique si la requ&#234;te a pu &#234;tre trait&#233;e avec succ&#232;s ou non (exemple &#034;HTTP/1.1 200 OK&#034; pour indiquer le succ&#232;s).&lt;/p&gt;
&lt;p&gt;Le corps de la r&#233;ponse, si la requ&#234;te r&#233;ussit, contient alors la ressource demand&#233;e (comme une page HTML, une image, etc...), que le navigateur web peut alors afficher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site statique&lt;/strong&gt;&lt;br class='autobr' /&gt;
Un site statique est un site qui renvoie du contenu cod&#233; en dur, c'est &#224; dire le contenu d'un fichier, quand une ressource donn&#233;e est demand&#233;e.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site dynamique&lt;/strong&gt;&lt;br class='autobr' /&gt;
Un site dynamique est un site dont une partie des r&#233;ponses sont g&#233;n&#233;r&#233;es dynamiquement, au moment de la requ&#234;te. Sur les sites dynamiques, les pages HTML sont normalement cr&#233;&#233;es en ins&#233;rant des donn&#233;es d'une base de donn&#233;es dans des espaces r&#233;serv&#233;s &#224; l'int&#233;rieur de templates HTML (c'est une mani&#232;re beaucoup plus efficace que des fichiers statiques pour stocker de grandes quantit&#233;s de contenu).&lt;/p&gt;
&lt;p&gt;Un site web dynamique peut retourner des donn&#233;es diff&#233;rentes pour une URL, en se basant sur les informations fournies par l'&lt;strong&gt;utilisateur final&lt;/strong&gt; (c'est ici que nous rejoignons notre sujet de l'authentification avec OpenID Connect) ou ses pr&#233;f&#233;rences stock&#233;es, et peut effectuer des op&#233;rations avant de retourner la r&#233;ponse.&lt;/p&gt;
&lt;p&gt;La plupart du code pour maintenir un site web dynamique doit s'ex&#233;cuter sur le serveur. La cr&#233;ation de ce code est ce qu'on appelle la &lt;strong&gt;&#034;programmation c&#244;t&#233; serveur&#034;&lt;/strong&gt; ou &lt;strong&gt;&#034;codage back-end&#034;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Les applications construites sur un tel serveur sont d&#233;nomm&#233;es &lt;strong&gt;&#034;application avec back-end&#034;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Puisque notre interrogation porte sur la s&#233;curit&#233; de l'authentification, cette citation de MDN nous donne la r&#233;ponse d&#233;finitive &#224; la question :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#034;https://developer.mozilla.org/fr/docs/Learn/Server-side/Premiers_pas/Introduction#Acc&#232;s_contr&#244;l&#233;_au_contenu&#034; class='spip_out' rel='external'&gt;Acc&#232;s contr&#244;l&#233; au contenu&lt;/a&gt;. La programmation c&#244;t&#233; serveur permet aux sites de restreindre l'acc&#232;s aux utilisateurs autoris&#233;s et de ne servir que les informations qu'un utilisateur a la permission de voir.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il semble que l'on puisse admettre que seule la programmation c&#244;t&#233; serveur permette cela.&lt;/p&gt;
&lt;p&gt;Mais cela suffit-il &#224; cat&#233;goriser les applications par rapport &#224; la possibilit&#233; de les authentifier ?&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Application &#034;avec&#034; ou &#034;sans back end&#034;&lt;/h3&gt;
&lt;p&gt;Dans un environnement client-serveur, on consid&#232;re que le client ou agent utilisateur (user-agent), g&#233;n&#233;ralement le navigateur, fait office de front-end alors que le serveur fait office de back end.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Application &#034;avec back end&#034;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une application &#034;avec back end&#034; fait appel pour l'essentiel de son fonctionnement &#224; un logiciel tournant sur un serveur et produisant des sorties vers l'agent utilisateur. &lt;br class='autobr' /&gt;
La forme la plus courante consiste, c&#244;t&#233; front-end, &#224; limiter l'utilisation du Javascript &#224; l'appel des donn&#233;es (en Ajax) et &#224; leur pr&#233;sentation. Une application avec back-end repr&#233;sente un cas de programmation c&#244;t&#233; serveur (server-side programming).&lt;/p&gt;
&lt;p&gt;Les applications &#034;avec back end&#034; permettent de faire circuler les jetons et les donn&#233;es sensibles sur des liaisons serveur-serveur prot&#233;g&#233;es par TLS et hors de port&#233;e de l'agent utilisateur (g&#233;n&#233;ralement le navigateur de l'utilisateur final) ou des applications &#233;trang&#232;res. Elles r&#233;pondent &#224; une URL fixe.&lt;/p&gt;
&lt;p&gt;Le flux &#034;Authorization Code&#034; permet de s'assurer de l'identit&#233; d'une application cliente au moyen de l'URL de rappel (Callback URL ou redirection endpoint URI), enregistr&#233;e sur l'OP avec l'application.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;backend&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Application &#034;sans back_end&#034;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Les copies d'une application &#034;sans back end&#034; sont install&#233;es et fonctionnent de fa&#231;on autonome sur les agents des utilisateur finaux (il s'agit g&#233;n&#233;ralement d'une page HTML contenant du code Javascript ex&#233;cut&#233; par le navigateur).&lt;/p&gt;
&lt;p class=&#034;important&#034;&gt;
L'URL de rappel pointe vers l'agent utilisateur, et non vers l'application d'origine. Le flux d'Autorisation avec Code peut &#234;tre inop&#233;rant car &lt;strong&gt;on ne peut pas s'assurer que le code qui est ex&#233;cut&#233; est bien le code original&lt;/strong&gt;, ce qui ouvre la porte &#224; des applications malveillantes situ&#233;es sur cet agent. Dans l'&#233;tat actuel, il faut consid&#233;rer qu'il n'est pas possible d'authentifier une application sans back-end.&lt;/p&gt;
&lt;p class=&#034;important&#034;&gt;
Notons que l'on confie &#224; l'utilisateur le soin de reconna&#238;tre l'application comme &#233;tant la bonne, ce qui explique que la probl&#233;matique de l'hame&#231;onnage (phishing) soit au c&#339;ur de la s&#233;curit&#233; des applications.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Application &#034;confidentielle&#034;&lt;/h3&gt;
&lt;p&gt;Dans l'optique d'OIDC, une application est dite &#034;confidentielle&#034; si le public ne peut acc&#233;der au secret de l'application et aux jetons transmis.&lt;/p&gt;
&lt;p&gt;On notera que le caract&#232;re confidentiel (ou priv&#233;) d'une application ne lui est pas inh&#233;rent, mais qu'il r&#233;sulte d'une configuration permettant d'interdire l'acc&#232;s au secret de l'application et aux jetons, mais aussi d'une configuration permettant la mise en &#339;uvre de toutes les bonnes pratiques de s&#233;curit&#233; aboutissant sur une protection effective.&lt;/p&gt;
&lt;p&gt;On consid&#232;re que les identifiants d'une application sans back-end, qui doivent donc figurer dans le code, sont accessibles, de m&#234;me que les jetons, par r&#233;tro-ing&#233;nierie ou par des applications tierces ex&#233;cut&#233;es dans le m&#234;me environnement. Une application &#034;sans back-end&#034; serait donc &#034;non confidentielle&#034;, mais cela est modul&#233; par la notion d'espace de confiance.&lt;/p&gt;
&lt;p&gt;Notons que les applications natives sous java (Android, iOS) peuvent masquer avec une certaine efficacit&#233; le secret de l'application. Il reste &#224; &#233;tudier la s&#233;curit&#233; de la transmission du secret entre le mobile et le serveur OIDC (&#224; d&#233;velopper).&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Application publique (Public client app)&lt;/h3&gt;
&lt;p&gt;Par opposition aux applications confidentielles, une application publique est une application dont le code est accessible par des &#233;trangers &#224; l'organisation g&#233;rant le serveur d'authentification. Elle est par nature non confidentielle, non de confiance car situ&#233; en dehors de l'espace de confiance. &lt;br class='autobr' /&gt;
&lt;i&gt;Il semble que, pour les RFC, la notion d'application publique implique que l'application n'a pas de secret (ou ne devrait pas en avoir, en tous cas le secret d'une application publique ne sert &#224; rien) &lt;/i&gt;.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;IP d'une application avec ou sans backend&lt;/h3&gt;
&lt;p&gt;Lorsqu'une application &#233;met une demande vers un serveur de ressource (RS) :
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; les &lt;strong&gt;applications &#034;avec back end&#034;&lt;/strong&gt;, &#233;mettent leurs requ&#234;tes depuis un serveur : la requ&#234;te sera &#233;mise avec l'IP du serveur de l'application.
&lt;br /&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; les &lt;strong&gt;applications &#034;sans back end&#034;&lt;/strong&gt;, &#233;mettent leur requ&#234;te &#224; partir d'un user-agent (le navigateur de l'utilisateur final, le syst&#232;me d'exploitation de l'ordinateur h&#244;te d'une application native etc.) : la requ&#234;te sera &#233;mise avec l'IP de la connexion de l'user-agent, &#233;ventuellement masqu&#233;e par un proxy. Donc rien de pr&#233;visible.&lt;/p&gt;
&lt;p&gt;Dans le cas d'une application avec backend, l'IP permet &#224; une ressource d'identifier l'application, ce qui n'est pas possible avec une application sans back-end.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Application &#034;Web&#034;&lt;/h3&gt;
&lt;p&gt;Une application &lt;strong&gt;&#034;Web&#034;&lt;/strong&gt; est ce &#224; quoi nous avons d'abord &#233;t&#233; habitu&#233;s : un navigateur standard permet de naviguer dans les pages de l'application en s'appuyant sur un serveur qui peut fournir la totalit&#233; de la page, ou y inscrire du code Javascript qui effectuera au sein du navigateur une partie du travail n&#233;cessaire, qu'il s'agisse de pr&#233;sentation ou de calculs &#034;m&#233;tier&#034;. Ce qui caract&#233;rise l'application Web, c'est sa d&#233;pendance au serveur, exigeant une connexion permanente pour fonctionner : une page ne peut &#234;tre &#233;labor&#233;e s'il n'y a pas connexion du navigateur au serveur&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb5-2' class='spip_note' rel='appendix' title='Cependant la connexion peut &#234;tre discontinue, voir les Progressive Web (...)' id='nh5-2'&gt;2&lt;/a&gt;]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Une application Web est donc une &#034;application avec back-end&#034;. La totale d&#233;pendance au serveur fait des applications Web le domaine id&#233;al d'application du flux &#034;Authorization Code&#034;. C'est une configuration facilitant la protection des donn&#233;es dans un espace priv&#233;. De plus, les donn&#233;es circulent sur le Web prot&#233;g&#233;es par TLS. Elles ne sont pas accessibles au niveau du syst&#232;me d'exploitation par les autres applications fonctionnant &#224; c&#244;t&#233; de l'agent utilisateur. &lt;br class='autobr' /&gt;
Une application Web est donc potentiellement confidentielle.&lt;/p&gt;
&lt;p&gt;Enfin, seul le code situ&#233; sur le serveur (et non le code Javascript t&#233;l&#233;charg&#233;e par les pages) est digne de confiance. Comment le code ex&#233;cut&#233; a-t-il &#233;t&#233; install&#233; ? Est-il conforme au mod&#232;le ? &lt;i&gt;La probl&#233;matique de l'int&#233;grit&#233; du logiciel est l'objet m&#234;me de cette discussion sur la typologie des applications&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Il faut garder &#224; l'esprit que certaines vuln&#233;rabilit&#233; existent (dont l'injection de code, les attaque du type Man-In-The-Middle etc.), notamment lorsque des d'applications Web &#233;trang&#232;res sont acc&#233;d&#233;es de fa&#231;on simultan&#233;e avec le m&#234;me user-agent, ou &#224; partir du m&#234;me poste de travail, ou &#224; partir du m&#234;me r&#233;seau local. OIDC n'apporte dans ce domaine aucune protection qui se substituerait aux bonnes pratiques de s&#233;curit&#233;.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;appnative&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Applications &#034;native&#034;, et &#034;hybride&#034;&lt;/h3&gt;
&lt;p&gt;Le qualificatif &lt;strong&gt;&#034;native&#034;&lt;/strong&gt; est apparu pour d&#233;signer une application pour smartphone ou tablette d&#233;velopp&#233;e sp&#233;cifiquement pour un syst&#232;me d'exploitation mobile ( iOS ou Android ). Il serait plus exact de dire qu'une application &#034;native&#034; s'ex&#233;cute sur le syst&#232;me d'exploitation d'un ordinateur h&#244;te ( non n&#233;cessairement mobile, aussi bien une application lanc&#233;e sur le syst&#232;me d'exploitation d'un ordinateur de bureau&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb5-3' class='spip_note' rel='appendix' title='L'usage commun &#224; de nombreux sites Web consiste &#224; r&#233;duire la notion de 'native&#034; (...)' id='nh5-3'&gt;3&lt;/a&gt;]&lt;/span&gt; ) mais qui ne n&#233;cessite pas de connexion permanente &#224; internet contrairement &#224; une application Web.&lt;/p&gt;
&lt;p&gt;Une application &lt;strong&gt;&#034;hybride&#034;&lt;/strong&gt; est une application envelopp&#233;e dans un conteneur natif ayant la capacit&#233; de charger du code HTML depuis un serveur et de l'interpr&#233;ter. L'application est g&#233;n&#233;ralement form&#233;e de pages contenant du code JavaScript qui charge et &#233;labore les donn&#233;es n&#233;cessaires pour un affichage en HTML5. Dans certains cas, le contenu est totalement &#233;labor&#233; c&#244;t&#233; serveur.&lt;/p&gt;
&lt;p&gt;Une particularit&#233; tr&#232;s importante est la capacit&#233; des applications &#034;natives&#034; &#224; acc&#233;der aux ressources du syst&#232;me d'exploitation sous-jacent, (y compris le syst&#232;me de fichier, les bases de donn&#233;es etc.) ainsi qu'&#224; la communication inter-applications, localement ou par le r&#233;seau. Par contraste, l'acc&#232;s aux ressources du syst&#232;me est interdit aux applications Web et leur communication est contrainte par la politique &#034;m&#234;me domaine&#034; (same domain policy).&lt;/p&gt;
&lt;p&gt;Pour ce qui est de la s&#233;curisation de l'acc&#232;s aux donn&#233;es avec OAuth, on retiendra les observations suivantes :&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Une application native peut &#234;tre consid&#233;r&#233;e comme &#233;tant &#034;avec back-end&#034; s'il revient toujours au serveur d'acc&#233;der aux serveurs de ressource (RS). On comprend que ce sera souvent le cas d'une application hybride.&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Une application native est une instance d'une application install&#233;e sur une machine particuli&#232;re. Son code est donc accessible, offrant la possibilit&#233; de d&#233;couvrir le secret de l'application.&lt;/p&gt;
&lt;p&gt;Cependant, la conservation du secret dans un espace prot&#233;g&#233; est possible. La classe Java KeyStore ( impl&#233;ment&#233;e notamment par iOS et Android ) permet de prot&#233;ger les cl&#233;s. Cependant, la s&#233;curit&#233; de ce dispositif n'est bien r&#233;elle qu'avec le stockage des cl&#233;s et/ou certificats sur un syst&#232;me physique ind&#233;pendant.&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Les donn&#233;es circulent au niveau du syst&#232;me d'exploitation sans chiffrement TLS et sont donc expos&#233;es &#224; une interception. Un appareil mobile, du fait de son usage tr&#232;s vari&#233;, offre un contexte tr&#232;s risqu&#233; du fait de nombreuses applications plus ou moins s&#251;res.&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; En revanche, une application native est &#224; l'abri d'un &#233;ventuel malware ex&#233;cut&#233; sur un agent utilisateur local.&lt;/p&gt;
&lt;p&gt;La distinction &#034;native&#034; - &#034;hybride&#034; n'est pas tr&#232;s significative : la diff&#233;rence r&#233;side dans leur plus ou moins grande capacit&#233; &#224; &#233;laborer localement les donn&#233;es &#034;m&#233;tier&#034; et leur pr&#233;sentation. On omet le plus souvent le qualificatif &#034;hybride&#034; pour inclure ces applications sous le seul qualificatif de &#034;native&#034;. Il faudra cependant retenir la premi&#232;re des observations ci-dessus en faveur de l'application &#034;hybride&#034;, car la relation avec un back-end permet l'authentification avec le flux Authorization Code qui offre la meilleure s&#233;curit&#233;.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Application cliente publique native (public native app clients)&lt;/h3&gt;
&lt;p&gt;Ce terme d&#233;signe les applications natives qui ne sont pas situ&#233;es dans l'espace de confiance d'une organisation dans lequel se situe &#233;galement le serveur d'authentification.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Une application &#034;avec back-end&#034; est-elle n&#233;cessairement &#034;confidentielle&#034; ?&lt;/h3&gt;
&lt;p&gt;On classe souvent une application &#034;avec backend&#034; comme &lt;strong&gt;application confidentielle&lt;/strong&gt; ou &#034;priv&#233;e&#034; et une application &#034;sans back-end&#034; comme &lt;strong&gt;application publique&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;L'&#233;quivalence &#034;avec-backend&#034; &lt;=&gt; &#034;confidentielle&#034; r&#233;sulte de la capacit&#233; &#224; prot&#233;ger les identifiants de l'application et les jetons. En effet, une application &#034;avec backend&#034; peut &#234;tre g&#233;r&#233;e de fa&#231;on priv&#233;e (sur un serveur priv&#233; d'acc&#232;s r&#233;serv&#233;) ce qui interdit au public d'acc&#233;der au code et donc aux identifiants.&lt;/p&gt;
&lt;p&gt;Cependant, il est n&#233;cessaire d'utiliser le flux &#034;Authorization Code&#034; pour que le secret de l'application et les jetons circulent de serveur &#224; serveur et puissent &#234;tre consid&#233;r&#233;s comme non divulgu&#233;s.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Une application &#034;sans back-end&#034; est-elle n&#233;cessairement non confidentielle ?&lt;/h3&gt;
&lt;p&gt;Le terme &#034;sans back-end&#034; qualifie une application t&#233;l&#233;charg&#233;e et install&#233;e par un utilisateur sur son navigateur ou comme &#034;application native&#034; fonctionnant sur le syst&#232;me d'exploitation d'un mobile ou d'une machine de bureau.&lt;/p&gt;
&lt;p&gt;Dans un cas comme dans l'autre, on consid&#232;re que les identifiants de l'application (qui figurent dans le code) sont accessibles, de m&#234;me que les jetons, par r&#233;tro-ing&#233;nierie ou par des applications tierces ex&#233;cut&#233;es dans le m&#234;me environnement. Une application &#034;sans back-end&#034; serait donc &#034;non confidentielle&#034;.&lt;/p&gt;
&lt;p&gt;La m&#233;thode PKCE (Proof Key for Code Exchange) ou &#034;cl&#233; de v&#233;rification pour l'&#233;change de code&#034; permet &#224; une application d'&#233;viter d'incorporer dans son code le secret de l'application et de le transmettre. Voir : &lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#cledeverificationpourlechangedecodepkce' class='spip_in'&gt;Cl&#233; de v&#233;rification pour l'&#233;change de code (PKCE)&lt;/a&gt;. Beaucoup se l'accordent &#224; dire : ce n'est pas pour autant un apport &#224; la s&#233;curit&#233;. En effet, ceci permet d'&#233;viter de propager un secret, mais n'apporte aucune information nouvelle sur l'identit&#233; de l'application puisque c'est une instance publique qui est ainsi identifi&#233;e. La conformit&#233; au mod&#232;le original n'est pas garantie.&lt;/p&gt;
&lt;p&gt;On pourrait aussi consid&#233;rer que la s&#233;curit&#233; d'une application sans back-end est acquise dans un espace de confiance. On observera alors que la s&#233;curit&#233; d&#233;pend de l'environnement, non de la nature de l'application.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Application &#224; page unique (Single Page Application, SPA)&lt;/h3&gt;
&lt;p&gt;Une application &#224; page unique (SPA) est une application Web qui charge une seule page HTML &#224; partir du serveur Web, puis la met &#224; jour de mani&#232;re dynamique (avec du code Javascript ex&#233;cut&#233; localement) en r&#233;ponse &#224; l'interaction de l'utilisateur et &#224; d'autres &#233;v&#233;nements.&lt;/p&gt;
&lt;p&gt;Plusieurs architectures permettent de cr&#233;er des applications &#224; page unique. La tendance est l'architecture &#034;serveur l&#233;ger&#034;, qui fournit la page initiale contenant du code Javascript qui assurera la logique et les transitions d'&#233;tat de l'application, celle-ci obtenant ses donn&#233;es d'API RESTful prot&#233;g&#233;es par OAuth 2.0.&lt;/p&gt;
&lt;p&gt;Une application &#224; page unique, bien qu'&#233;tant issue d'un serveur, doit &#234;tre consid&#233;r&#233;e comme &#233;tant publique, et non comme une application avec back-end, car tout son code se trouve transf&#233;r&#233; sur l'user-agent. Pour en savoir plus : &lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#oidcetlesapplicationapageuniqueexempledunebellemascarade' class='spip_in'&gt;OIDC et les Application &#224; page unique : exemple d'une belle mascarade !&lt;/a&gt;.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Progressive Web App (PWA)&lt;/h3&gt;
&lt;p&gt;Une PWA se consulte comme un site web classique, depuis une URL s&#233;curis&#233;e. Elle est donc, du point de vue de la protection des donn&#233;es, de type &#034;avec back-end&#034;.&lt;/p&gt;
&lt;p&gt;Si les donn&#233;es prot&#233;g&#233;es sont exclusivement acc&#233;d&#233;es depuis le serveur de l'application (et non depuis le navigateur), et que l'on applique le flux d'autorisation avec code, on se trouve dans une excellente configuration : la PWA offre des fonctionnalit&#233;s proches de celle d'une application native sans les probl&#232;mes de s&#233;curit&#233; que pose une application publique.&lt;/p&gt;
&lt;p&gt;Les PWA offrent tellement d'avantages qu'elles devraient remplacer toutes les applications natives, qu'elles soient install&#233;es sur mobile ou sur desktop.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;AuthentificationClientSansBE&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Certaines m&#233;thode renforcent la s&#233;curit&#233; du flux Authorization Code utilis&#233; par des applications sans back-end&lt;/h3&gt;
&lt;p&gt;L'authentification OpenID Connect concerne la couche applicative. Dans le cas des applications avec back-end, nous avons vu que l'authentification de l'application &#233;tait effective. Mais dans le cas d'applications mobiles ( sans back-end ), nous sommes devant une difficult&#233;. En effet, la notion d'application &#034;publiques&#034; ( sans secret ) interdirait l'authentification de l'application, ouvrant la porte aux applications malveillantes.&lt;/p&gt;
&lt;p&gt;Sans pour autant assurer l'identification des applications sans back-end, il existe des m&#233;thodes renfor&#231;ant la s&#233;curit&#233; du flux Authorization Code :&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Les m&#233;thodes de &#034;fingerprinting&#034; ( qui sont aussi des m&#233;thodes utilis&#233;es pour le tracking ), par exemple &#034;&lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#canvasfingerprinting' class='spip_in'&gt;Canvas fingerprinting&lt;/a&gt;&#034;, identifient l'user-agent et la machine h&#244;te, pas l'application. En fait, l'user-agent est une encapsulation qui fait obstacle &#224; l'identification de l'application l&#233;gitime par le serveur d'authentification.&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; La m&#233;thode &#034;&lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#cledeverificationpourlechangedecodepkce' class='spip_in'&gt;Proof Key for Code Exchange, PKCE&lt;/a&gt;&#034; renforce la s&#233;curit&#233; de la d&#233;livrance des jetons par le contr&#244;leur Token, en v&#233;rifiant que l'application qui demande les jetons est bien celle qui a initi&#233; l'authentification. Il n'y a donc pas non plus identification. De plus, cette m&#233;thode n'est pas applicable &#224; la v&#233;rification par les ressources prot&#233;g&#233;es.&lt;/p&gt;
&lt;p&gt;&lt;img src='https://static.oa.dnc.global/local/cache-vignettes/L8xH11/puce-32883.gif?1733817730' width='8' height='11' class='puce' alt=&#034;-&#034; /&gt; Les m&#233;thodes de type &#034;&lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#proofofpossessionpop' class='spip_in'&gt;Proof of Possession, PoP&lt;/a&gt;&#034;, permettent d'identifier l'application comme &#233;tant bien celle qui a fait l'objet de l'authentification initiale, donc celle qui est l&#233;gitimement associ&#233;e au jeton JWT qu'elle pr&#233;sente aux ressources prot&#233;g&#233;es. Nous classerons dans cette cat&#233;gorie la &lt;a href='https://static.oa.dnc.global/-Authentifier-l-application-.html#liaisondujetonalaconnexiontlstlstokenbinding' class='spip_in'&gt;Liaison du jeton &#224; la connexion TLS (TLS Token Binding)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ces m&#233;thodes r&#233;duisent le risque&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href='#nb5-4' class='spip_note' rel='appendix' title='Le terme anglais utilis&#233; le plus souvent est &#034;mitigate&#034; (attacks) = (...)' id='nh5-4'&gt;4&lt;/a&gt;]&lt;/span&gt; d'un vol de jeton, mais ne permettent pas d'authentifier une application cliente sans back-end.&lt;/p&gt;
&lt;p&gt;Par ailleurs, des syst&#232;mes tels que &lt;a href='https://static.oa.dnc.global/-Identifier-l-utilisateur-final-.html#identificationparopenidconnectdesutilisateursidentifiesaveckerberos' class='spip_in'&gt;Active Directory (Kerberos)&lt;/a&gt; identifient l'utilisateur et la machine h&#244;te au niveau de la couche de communication. Une fois l'authentification effectu&#233;e, toutes les applications ex&#233;cut&#233;es sur la machine du client sont mises sur le m&#234;me plan, bonnes ou malveillantes. La notion de service (un logiciel install&#233; sur une machine et un port) permet d' authentifier une application avec back-end. L'authentification des applications sans back-end n'est pas envisageable.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#034;iot&#034;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Et l'Internet des Objets dans tout cela ?&lt;/h3&gt;
&lt;p&gt;Dans l'Internet des Objets (IOT), les objets sont des agents utilisateurs comme l'est un navigateur ou une application native. Les raisonnement faits sur la confidentialit&#233; des donn&#233;es &#233;chang&#233;es ne sont en rien diff&#233;rents dans le cas des objets : leur logiciel doit &#234;tre fait avec des applications Web (ou des Progressive Web App aussi bien) et mettre en &#339;uvre l'authentification avec Code.&lt;/p&gt;
&lt;p&gt;Les objets peuvent aussi communiquer entre eux. S'ils le font en direct (et non en passant par un serveur, ce qui ram&#232;nerait au cas g&#233;n&#233;ral), les canaux de communication doivent &#234;tre s&#233;curis&#233;s point &#224; point. Une approche serait de consid&#233;rer que l'objet fournisseur de donn&#233;es devra &#234;tre s&#233;curis&#233; exactement comme n'importe quelle ressource prot&#233;g&#233;e, et devra donc v&#233;rifier l'application cliente aupr&#232;s du serveur OIDC.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Une conclusion s'impose&lt;/h3&gt;
&lt;p&gt;L'analyse montre que :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nous ne sommes en mesure d'assurer pleinement la s&#233;curit&#233; des donn&#233;es que dans le cas du flux &#034;Authorization Code&#034; pour des applications &#034;avec back-end&#034;, autrement dit : les applications Web dont les Progressive Web Apps.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ou bien encore :&lt;br class='autobr' /&gt;
&lt;strong&gt;On ne peut faire confiance &#224; un user agent&lt;/strong&gt;.&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id='nb5-1'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh5-1' class='spip_note' title='Notes 5-1' rev='appendix'&gt;1&lt;/a&gt;] &lt;/span&gt;L'attention du lecteur est appel&#233;e sur le risque qu'il y a &#224; lire le paragraphe qui suit au bord d'un gouffre, en traversant la rue ou, plus g&#233;n&#233;ralement, dans toute situation o&#249; un vertige pourrait avoir des cons&#233;quences fatales. J'ai subi un terrible choc le jour o&#249; j'ai lu cela. La th&#233;rapie a consist&#233; &#224; &#233;crire la rubrique dont cet article fait partie.&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb5-2'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh5-2' class='spip_note' title='Notes 5-2' rev='appendix'&gt;2&lt;/a&gt;] &lt;/span&gt;Cependant la connexion peut &#234;tre discontinue, voir les Progressive Web Application (PWA).&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb5-3'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh5-3' class='spip_note' title='Notes 5-3' rev='appendix'&gt;3&lt;/a&gt;] &lt;/span&gt;L'usage commun &#224; de nombreux sites Web consiste &#224; r&#233;duire la notion de 'native&#034; aux applications de mobile d&#233;velopp&#233;es sous iOs ou Android. La RFC 8252 va dans notre sens dans le paragraphe 7.3 en incluant dans les applications natives &#034;celles des syst&#232;mes d'exploitation de bureau&#034;.&lt;/p&gt;
&lt;/div&gt;&lt;div id='nb5-4'&gt;
&lt;p&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href='#nh5-4' class='spip_note' title='Notes 5-4' rev='appendix'&gt;4&lt;/a&gt;] &lt;/span&gt;Le terme anglais utilis&#233; le plus souvent est &#034;mitigate&#034; (attacks) = att&#233;nuer, r&#233;duire (les attaques).&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
