【问题标题】:cors error within a cloud function云函数中的cors错误
【发布时间】:2018-07-27 01:05:53
【问题描述】:

我已经完全复制了示例代码中的内容:https://github.com/firebase/functions-samples/blob/master/authorized-https-endpoint/functions/index.js

但在尝试向/savedProfiles 端点发出正常获取请求时,我不断收到此错误

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://us-central1-my-app.cloudfunctions.net/savedProfiles. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

这是我的代码:

'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const express = require('express');
const cookieParser = require('cookie-parser')();
const cors = require('cors')({origin: true});
const app = express();

// Express middleware that validates Firebase ID Tokens passed in the Authorization HTTP header.
// The Firebase ID token needs to be passed as a Bearer token in the Authorization HTTP header like this:
// `Authorization: Bearer <Firebase ID Token>`.
// when decoded successfully, the ID Token content will be added as `req.user`.
const validateFirebaseIdToken = (req, res, next) => {
  console.log('Check if request is authorized with Firebase ID token');

  if ((!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) &&
      !req.cookies.__session) {
    console.error('No Firebase ID token was passed as a Bearer token in the Authorization header.',
        'Make sure you authorize your request by providing the following HTTP header:',
        'Authorization: Bearer <Firebase ID Token>',
        'or by passing a "__session" cookie.');
    res.status(403).send('Unauthorized');
    return;
  }

  let idToken;
  if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
    console.log('Found "Authorization" header');
    // Read the ID Token from the Authorization header.
    idToken = req.headers.authorization.split('Bearer ')[1];
  } else {
    console.log('Found "__session" cookie');
    // Read the ID Token from cookie.
    idToken = req.cookies.__session;
  }
  admin.auth().verifyIdToken(idToken).then((decodedIdToken) => {
    console.log('ID Token correctly decoded', decodedIdToken);
    req.user = decodedIdToken;
    return next();
  }).catch((error) => {
    console.error('Error while verifying Firebase ID token:', error);
    res.status(403).send('Unauthorized');
  });
};

app.use(cors);
app.use(cookieParser);
app.use(validateFirebaseIdToken);
app.get('/savedProfiles', (req, res) => {
  res.send(`Hello ${req.user.name}`);
});

// This HTTPS endpoint can only be accessed by your Firebase Users.
// Requests need to be authorized by providing an `Authorization` HTTP header
// with value `Bearer <Firebase ID Token>`.
exports.savedProfiles = functions.https.onRequest(app);

app.use(cors); 不应该防止这类错误吗?

【问题讨论】:

    标签: javascript firebase cors google-cloud-functions


    【解决方案1】:

    所以我设法让它工作,甚至不使用快递。这是我想出的:

    'use strict';
    
    const functions = require('firebase-functions');
    const admin = require('firebase-admin');
    admin.initializeApp(functions.config().firebase);
    const cookieParser = require('cookie-parser')();
    const cors = require('cors')({
      origin: 'http://localhost:8100'
    });
    
    exports.savedProfiles = functions.https.onRequest((req, res) => {
      cors(req, res, () => {
    
        console.log('Check if request is authorized with Firebase ID token');
    
        if ((!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) &&
            !req.cookies.__session) {
          console.error('No Firebase ID token was passed as a Bearer token in the Authorization header.');
    
          res.status(403).send('Unauthorized');
          return;
        }
    
        let idToken;
        if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
          // Read the ID Token from the Authorization header.
          idToken = req.headers.authorization.split('Bearer ')[1];
        } else {
          // Read the ID Token from cookie.
          idToken = req.cookies.__session;
        }
    
        admin.auth().verifyIdToken(idToken).then((decodedIdToken) => {
          req.user = decodedIdToken;
          res.status(200).send("SUCCESS");
          return;
        }).catch((error) => {
          console.error('Error while verifying Firebase ID token:', error);
          res.status(403).send('Unauthorized');
        });
      });
    });
    

    【讨论】:

      【解决方案2】:

      我做了一些测试,在我的电脑上,上述 cors 设置按预期工作。

      检查 http 响应状态:如果我在设置中重现错误状态(例如 403),则 Access-Control-Allow-Origin 标头不存在。

      validateFirebaseIdToken尝试添加:

      res.set('Access-Control-Allow-Origin', '*');
      

      就在 res.status(403).send('Unauthorized'); 表达式之前,以便在发生错误时也启用 CORS。

      【讨论】:

      • 刚刚试了一下,好像没用。我也将它添加到了几个地方。还是没有运气
      • 沿途也可能是未捕获的异常吗?尝试从排除 app.use(validateFirebaseIdToken) 开始简化代码
      • 我想我设法通过了第一个障碍,但现在我遇到了另一个错误...CORS preflight channel did not succeed
      猜你喜欢
      • 2020-08-25
      • 2020-07-07
      • 2020-08-16
      • 2020-02-03
      • 2018-05-15
      • 2020-11-21
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多