2016-03-08 7 views
8

Sto provando a fare lo 3-legged authorization necessario per chiamare le API di Twitter in un browser. Il processo inizia con l'ottenimento di un token di richiesta tramite POST di una richiesta firmata a /oauth/request_token (questo è anche il modo in cui inizia sign in with Twitter).L'autorizzazione dell'API di Twitter non riesce il preflight CORS nel browser

Il mio problema è che prima che il browser esegua il POST sull'endpoint dell'API di Twitter, vuole preflight the request con un metodo OPTIONS. Questa richiesta di preflight restituisce sempre lo stato 400 (Richiesta non valida).

Ecco un esempio che è possibile tagliare e incollare in una console browser che supporti l'API Fetch:

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' }); 

Su Chrome, la richiesta di verifica preliminare si presenta così (Firefox è simile):

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 

E la risposta di preflight assomiglia a questo:

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 

noti che proble m è non che non ho specificato una vera intestazione di autorizzazione nell'esempio sopra. Il valore dell'intestazione dell'autorizzazione non viene utilizzato nella richiesta di verifica preliminare.

Se stampo i componenti della mia richiesta POST sulla console e assembliamo i pezzi in un comando di arricciatura (che non esegue il preflight), posso ottenere un token di richiesta. Ma se provo a simulare la richiesta di verifica preliminare in ricciolo, non sono stato in grado di ottenere quello per funzionare:

$ 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 

Che cosa mi manca che mi permetta di fare un successo preflight CORS per https://api.twitter.com/oauth/request_token?

risposta

21

Quindi la risoluzione insoddisfacente sembra essere quella del Twitter API does not support CORS. Questo mi sembra un po 'stupefacente, poiché significa che l'API non può essere utilizzata da un browser.

Questa decisione politica è probabilmente correlata alla loro implementazione OAuth, che è vulnerable to anyone with access to the calling platform. Forse era okay nel 2010, ma la maggior parte degli altri principali giocatori di internet ha capito how to do client-based authorization.

+0

Oh wow, sto leggendo questo un anno dopo per un'app giocattolo e ancora non sembra essere risolto. Grazie per aver dettagliato questo qui! – tsps

+0

Eventuali soluzioni alternative? – foobarbecue

Problemi correlati