개발 이야기/Firebase
Firebase cors 문제 해결하기
토리토!
2019. 2. 14. 18:04
Firebase로 Host 중인 사이트에 도메인을 지정함.
Firebase의 Cloud Function을 쓰면 cors 이슈가 나옴.
1. 먼저 firebase로 호스팅중인 소스의 firebase.json 파일에 크로스 도메인 이슈를 해결하기 위한
헤더를 추가함. headers 부분임.
{
"hosting": {
"public": "public",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"headers": [ {
"source" : "**",
"headers" : [ {
"key" : "Access-Control-Allow-Origin",
"value" : "*"
}]
}]
}
}
2. 작업중인 firebase의 함수 프로젝트의 functions 폴더로 이동해서 아래 명령어 실행
npm install cors --save
그럼 자동으로 함수 프로젝트의 package.json 파일의 dependencies에 cors가 추가됨.
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"serve": "firebase serve --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"dependencies": {
"cors": "^2.8.5", <==이렇게 추가됨.
"firebase-admin": "~7.0.0",
"firebase-functions": "^2.2.0"
},
"private": true
}
3. 클라우드 함수를 작성하는 index.js파일에 cors 추가
const cors = require('cors')({
origin: true
});
4. 클라우드 함수의 호출 방식에 따라서 cors 적용 유무가 다름
onRequest 함수의 경우 cors를 처리해야함. (브라우저에서 ajax를 이용해서 get, post 방식으로 함수를 실행하는 경우)
exports.helloWorld = functions.https.onRequest((request, response) => {
cors(request, response, ()=>{
response.send("Hello from Firebase!");
});
});
onCall 함수의 경우 cors 처리를 하면 안됨. (브라우저에서 firebase function객체로 호출하는경우)
exports.helloWorld2 = functions.https.onCall((data, context) => {
return {msg:"Hello from Firebase!"};
});
위의 규칙이 꼬이면 internal 에러나 cors에러가 계속 남.