Skip to content

Cross Origin Resource Sharing (CORS)

benoitc edited this page Nov 10, 2012 · 2 revisions

Introducing CORS

By supporting CORS functionality, a RCouch instance can accept direct connections to protected DBs and instances, without the browser functionality being blocked due to the same origin constraint. CORS is http://caniuse.com/cors today on over 90% of browsers.

Features

  • Simple requests for a couchdb instance
  • Preflight requests for a couchdb instance
  • Configuration for a specific CouchDB vhost
  • All origins are excluded by default

Configuration

Enabling CORS

To enable CORS support, you need to set the option enable_cors = true in the [httpd] section of local.ini, and [cors] section with origins = *. Note that by default, no origins are accepted, you must either use a wildcard or whitelist.

[httpd]
enable_cors = true

[cors]
origins = *

Tightening Access

Restricting by Protocol, Host and optional Port

[cors]
; List of origins, separated by a comma (protocol, host, port)
; refer to http://tools.ietf.org/html/rfc6454 for specification
origins = http://home.muse.net.nz:8000, https://localhost, http://www.number10.gov.uk:80

Restricting Accepted Methods

[cors]
; List of accepted methods, comma-separated
; refer to http://tools.ietf.org/html/rfc2616, rfc2817, rfc5789
methods = GET, POST, PUT, DELETE

Restricting Accepted Headers

[cors]
; List of accepted headers separated by a comma
headers = TODO

Securing at the VHOST level

TODO

To set the options for a vhost, you will need to create a section with the vhost name prefixed by "cors:" . Ex for the vhost example.com:

; Configuration for a vhost
;[cors:example.com]
; credentials = false
; List of origins separated by a comma
;origins =
; List of accepted headers separated by a comma
; headers =
; List of accepted methods
; methods =

== Credentials ==

TODO

Testing Your Implementation

The following snippet was lifted from http://www.html5rocks.com/en/tutorials/cors|html5rocks CORS tutorial:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Testing CORS</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <meta author="http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server">
    <meta license="Apache 2.0">
    <script>
      
      // Create the XHR object.
      function createCORSRequest(method, url) {
        var xhr = new XMLHttpRequest();
        if ("withCredentials" in xhr) {
          // XHR for Chrome/Firefox/Opera/Safari.
          xhr.open(method, url, true);
        } else if (typeof XDomainRequest != "undefined") {
          // XDomainRequest for IE.
          xhr = new XDomainRequest();
          xhr.open(method, url);
        } else {
          // CORS not supported.
          xhr = null;
        }
        return xhr;
      }

      // Make the actual CORS request.
      function makeCorsRequest(uri) {
        console.log("got uri: " + uri);
        var xhr = createCORSRequest('GET', uri);
        if (!xhr) {
          alert('CORS not supported');
          return;
        }

        // Response handlers.
        xhr.onload = function() {
          console.log('Response from CORS request to ' + uri + ': ' + xhr.responseText);
        };

        xhr.onerror = function() {
          console.log('Woops, there was an error making the request to ' + uri + '.');
        };

        xhr.send();
      }
      
      $(document).ready(function() {
        makeCorsRequest('http://my.couchdb.org:5984/');
        });
  </script>
  </head>
  <body>
  </body>
</html>

Reference Materia

This image is from the excellent http://www.html5rocks.com/en/tutorials/cors/ CORS tutorial.

cors flow

CORS References

Client-side CORS support and usage

Note that at least IE >= 8 does not support pre-flight.

Clone this wiki locally