Облачная функция Firebase с запросом выборки с базовой аутентификацией для внешнего API - PullRequest
1 голос
/ 06 ноября 2019

Кажется, у меня проблема с получением ожидаемого ответа от вызова извлечения в облачной функции Firebase. Я уверен, что это из-за моего недостатка знаний о том, как работают ответы, обещания и т. Д.

Я пытаюсь использовать Api Atlassian толпы для SSO. Если я использую почтальона, я могу получить желаемые результаты из запроса. Так что я знаю, что часть его работает.

Что привело меня к использованию облачной функции, так это то, что выполнение одного и того же запроса с использованием fetch приводило к проблемам с CORS на localhost. Я подумал, что если я смогу вывести браузер из уравнения, проблемы с CORS исчезнут. Что у них есть, но я не получаю желаемого ответа.

Моя облачная функция выглядит следующим образом:

const functions = require('firebase-functions');
const fetch = require('node-fetch');
const btoa = require('btoa');
const cors = require('cors')({origin:true});

const app_name = "app_name";
const app_pass = "app_password";

exports.crowdAuthentication = functions.https.onRequest((request, response)=>
{
    cors(request, response, () =>{

        let _uri = "https://my.server.uri/crowd/rest/usermanagement/1/session";
        let _headers = {
            'Content-Type':'application/json',
            'Authorization':`Basic ${btoa(`${app_name}:${app_pass}`)}`
        }


        let _body = {
            username: request.body.username,
            password: request.body.password
        }

        const result = fetch(_uri, {
            method: 'POST',
            headers: _headers,
            body: JSON.stringify(_body),
            credentials: 'include'
        })

        response.send(result);
    })
})

Затем я выполняю вызов в своем приложении, используя fetch toконечная точка firebase и передача имени пользователя / пароля:

fetch('https://my.firebase.endpoint/functionName',{
            method: 'POST',
            body: JSON.stringify({username:"myusername",password:"mypassword"}),
            headers: {
                'Content-Type':'application/json'
            }
        })
        // get the json from the readable stream
        .then((res)=>{return res.json();})
        // log the response - {size:0, timeout:0}
        .then((res)=>
        {
            console.log('response: ',res)
        })
        .catch(err=>
        {
            console.log('error: ',err)
        })

Спасибо за поиск.

1 Ответ

1 голос
/ 06 ноября 2019

Обновление после нашего обсуждения в комментариях ниже

Похоже, что он не работает с библиотекой node-fetch и что вам следует использовать другую библиотеку, такую ​​как request-promise.

Поэтому вы должны адаптировать свой код следующим образом:

//......
var rp = require('request-promise');


exports.crowdAuthentication = functions.https.onRequest((request, response) => {

    cors(request, response, () => {

        let _uri = "https://my.server.uri/crowd/rest/usermanagement/1/session";
        let _headers = {
            'Content-Type': 'application/json',
            'Authorization': `Basic ${btoa(`${app_name}:${app_pass}`)}`
        }

        let _body = {
            username: request.body.username,
            password: request.body.password
        }

        var options = {
            method: 'POST',
            uri: _uri,
            body: _body,
            headers: _headers,
            json: true
        };

        rp(options)
            .then(parsedBody => {
                response.send(parsedBody);
            })
            .catch(err => {
                response.status(500).send(err)
                //.... Please refer to the following official video: https://www.youtube.com/watch?v=7IkUgCLr5oA&t=1s&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM&index=3
            });

    });

});

Первоначальный ответ с извлечением узла

Метод fetch() является асинхронным и возвращает Обещание. Поэтому вам нужно дождаться разрешения данного Обещания, прежде чем отправлять ответ, следующим образом:

exports.crowdAuthentication = functions.https.onRequest((request, response)=>
{
    cors(request, response, () =>{

        let _uri = "https://my.server.uri/crowd/rest/usermanagement/1/session";
        let _headers = {
            'Content-Type':'application/json',
            'Authorization':`Basic ${btoa(`${app_name}:${app_pass}`)}`
        }


        let _body = {
            username: request.body.username,
            password: request.body.password
        }

        fetch(_uri, {
            method: 'POST',
            headers: _headers,
            body: JSON.stringify(_body),
            credentials: 'include'
        })
        .then(res => {
          res.json()
        })
        .then(json => {
          response.send(json);
        }
        .catch(error => {
            //.... Please refer to the following official video: https://www.youtube.com/watch?v=7IkUgCLr5oA&t=1s&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM&index=3
        });

    })
})

Кроме того, обратите внимание, что вы должны быть в тарифном плане «Пламя» или «Пламя».

На самом деле, бесплатный «Spark» план «разрешает исходящие сетевые запросы только к службам, принадлежащим Google». См. https://firebase.google.com/pricing/ (наведите курсор мыши на вопросительный знак, расположенный после заголовка «Облачные функции»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...