node.js - Express & Firebase - 无法在重定向前设置标头
问题描述
我正在尝试在服务器上进行 Firebase 身份验证。
'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser')();
const cors = require('cors')({origin: true});
//const expressSanitizer = require('express-sanitizer');
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 && 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.redirect("/login");
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 if(req.cookies) {
console.log('Found "__session" cookie');
// Read the ID Token from cookie.
idToken = req.cookies.__session;
} else {
// No cookie
res.redirect("/login");
return;
}
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.redirect("/login");
});
};
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static("/public"));
app.use(cors);
app.use(cookieParser);
//app.use(expressSanitizer());
//app.use(validateFirebaseIdToken);=
app.set("view engine", "ejs");
// 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.app = functions.https.onRequest(app);
app.post("/login", (request, response) => {
var idToken = request.body.token;
console.log("REQUEST BODY = " + idToken);
response.header("Authorization" , "Bearer " + idToken);
return response.redirect("dashboard");
});
app.get("/dashboard", validateFirebaseIdToken, (request, response) => {
response.redirect("/dashboard/new");
});
在/login
POST 路由中,我收到了idToken
预期的结果(并显示在日志中)。不过,似乎响应无法保留/维护Authentication: Bearer <Firebase ID token>
预先设置的标头属性。
事实上,我/dashboard
通过获取日志打印的 idToken 并将其设置在请求的标头中,在 Postman 中发送了一个 GET 请求,并且它运行良好Authorization: Bearer <idToken>
。
这里它说重定向实际上是新的 HTTPS 请求,因此不保留响应中设置的标头。在这种情况下我该怎么办?
解决方案
您必须在每个请求中发送 Authorization 标头。HTTPS 函数是无状态的。他们不记得先前请求中的任何内容。因此,您不应依赖重定向行为来保留状态。相反,客户端需要弄清楚下一步要去哪里并自己发出下一个请求。
推荐阅读
- html - 我们如何称呼这个由三个水平点组成的小部件?
- azure - 无法使用 packer chef-client provisioner 从 chef-client 连接到 chef-server
- reactjs - 模拟搜索并选择一个选项 react-select
- php - 如何在 WordPress 中延迟第三方屏幕外图像
- java - 线程和同步
- c# - .NET5/Core 下的 Linux 进程输出重定向导致不正确/损坏的行为
- c# - 按我们想要的特定顺序对 DataTable 的行进行排序
- python - Pyspark 日期格式
- hana - 用 SQL 检查 HANA 版本?
- python - 每当我尝试导入任何开源库或尝试升级我的 pip 时,都会弹出此错误。有人可以帮帮我吗?