1

Ich versuche, die Uber-API in meinem JavaScript-Client zu verwenden.Ubers API gibt 404 während der CORS-Preflight-Anforderung zurück

Ich bin mir bewusst, dass dieser CORS beinhaltet, da mein Mandant den Uber-API direkt über AJAX zugreifen.

Im Uber-Entwickler-Dashboard legte ich meine Origin-URI richtig fest. Dann stellte ich das einfachste Beispiel auf, das ich finden konnte. Das kam von Uber die docs:

<!DOCTYPE html> 
<html> 

<head> 
    <title>Uber API Demo</title> 
</head> 

<body> 
    <script> 
     var xhr = new XMLHttpRequest(); 
     xhr.open('GET', 'https://api.uber.com/v1.2/products?latitude=37.7759792&longitude=-122.41823'); 
     xhr.setRequestHeader("Authorization", "Token <ServerToken>"); 
     xhr.send(); 
    </script> 
</body> 

</html> 

in Chrome Dev-Tools auf der Konsole sucht, ist hier, was ich sehe:

Dev Tools Console

Und interessanteste, auf die Registerkarte Netzwerk:

Dev Tools Network

Mein Browser meines HTTP POST in eine HTTP-OPTIONS-Anforderung (Teil der CORS Preflight in th definiert verändert e holen spec), die es aussieht wie Uber nicht unterstützt. Der Uber-Server sollte mit den Antwortheadern antworten und meinen Client autorisieren, seine API-Anfrage zu beenden. Stattdessen werden sie einen 404.

Zusammengefasst Rückkehr:

  • Uber die docs sagen, sie CORS unterstützen.
  • Ich habe meine Herkunft URI korrekt in Uber's Developer Dashboard
  • Die CORS-Spezifikation sagt, wenn ich einen HTTP-POST mit Authorization-Header, das ist eine nicht einfache Anfrage und erfordert die HTTP-OPTIONEN Preflight.
  • Mein Browser tut genau das, eine Anforderung mit HTTP-Methode Sendeoptionen, die den Origin-Header enthalten (die die Herkunft URI Satz in meiner Uber Entwickler-Dashboard übereinstimmt.)
  • Uber kehrt Status 404 (nicht gefunden)

Wer weiß, was hier vor sich geht?

+0

Wenn alles andere fehlschlägt, richten Sie einen Proxy auf einem Server ein, den Sie steuern – charlietfl

Antwort

1

Wenn Anfragen für API-Endpunkte vom Frontend Uber JavaScript-Code in einem Browser ausgeführt wird, anstatt eine Authorization Header auf die Anforderung des Hinzufügens, benötigen Sie einen access_token Abfrageparameter an die Anforderungs-URL hinzuzufügen, wie folgt aus:

https://api.uber.com/v1.2/products?access_token=<TOKEN>&latitude=XXX&longitude=XXX 

Siehe https://developer.uber.com/docs/trip-experiences/guides/authentication#use-bearer-token

Uber die docs sagen, sie unterstützen CORS

Ja, die Dokumente sind nicht ganz korrekt bei der Behauptung.

Mein Browser meines HTTP POST in eine HTTP-OPTIONS-Anforderung ändert ...

genauer zu sein: Der Browser ist die POST in ein OPTIONS zu ändern; Stattdessen macht der Browser eine OPTIONS Anfrage vor versuchen Sie Ihre POST Anfrage.Und der Grund, warum der Browser das tut, ist, dass Ihr Code einen Authorization Header zu der Anfrage hinzufügt.

(Teil der CORS Preflight in der Spezifikation holen definiert), die es wie Uber sieht nicht unterstützt

Recht. Und das ist, wo der Anspruch in den Uber-API-Dokumenten, dass sie CORS unterstützen, nicht ganz genau ist. Sie unterstützen CORS tatsächlich nicht vollständig; Insbesondere unterstützen ihre API-Endpunkte die Behandlung von CORS Preflight OPTIONS Anfragen überhaupt nicht.

Und Hinzufügen einer Authorization Header zu einer Anfrage von Frontend JavaScript in einem Browser ausgeführt wird, führt der Browser eine Preflight Anfrage.

Da die Uber-API-Endpunkte dies nicht unterstützen, können Sie keine Anforderungen von Frontend-JavaScript-Code an Uber-API-Endpunkte stellen. Verwenden Sie dazu einen Anforderungsheader Authorization, um die Anmeldeinformationen bereitzustellen. Sie müssen stattdessen den Abfrageparameter access_token zur Anforderungs-URL hinzufügen.

Verwandte Themen