Авторизованный запрос Firebase к облачным функциям. Предварительный запрос возврата HTTP не проходит контрольную проверку (No Access-Control-Allow-Origin) - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь отправить авторизованные запросы Firebase в Облачные функции HTTP, следуя официальной документации .

Однако я получаю сообщение об ошибке:

Доступ к XMLHttpRequest по адресу [[CLOUD-FUNCTION-SOURCE-URL] 'из источника' http://127.0.0.1: 8080 'заблокирован политикой CORS: Ответ на запрос предполетной проверки не проходит проверку контроля доступа: Нет Заголовок «Access-Control-Allow-Origin» присутствует на запрошенном ресурсе.

Я попробовал следующее:

def cors_enabled_function_auth(request):
    # For more information about CORS and CORS preflight requests, see
    # https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request
    # for more information.

    # Set CORS headers for preflight requests
    if request.method == 'OPTIONS':
        # Allows POST requests from origin * Authorization header
        headers = {
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'POST',
            'Access-Control-Allow-Headers': ['Authorization', 'Content-Type'] ,
            'Access-Control-Max-Age': '3600',
            'Access-Control-Allow-Credentials': 'true'
        }
        return ('', 204, headers)

    # Set CORS headers for main requests
    headers = {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Credentials': 'true'
    }

    print('core logic here')

    return ('Hello World!', 200, headers)

На передней панели (используя AngularJS) Я делаю запрос следующим образом:

self.getDownloadUrl = function(gcs_reference) {
        var url = '[CLOUD-FUNCTION-URL]';
        var params = {'param1': 'hello'};
        var headers = {
            'Content-Type': 'application/json'
        }
        return firebase.auth().onAuthStateChanged().then(
            function (user) {
                headers['Authorization'] = user['refreshToken']
                return postRequestHTTP(params, url, headers)
            },
            function (error) {
                console.log('error', error)
                return error;
            }
        )

    };


function postRequestHTTP(params, url, headers) {
        // Generic HTTP post request to an url with parameters
        var q = $q.defer();
        var body = params;
        var req = {
            headers: headers
        };
        $http.post(url, body, req).then(
            function(response) {
                q.resolve(response)
            }, function(error) {
                q.reject(error)
            }
        );
        return q.promise;
    }

Кто-нибудь знает, в чем причина этой ереси?

1 Ответ

1 голос
/ 14 апреля 2020

Я не могу воспроизвести это. С вашей функцией и запросом вроде:

function reqListener () {
  console.log(this.responseText);
}

xhr = new XMLHttpRequest();
xhr.open('POST', "[CLOUD-FUNCTION-URL]");
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.addEventListener("load", reqListener);
xhr.send('test');

я получаю успешный запрос. Возможно, последняя версия вашей функции фактически не развернута, или ваш интерфейс указывает на другую конечную точку?

...