错误消息:未在 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 是错误的。
答案 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
}
})