Firebase 授权不记名令牌未注册

时间:2021-03-31 20:48:18

标签: javascript firebase firebase-authentication jwt

错误消息:未在 Authorization 标头中将 Firebase ID 令牌作为不记名令牌传递。确保通过提供以下 HTTP 标头来授权您的请求:Authorizaiton: Bearer 或传递“__session”cookie

实际上有一个有效的令牌。相同的设置适用于其他功能,但不适用于此处。主要区别在于这是删除而不是帖子。

    firebase
      .auth()
      .currentUser.getIdToken(true)
      .then((token) => {
        console.log(token)
        return axios.delete(
          `${FunctionsDir}/deleteMessage`,
          {
            messageID: messageID,
          },
          {
            headers: {
              Authorization: `Bearer ${token}`,
              'content-type': 'application/octet-stream',
            },
          }
        )
      })

和 cors 设置...

var corsOptions = {
  origin: function (origin, callback) {
    if (whitelist.indexOf(origin) !== -1 || !origin) {
      callback(null, true)
    } else {
      callback(new Error('Not allowed by CORS'))
    }
  },
  allowedHeaders: 'Content-Type,Authorization',
  methods: 'GET,POST,DELETE',
  preflightContinue: false,
  optionsSuccessStatus: 200,
}

app.options('*', cors())
app.use(cors(corsOptions))

更新:已修复,原来是 cors 的东西加上 axios.delete() sig 是错误的。

1 个答案:

答案 0 :(得分:1)

这很可能是一个需要在服务器上解决的 CORS 问题。

这是因为 DELETE 请求需要向服务器发出一个飞行前请求,询问什么是可接受的发送。因为您收到了来自服务器的响应,所以您可能已经将 DELETE 添加到您的 Access-Control-Allow-Methods 标头中。但是,默认情况下 Authorization 不被视为“安全标头”。因此,您还必须明确允许它,否则浏览器会在发送请求时将其从请求中删除。您可以通过在 Access-Control-Allow-Headers 标头中添加 Authorization 来实现。

如果您在服务器上使用 Express,则可以允许 cors 包为您执行此操作:

import express from "express";
import cors from "cors";

const app = express();
app.options("/deleteMessage", cors()); // enable preflight request for DELETE
app.use(cors({ origin: ["https://yourapp.com"] })); // enable CORS for all routes

// ...

如果您不喜欢使用第三方依赖项,您可以手动添加标头,如 this answer 所示。

对于非快速请求,如 HTTP 请求云函数,您可以使用以下代码:

import express from "express";
import cors from "cors";

const corsMiddleware = cors({ origin: ["https://yourapp.com"] }); // or your manual (req, res, next) function

export const someFunction = functions.https.onRequest((req, res) => {
  corsMiddleware(req, res, (err) => {
    if (err) {
      res.status(500).send('CORS check failed');
      return;
    }

    // your code here
  }
})
相关问题