Ошибка CORS в базе данных httpsCallable в приложении Create React - PullRequest
0 голосов
/ 01 апреля 2020

решено - см. Мой ответ ниже.

Вызываемая функция вызывает ошибку CORS, например:

Доступ к выборке в 'https://us-central1-careerhub-a50a2.cloudfunctions.net/createUser' из origin 'http://localhost: 3000 ' заблокирован политикой CORS: Ответ на предпечатный запрос не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin» , Если непрозрачный ответ отвечает вашим потребностям, установите режим запроса «no-cors», чтобы получить ресурс с отключенным CORS.

Код функции:

exports.createUser = functions.https.onCall((data, context) => {
    const email = data.email
    const password = data.password

    admin.auth().createUser({
        email: email,
        emailVerified: false,
        password: password
    }).then((res) => {
        return {
            response: res
        }
    }).catch((err) => {
        return {err}
    })

})

На стороне клиента :

    const handleAddUser = () => {
      let pswd = passwordGen(7)
      const createUser = firebase.functions().httpsCallable('createUser');
      createUser({email: email, password: pswd}).then(function(result) {
        let res = result.data
        console.log(res)
      }).catch(function(error) {
        console.log(error.code)
      })

    }

пакет. json

{
  "name": "careerhub-web",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.3.2",
    "@testing-library/user-event": "^7.1.2",
    "antd": "^4.0.2",
    "firebase": "^7.10.0",
    "node-sass": "^4.13.1",
    "react": "^16.13.0",
    "react-dom": "^16.13.0",
    "react-email-editor": "^1.0.0",
    "react-reveal": "^1.2.2",
    "react-router-dom": "^5.1.2",
    "react-scripts": "3.4.0",
    "recharts": "^2.0.0-beta.2"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

Эта ошибка сохраняется, даже если я не в сети.

Вещи, которые я пробовал:

  1. Обновление Firebase SDK
  2. Добавление «proxy»: '...' в пакет. json
  3. Использование функций basi c из руководств по облачным функциям
  4. Удаление приложения Firebase, удаление функции и повторное развертывание
  5. Добавление const cors = require('cors')({origin: true}); в функцию

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Ошибка оказалась плохо документированным изменением на стороне Google вокруг разрешений IAM, которые не совсем доступны через консоль Firebase.

Причина:

Облачные функции запрещали доступ к функции. Вновь созданные функции не имели Cloud Functions Invoker. Это изменение было реализовано 15 января 2020 года

Решение:

Создайте облачные функции Invoker и установите для всех пользователей. https://cloud.google.com/functions/docs/securing/managing-access-iam

0 голосов
/ 02 апреля 2020

Том, попробуйте это, используя express в вашей функции. Пожалуйста, попробуйте использовать express, а затем сообщите мне о результатах. У меня есть один шлюз с express в функциях Firebase, который я назвал API, и в этом API у меня есть много маршрутов, чтобы иметь в одном API все HTTP-маршруты. Как этот

файл приложения

import * as express from 'express';
import routes from './app.routes';
// import {isAuthenticated, isRoot} from './middlewares/auth.middleware';

export default (db: any) => {

  import * as cors from 'cors';
  const app = express();

  // Middlewares
  app.use(cors());
  app.use(express.json());
  app.use(express.urlencoded({extended: true}));

/*  app.use(isAuthenticated);
  app.use(isRoot);*/

  app.use('/v1', (req, res, next) => routes(db, req, res, next));
  return app;
};

индексный файл

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import * as app from './app';


admin.initializeApp({
  credential: admin.credential.applicationDefault(),
  databaseURL: process.env.DATABASE_URL
});
export const api = functions.https.onRequest(app.default(admin.firestore()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...