2016-03-08 9 views
8

मैं ब्राउज़र में ट्विटर एपीआई को कॉल करने के लिए 3-legged authorization करने की कोशिश कर रहा हूं। प्रक्रिया /oauth/request_token पर हस्ताक्षरित अनुरोध पोस्ट करके अनुरोध टोकन प्राप्त करने के साथ शुरू होती है (यह भी sign in with Twitter शुरू होता है)।ट्विटर एपीआई प्राधिकरण ब्राउज़र में सीओआरएस प्रीफलाइट में विफल रहता है

मेरी समस्या यह है कि ब्राउज़र ट्विटर एपीआई एंडपॉइंट पर पोस्ट करने से पहले, यह एक विकल्प विधि के साथ preflight the request चाहता है। यह प्रीफलाइट अनुरोध हमेशा स्थिति 400 (खराब अनुरोध) लौटा रहा है।

यहाँ एक उदाहरण है कि आप को कट करके ब्राउज़र कंसोल लायें API का समर्थन करने में पेस्ट कर सकते हैं:

fetch('https://api.twitter.com/oauth/request_token', { method: 'POST', mode: 'cors', headers: new Headers({ authorization: 'xxx' }), body: 'oauth_callback=http%3A%2F%2Flocalhost%2F' }); 

Chrome पर, preflight अनुरोध इस तरह दिखता है (फ़ायरफ़ॉक्स समान है):

OPTIONS /oauth/request_token HTTP/1.1 
accept:*/* 
accept-encoding:gzip, deflate, sdch 
accept-language:en-US,en;q=0.8 
access-control-request-headers:authorization, content-type 
access-control-request-method:POST 
cache-control:no-cache 
origin:null 
pragma:no-cache 
user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36 

HTTP/1.1 400 Bad Request 
content-length: 0 
date: Tue, 08 Mar 2016 22:21:37 GMT 
server: tsa_a 
x-connection-hash: 529e3d8338caeb980077637d86db5df1 

कि समस्याओं के नोट:

और preflight प्रतिक्रिया इस तरह दिखता है मी है कि मैंने ऊपर दिए गए उदाहरण में वास्तविक प्राधिकरण शीर्षलेख निर्दिष्ट नहीं किया है। प्राधिकरण शीर्षलेख का मान प्रीफलाइट अनुरोध में उपयोग नहीं किया जाता है।

यदि मैं कंसोल पर अपने POST अनुरोध के घटकों को मुद्रित करता हूं और टुकड़ों को एक कर्ल कमांड (जो प्रीफलाइट नहीं करता) में इकट्ठा करता है तो मुझे टोकन का अनुरोध मिल सकता है। लेकिन अगर मैं कर्ल में preflight अनुरोध को दिखाने का प्रयास करते हैं, मुझे लगता है कि काम करने के लिए प्राप्त करने में सक्षम नहीं किया गया है:

$ curl -v -X OPTIONS -H "access-control-request-headers:authorization,content-type" -H "access-control-request-method:POST" -H "origin:http://example.com" https://api.twitter.com/oauth/request_token 
* Trying 199.59.148.20... 
* Connected to api.twitter.com (199.59.148.20) port 443 (#0) 
* ALPN, offering http/1.1 
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH 
* successfully set certificate verify locations: 
* CAfile: /opt/local/share/curl/curl-ca-bundle.crt 
    CApath: none 
* TLSv1.2 (OUT), TLS header, Certificate Status (22): 
* TLSv1.2 (OUT), TLS handshake, Client hello (1): 
* TLSv1.2 (IN), TLS handshake, Server hello (2): 
* TLSv1.2 (IN), TLS handshake, Certificate (11): 
* TLSv1.2 (IN), TLS handshake, Server key exchange (12): 
* TLSv1.2 (IN), TLS handshake, Server finished (14): 
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16): 
* TLSv1.2 (OUT), TLS change cipher, Client hello (1): 
* TLSv1.2 (OUT), TLS handshake, Finished (20): 
* TLSv1.2 (IN), TLS change cipher, Client hello (1): 
* TLSv1.2 (IN), TLS handshake, Finished (20): 
* SSL connection using TLSv1.2/ECDHE-ECDSA-AES128-GCM-SHA256 
* ALPN, server accepted to use http/1.1 
* Server certificate: 
* subject: C=US; ST=CA; L=San Francisco; O=Twitter, Inc.; OU=Twitter Security; CN=api.twitter.com 
* start date: Aug 11 00:00:00 2015 GMT 
* expire date: Aug 15 12:00:00 2016 GMT 
* subjectAltName: api.twitter.com matched 
* issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=DigiCert SHA2 High Assurance Server CA 
* SSL certificate verify ok. 
> OPTIONS /oauth/request_token HTTP/1.1 
> Host: api.twitter.com 
> User-Agent: curl/7.47.1 
> Accept: */* 
> access-control-request-headers:authorization,content-type 
> access-control-request-method:POST 
> origin:http://example.com 
> 
< HTTP/1.1 400 Bad Request 
< content-length: 0 
< date: Tue, 08 Mar 2016 23:06:44 GMT 
< server: tsa_a 
< x-connection-hash: 66174829ef6d3f5e5ec641ac080ad19c 
< 
* Connection #0 to host api.twitter.com left intact 

क्या कर रहा हूँ मुझे याद आ रही है कि मुझे https://api.twitter.com/oauth/request_token के लिए एक सफल CORS preflight करने देंगे?

उत्तर

21

तो असंतोषजनक संकल्प ऐसा लगता है कि Twitter API does not support CORS। यह मेरे लिए थोड़ा आश्चर्यजनक प्रतीत होता है, क्योंकि इसका मतलब है कि एपीआई ब्राउज़र से उपयोग नहीं किया जा सकता है।

वह नीति निर्णय शायद उनके ओएथ कार्यान्वयन से संबंधित है, जो vulnerable to anyone with access to the calling platform है। हो सकता है कि 2010 में ठीक था, लेकिन अन्य प्रमुख इंटरनेट खिलाड़ियों ने how to do client-based authorization का पता लगाया है।

+0

ओह वाह, मैं इसे एक साल बाद खिलौना ऐप के लिए पढ़ रहा हूं और अभी भी हल नहीं किया जा रहा है। इसे यहां विस्तारित करने के लिए धन्यवाद! – tsps

+0

कोई कामकाज? – foobarbecue

संबंधित मुद्दे