2016-03-08 16 views
8

Tôi đang cố gắng thực hiện các yêu cầu 3-legged authorization để gọi API Twitter trong trình duyệt. Quá trình bắt đầu bằng cách nhận mã thông báo yêu cầu bằng cách BÀI ĐĂNG một yêu cầu đã ký tên đến /oauth/request_token (đây cũng là cách bắt đầu sign in with Twitter).Ủy quyền API Twitter không thành công CORS preflight trong trình duyệt

Vấn đề của tôi là trước khi trình duyệt sẽ POST tới điểm cuối API Twitter, nó muốn preflight the request với phương pháp OPTIONS. Yêu cầu preflight này luôn trả về trạng thái 400 (Yêu cầu không hợp lệ).

Dưới đây là một ví dụ mà bạn có thể cắt và dán vào trình duyệt giao diện điều khiển hỗ trợ 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' }); 

Mở Chrome, yêu cầu preflight trông như thế này (Firefox là tương tự):

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 

Và phản ứng preflight trông như thế này:

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 

Lưu ý rằng proble m là không phải mà tôi đã không chỉ định tiêu đề ủy quyền thực trong ví dụ ở trên. Giá trị của tiêu đề ủy quyền không được sử dụng trong yêu cầu preflight.

Nếu tôi in các thành phần của yêu cầu POST vào bảng điều khiển và lắp ráp các phần thành lệnh curl (không preflight) thì tôi có thể nhận mã thông báo yêu cầu. Nhưng nếu tôi cố gắng mô phỏng theo yêu cầu preflight trong curl, tôi đã không thể nhận được rằng để làm việc:

$ 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 

gì là tôi thiếu mà sẽ cho phép tôi làm một CORS preflight thành công để https://api.twitter.com/oauth/request_token?

Trả lời

21

Vì vậy, độ phân giải không hài lòng dường như là Twitter API does not support CORS. Điều này có vẻ hơi đáng kinh ngạc với tôi, vì nó có nghĩa là API không thể được sử dụng từ trình duyệt.

Quyết định chính sách đó có thể liên quan đến việc triển khai OAuth của họ, là vulnerable to anyone with access to the calling platform. Có lẽ điều đó đã ổn vào năm 2010, nhưng hầu hết những người chơi internet lớn khác đã tìm ra how to do client-based authorization.

+0

Ồ, tôi đang đọc một năm sau đó cho một ứng dụng đồ chơi và vẫn không có vẻ được giải quyết. Cảm ơn bạn đã nêu chi tiết tại đây! – tsps

+0

Bất kỳ cách giải quyết nào? – foobarbecue

Các vấn đề liên quan