rommsen / plesynd

HTML5 Personal Learning Environment with Offline Capabilities
MIT License
8 stars 1 forks source link

Requests von Wookie Widgets an Server funktionieren nicht #39

Closed rommsen closed 12 years ago

rommsen commented 12 years ago

Problem: Same-Origin-Policy

rommsen commented 12 years ago

Es gibt die Möglichkeit ein widget.proxify zu machen (widget ist ein von Wookie gestellter Service). Leider gibt es hier scheinbar Probleme mit bestimmten Response Codes: http://markmail.org/search/?q=list:wookie#query:list%3Awookie+page:1+mid:fkfwfv7rmbtysqrc+state:results

Ausserdem ist das nicht offizielle W3C Api

rommsen commented 12 years ago

Funktioniert über Cors: https://developer.mozilla.org/en-US/docs/HTTP_access_control http://www.html5rocks.com/en/tutorials/cors/?redirect_from_locale=de www.w3.org/TR/access-control/

In jeder Methode muss hierbei der Access-Control-Allow-Origin Header übergeben werden

return View::create($todos, HttpCodes::HTTP_OK, array(
            'Access-Control-Allow-Origin' => '*',
        ));

Ausserdem gib es noch den Preflight Request, welcher abfragt was erlaubt ist. Dieser kann so implementiert werden:

/**
     * @Route("/{id}.{_format}", defaults={"id" = null, "_format" = "~"}, name="options_todos")
     * @Method({"OPTIONS"})
     */
    public function optionsTodoAction()
    {
        return View::create(null, HttpCodes::HTTP_OK, array(
            'Access-Control-Allow-Methods' => 'POST, GET, PUT, DELETE, OPTIONS',
            'Access-Control-Allow-Origin' => '*',
            'Access-Control-Allow-Headers' => 'X-REQUESTED-WITH, content-type'));

    }
rommsen commented 12 years ago

Ich habe das jetzt durch das NelmioCorsBundle: realisiert

Das Bundle implementiert einen Listener, der die ganzen Header setzt. Dadurch wird auch die options Action unnötig. Hier meine Einstellungen. Da ein Cors Request nur die folgenden Header an den Client Exposed: Cache-Control,Content-Language,Content-Type, Expires,Last-Modified, Pragma (http://www.html5rocks.com/en/tutorials/cors/?redirect_from_locale=de) und ich den Location Header im Post Fall benötige, muss dieser noch exposed werden.

nelmio_cors:
    paths:
        '^/todo/api/todos':
            allow_origin: ['*']
            allow_headers: ['X-REQUESTED-WITH', 'Content-Type']
            allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS'],
            # Location Header is used for POST Request Answers (URI of created Item
            expose_headers: ['Location']
            max_age: 3600