通过中间件从 Firebase 验证 ID 令牌后,快速响应方法不起作用
Express response methods don't work after verifying ID token from Firebase through a middleware
我正在尝试在客户端使用带有 ejs 模板的 Firebase 和 NodeJS 构建 Web 应用程序。我想确保在通过中间件访问特定路由之前对用户进行身份验证。在这个中间件中,我验证通过客户端发送的 ID 令牌,然后在验证通过后呈现页面。但是当验证令牌时,应用程序不会显示新页面,即 "user-profile.ejs".
<button onclick="sendRequest('/profile')">Profile</button>
//The client function which sends ID token
function sendRequest(url){
if(firebase.auth().currentUser){
firebase.auth().currentUser.getIdToken(true)
.then(idToken => {
client({
method: 'get',
url: url,
headers: {
'authtoken': idToken
}
})
.then(res => {
console.log("Auth token sent.")
})
.catch(err => {
console.log(err)
})
})
.catch(err => {
console.log(err)
})
}else{
client({
method: 'get',
url: url,
}).then(res => {
console.log("Request sent without header.")
})
.catch(err => {
console.log(err)
})
}
}
//The NodeJS server which contains the routes and checkAuth middleware
function checkAuth(req,res,next){
if(req.headers.authtoken){
console.log('Auth token with headers received. User has logged in.')
admin.auth().verifyIdToken(req.headers.authtoken)
.then(verifiedUser => {
console.log('Auth token verified')
return next()
})
.catch(err => {
console.log(err)
res.redirect('back')
})
}else{
console.log('Without header received.')
res.redirect('back')
}
}
app.get('/',(req,res)=>{
res.render('home')
})
app.get('/profile',checkAuth,(req,res)=>{
console.log("Reached user profile")
res.send("user-profile")
})
请记住,当您重定向时,客户端会收到重定向的 URL 并发出一个全新的 http 请求。这将在您的服务器上启动一个全新的请求周期,该周期将再次遍历所有匹配新 URL.
的中间件
自动客户端重定向不包括来自原始响应的自定义 header。如果那是您所期望的,那将行不通。如果您从 Ajax 调用中手动跟踪重定向,则可以从重定向响应 header 中手动获取令牌,然后手动将其添加到新的 Ajax 调用中以重定向到重定向位置。
如果您希望浏览器或某些自动重定向处理重定向,它们不会从 header 中带走令牌。因此,您的服务器将不得不在不重定向的情况下将响应发送到原始 URL ,或者您必须将令牌放在能够在重定向中幸存下来的东西中,例如重定向上的查询参数(通常是一个坏主意凭据)或在 cookie 中或在与 cookie 绑定的 server-side session object 中。
我正在尝试在客户端使用带有 ejs 模板的 Firebase 和 NodeJS 构建 Web 应用程序。我想确保在通过中间件访问特定路由之前对用户进行身份验证。在这个中间件中,我验证通过客户端发送的 ID 令牌,然后在验证通过后呈现页面。但是当验证令牌时,应用程序不会显示新页面,即 "user-profile.ejs".
<button onclick="sendRequest('/profile')">Profile</button>
//The client function which sends ID token
function sendRequest(url){
if(firebase.auth().currentUser){
firebase.auth().currentUser.getIdToken(true)
.then(idToken => {
client({
method: 'get',
url: url,
headers: {
'authtoken': idToken
}
})
.then(res => {
console.log("Auth token sent.")
})
.catch(err => {
console.log(err)
})
})
.catch(err => {
console.log(err)
})
}else{
client({
method: 'get',
url: url,
}).then(res => {
console.log("Request sent without header.")
})
.catch(err => {
console.log(err)
})
}
}
//The NodeJS server which contains the routes and checkAuth middleware
function checkAuth(req,res,next){
if(req.headers.authtoken){
console.log('Auth token with headers received. User has logged in.')
admin.auth().verifyIdToken(req.headers.authtoken)
.then(verifiedUser => {
console.log('Auth token verified')
return next()
})
.catch(err => {
console.log(err)
res.redirect('back')
})
}else{
console.log('Without header received.')
res.redirect('back')
}
}
app.get('/',(req,res)=>{
res.render('home')
})
app.get('/profile',checkAuth,(req,res)=>{
console.log("Reached user profile")
res.send("user-profile")
})
请记住,当您重定向时,客户端会收到重定向的 URL 并发出一个全新的 http 请求。这将在您的服务器上启动一个全新的请求周期,该周期将再次遍历所有匹配新 URL.
的中间件自动客户端重定向不包括来自原始响应的自定义 header。如果那是您所期望的,那将行不通。如果您从 Ajax 调用中手动跟踪重定向,则可以从重定向响应 header 中手动获取令牌,然后手动将其添加到新的 Ajax 调用中以重定向到重定向位置。
如果您希望浏览器或某些自动重定向处理重定向,它们不会从 header 中带走令牌。因此,您的服务器将不得不在不重定向的情况下将响应发送到原始 URL ,或者您必须将令牌放在能够在重定向中幸存下来的东西中,例如重定向上的查询参数(通常是一个坏主意凭据)或在 cookie 中或在与 cookie 绑定的 server-side session object 中。