2017-02-07 3 views
0

Я размещаю одностраничное приложение для хостинга Firebase, и мне нужно разрешить перекрестный запрос домена к движку приложения. Приложение размещено на project-id.firebaseapp.com и службе движка приложения на project-id.appspot.com. Я краю deployment documentation, и нет примера, как добавить заголовок Access-Control-Allow-Origin для URL.Firebase хостинг Access-Control-Allow-Origin для URL-адреса приложения URL

Вот что мой firebase.json выглядит следующим образом:

{ 
    "database": { 
    "rules": "database.rules.json" 
    }, 
    "hosting": { 
    "public": "public", 
    "redirects": [ 
     { 
     "source": "/server/:rest*", 
     "destination": "https://app-id.appspot.com/:rest*", 
     "type": 301 
     } 
    ], 
    "rewrites": [ 
     { 
     "source": "/views/**", 
     "destination": "/views/**" 
     }, 
     { 
     "source": "**", 
     "destination": "/index.html" 
     } 
    ], 
    "headers": [ { 
     "source" : "https://app-id.appspot.com/registration/generate", 
     "headers" : [ { 
     "key" : "Access-Control-Allow-Origin", 
     "value" : "*" 
     } ] 
    } ] 
    } 
} 

Я попытался установить CORS с помощью gsutils, но это не помогло, а также:

Вот мой cors.json

[ 
    { 
     "maxAgeSeconds": 3600, 
     "method": ["GET", "POST"], 
     "origin": ["https://project-id.appspot.com/"] 
    } 
] 

заранее спасибо

РЕШЕНИЕ:

Если вы хотите разрешить CORS для статических файлов, тогда достаточно установить заголовок Access-Control-Allow-Origin в приложении app.yaml. Этот заголовок не разрешается находиться в app.yaml для динамических запросов, поэтому вам придется добавлять его программно.

Если ваш запрос является простым, то следующий код работает:

@Override 
public void doPost(HttpServletRequest req, HttpServletResponse resp) 
    resp.addHeader("Access-Control-Allow-Origin", "*"); 
    resp.addHeader("Content-Type", "text/csv"); 
    resp.getWriter().append("Response"); 

} 

Однако, если ваш запрос заранее маршевой вам придется переопределить метод doOptions и добавьте соответствующие заголовки:

@Override 
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    resp.addHeader("Access-Control-Allow-Origin", "*"); 
    resp.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); 
    resp.addHeader("Access-Control-Allow-Headers", "Content-Type"); 
} 

@Override 
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
    resp.addHeader("Access-Control-Allow-Origin", "*"); 
    resp.addHeader("Content-Type", "text/csv"); 
    resp.getWriter().append("Response"); 
} 

Here является полезной схемой, которая проясняет реализацию CORS на сервере:

ответ

2

Ваш firebase.json не контролирует appspot.com подает d не может использоваться для изменения заголовков из службы движка вашего приложения. Здесь вы пытались установить Access-Control-Allow-Origin на https://app-id.appspot.com/registration/generate. Это не сработает, так как это не страница, размещенная на Firebase Hosting.

Вместо этого, как вы бы добавить заголовок к Firebase странице будет поместить его в firebase.json так:

"headers": [ { 
    "source" : "index.html", 
    "headers" : [ { 
    "key" : "Access-Control-Allow-Origin", 
    "value" : "*" 
    } ] 
} ] 

Но это не собирается помочь с вопросом CORS, так как оно должен быть на месте on the returned resource.

Похоже, вы можете поместить его в свой app.yaml под handlers на основе this doc.

handlers: 
- url: /.* 
    http_headers: 
    Access-Control-Allow-Origin: http://mygame.appspot.com 

Кроме того, вы можете добавить это программно. Как объяснялось на enable-cors.орг, вот некоторые реализации сценария:

Для приложений Python на базе в Google App Engine, метод self.response.headers.add_header() может быть использован, например:

class CORSEnabledHandler(webapp.RequestHandler): 
    def get(self): 
    self.response.headers.add_header("Access-Control-Allow-Origin", "*") 
    self.response.headers['Content-Type'] = 'text/csv' 
    self.response.out.write(self.dump_csv()) 

Для приложений Java на базе, используйте resp.addHeader():

public void doGet(HttpServletRequest req, HttpServletResponse resp) { 
    resp.addHeader("Access-Control-Allow-Origin", "*"); 
    resp.addHeader("Content-Type", "text/csv"); 
    resp.getWriter().append(csvString); 
} 

И для приложений Go основе, используйте w.Header().Add():

func doGet(w http.ResponseWriter, r *http.Request) { 
    w.Header().Add("Access-Control-Allow-Origin", "*") 
    w.Header().Add("Content-Type", "text/csv") 
    fmt.Fprintf(w, csvData) 
}