Cette question ne relève probablement pas d'un seul groupe de développeurs, mais l'implémentation Esri-Leaflet est l'objectif final ultime, et elle a probablement des développeurs les plus familiers avec la stack - alors voici :<\/P>
<\/P>
J'ai une situation avec un serveur ArcGIS autonome, et je souhaite accéder à des services de fonctionnalités sécurisés. Mon site fonctionne sous PHP 7.3, et a accès à cURL. Idéalement, je voudrais récupérer le token en utilisant des identifiants stockés en PHP, via cURL, puis transmettre ce token à Esri-Leaflet lorsque je fais un addtomap, gardant ainsi les identifiants sécurisés. <\/P>
L'erreur à laquelle je fais face en réponse à la requête est plutôt générique :<\/P>
{"error":{"code":498,"message":"Invalid Token","details":[]}}<\/P><\/BLOCKQUOTE> <\/P>Temporairement il y a une url ici :<\/P>http:\/\/52.65.144.150\/esri-js-demo-page\/<\/A><\/P> <\/P>Alors, qu'ai-je fait jusqu'à présent ? Utilisons un service esri demo sécurisé pour illustrer, en notant que j'ai laissé des sections commentées où j'ai soit :<\/P>Essayé de définir manuellement le referer afin que cURL utilise le même referer que celui transmis par le site (espérons-le). Cela incluait la page appelant la carte, comme vu en regardant le referer des requêtes dans Chrome, et aussi en s'assurant que le referer affiché par php correspondait à celui envoyé par Chrome. Globalement je ne veux pas utiliser cette approche car je souhaite que plusieurs pages utilisent ce bout de php.<\/LI>Essayé d'utiliser les adresses IP des visiteurs à la place. Cela a généré un token mais a abouti au même problème de token invalide. Mon organisation peut aussi forcer les requêtes à sortir de différents points d'accès, donc c'est un point possible d'instabilité.<\/LI>Essayé de définir le referer en utilisant d'autres méthodes PHP telles que $_SERVER['HTTP_REFERER'];<\/LI>Vous pouvez aussi voir mon regex pour analyser les tokens - cela extrait juste le reste de la réponse pour ne garder que la chaîne du token. {".,}. Je ne transmets donc pas une expiration au serveur lors de la requête de couche - je ne vois dans aucune documentation que c'est requis.<\/LI><\/UL> <\/P> <\/P> <?php
{"error":{"code":498,"message":"Invalid Token","details":[]}}<\/P><\/BLOCKQUOTE>
Temporairement il y a une url ici :<\/P>
http:\/\/52.65.144.150\/esri-js-demo-page\/<\/A><\/P> <\/P>Alors, qu'ai-je fait jusqu'à présent ? Utilisons un service esri demo sécurisé pour illustrer, en notant que j'ai laissé des sections commentées où j'ai soit :<\/P>Essayé de définir manuellement le referer afin que cURL utilise le même referer que celui transmis par le site (espérons-le). Cela incluait la page appelant la carte, comme vu en regardant le referer des requêtes dans Chrome, et aussi en s'assurant que le referer affiché par php correspondait à celui envoyé par Chrome. Globalement je ne veux pas utiliser cette approche car je souhaite que plusieurs pages utilisent ce bout de php.<\/LI>Essayé d'utiliser les adresses IP des visiteurs à la place. Cela a généré un token mais a abouti au même problème de token invalide. Mon organisation peut aussi forcer les requêtes à sortir de différents points d'accès, donc c'est un point possible d'instabilité.<\/LI>Essayé de définir le referer en utilisant d'autres méthodes PHP telles que $_SERVER['HTTP_REFERER'];<\/LI>Vous pouvez aussi voir mon regex pour analyser les tokens - cela extrait juste le reste de la réponse pour ne garder que la chaîne du token. {".,}. Je ne transmets donc pas une expiration au serveur lors de la requête de couche - je ne vois dans aucune documentation que c'est requis.<\/LI><\/UL> <\/P> <\/P> <?php
Alors, qu'ai-je fait jusqu'à présent ? Utilisons un service esri demo sécurisé pour illustrer, en notant que j'ai laissé des sections commentées où j'ai soit :<\/P>
<?php
Fixed by treating the json object as json properly.
<SPAN class="delimiter token"><?php</SPAN> <SPAN class="comment token">//Establish our requesting url</SPAN> <SPAN class="keyword token">global</SPAN> <SPAN class="variable token">$wp</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="variable token">$RequestingPage</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="token function">home_url</SPAN><SPAN class="punctuation token">(</SPAN> <SPAN class="variable token">$wp</SPAN><SPAN class="operator token">-</SPAN><SPAN class="operator token">></SPAN><SPAN class="property token">request</SPAN> <SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="comment token">//Check to see if the request came from the proper application</SPAN> <SPAN class="comment token">//The url to the token endpoint of the server containing the secure service</SPAN> <SPAN class="variable token">$url</SPAN> <SPAN class="operator token">=</SPAN> "https<SPAN class="punctuation token">:</SPAN><SPAN class="comment token">//someplace.com/arcgis/tokens/";</SPAN> <SPAN class="comment token">//The fields included in the request</SPAN> <SPAN class="variable token">$fields</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">array</SPAN><SPAN class="punctuation token">(</SPAN> <SPAN class="string token">'request'</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> <SPAN class="string token">'getToken'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'username'</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> <SPAN class="string token">'username1'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'password'</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> <SPAN class="string token">'password1'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'expiration'</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> <SPAN class="number token">120</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'clientid'</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> <SPAN class="string token">'ref.'</SPAN> <SPAN class="punctuation token">.</SPAN> <SPAN class="variable token">$RequestingPage</SPAN> <SPAN class="punctuation token">.</SPAN> <SPAN class="string token">'/'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'f'</SPAN> <SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN> <SPAN class="string token">'json'</SPAN> <SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="variable token">$fields_string</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="string token">""</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="keyword token">foreach</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="variable token">$fields</SPAN> <SPAN class="keyword token">as</SPAN> <SPAN class="variable token">$key</SPAN><SPAN class="operator token">=</SPAN><SPAN class="operator token">></SPAN><SPAN class="variable token">$value</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="variable token">$fields_string</SPAN> <SPAN class="punctuation token">.</SPAN><SPAN class="operator token">=</SPAN> <SPAN class="variable token">$key</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="string token">'='</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="variable token">$value</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="string token">'&'</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="comment token">//Instantiate Curl</SPAN> <SPAN class="variable token">$ch</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="token function">curl_init</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="variable token">$url</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="token function">curl_setopt</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="variable token">$ch</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="token constant">CURLOPT_SSL_VERIFYPEER</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="token boolean">false</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="token function">curl_setopt</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="variable token">$ch</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="token constant">CURLOPT_POST</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="token function">count</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="variable token">$fields</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="token function">curl_setopt</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="variable token">$ch</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="token constant">CURLOPT_POSTFIELDS</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="variable token">$fields_string</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="token function">curl_setopt</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="variable token">$ch</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="token constant">CURLOPT_RETURNTRANSFER</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="token boolean">true</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="token function">curl_setopt</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="variable token">$ch</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="token constant">CURLOPT_REFERER</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="variable token">$RequestingPage</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="variable token">$result</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="token function">curl_exec</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="variable token">$ch</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="comment token">//If Curl was not instantiated successfully</SPAN> <SPAN class="keyword token">if</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="operator token">!</SPAN><SPAN class="token function">curl_exec</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="variable token">$ch</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="keyword token">echo</SPAN> <SPAN class="string token">'An error has occurred: '</SPAN> <SPAN class="punctuation token">.</SPAN> <SPAN class="token function">curl_error</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="variable token">$ch</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="comment token">//Otherwise return the result</SPAN> <SPAN class="keyword token">else</SPAN> <SPAN class="punctuation token">{</SPAN> <SPAN class="comment token">//Treat the response as JSON, and split by attribute.</SPAN> <SPAN class="variable token">$someObject</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="token function">json_decode</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="variable token">$result</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="keyword token">echo</SPAN> '<SPAN class="markup token"><SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"><</SPAN>script</SPAN> <SPAN class="attr-name token">type</SPAN><SPAN class="attr-value token"><SPAN class="punctuation token">=</SPAN><SPAN class="punctuation token">"</SPAN>text/javascript<SPAN class="punctuation token">"</SPAN></SPAN><SPAN class="punctuation token">></SPAN></SPAN></SPAN>'<SPAN class="punctuation token">;</SPAN> <SPAN class="keyword token">echo</SPAN> <SPAN class="string token">"\r\n"</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="keyword token">echo</SPAN> <SPAN class="string token">'var val = "'</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="variable token">$someObject</SPAN><SPAN class="operator token">-</SPAN><SPAN class="operator token">></SPAN><SPAN class="property token">token</SPAN> <SPAN class="punctuation token">.</SPAN><SPAN class="string token">'"'</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="keyword token">echo</SPAN> <SPAN class="string token">"\r\n"</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="keyword token">echo</SPAN> '<SPAN class="markup token"><SPAN class="token tag"><SPAN class="token tag"><SPAN class="punctuation token"></</SPAN>script</SPAN><SPAN class="punctuation token">></SPAN></SPAN></SPAN>'<SPAN class="punctuation token">;</SPAN> <SPAN class="keyword token">echo</SPAN> <SPAN class="string token">"\r\n"</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="comment token">//Close Curl</SPAN> <SPAN class="token function">curl_close</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="variable token">$ch</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="punctuation token">}</SPAN> <SPAN class="token function">add_action</SPAN><SPAN class="punctuation token">(</SPAN> <SPAN class="string token">'wp_head'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'ple_hook_javascript'</SPAN> <SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
This works out for me. Thanks Simon
Glad it helped!
I guess what I didn't mention in my initial series of posts was that the script returns the variable "var" which contains the token. When collecting a layer with ESRI-Leaflet you can supply this token as part of the URL. Just for anyone else who happens upon this in the future.
Les membres connectés peuvent publier, suivre les mises à jour, et plus encore. Nouveau ici ? Inscrivez-vous gratuitement.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.