Javascript firebase验证用户身份后如何从服务器端重定向浏览器
我有一个Javascript firebase验证用户身份后如何从服务器端重定向浏览器,javascript,node.js,firebase,express,firebase-authentication,Javascript,Node.js,Firebase,Express,Firebase Authentication,我有一个node.js和express.js应用程序托管在firebase上。该网站位于: 我想在用户身份验证后重定向到其他页面。但是,res.redirect('/user')仅在app.get上重定向,而不是app.post。这很奇怪,有人能告诉我为什么吗 我的index.ts import * as express from 'express' ; import * as admin from 'firebase-admin' ; import * a
node.js
和express.js
应用程序托管在firebase上。该网站位于:
我想在用户身份验证后重定向到其他页面。但是,res.redirect('/user')
仅在app.get
上重定向,而不是app.post
。这很奇怪,有人能告诉我为什么吗
我的index.ts
import * as express from 'express' ;
import * as admin from 'firebase-admin' ;
import * as functions from 'firebase-functions';
import * as path from "path" ;
import * as math from 'mathjs' ;
import { Option, some, none } from 'fp-ts/lib/Option';
import * as bodyParser from "body-parser";
import { body, validationResult } from 'express-validator/check';
import { sanitizeBody } from 'express-validator/filter';
const accountKeyPath = path.join(__dirname, '../credentials/serviceAccountKey.json');
const accountKey = require(accountKeyPath);
const adminSDKPath = path.join(__dirname, '../credentials/spice-ai-firebase-adminsdk.json');
const adminSDK = require(adminSDKPath);
const firebaseAdmin = admin.initializeApp({
credential : admin.credential.cert(adminSDK)
, databaseURL: accountKey['databaseURL']
});
const dbRef = new Proposal(firebaseAdmin, 'datasets');
const auth = firebaseAdmin.auth()
// create HTTP server
const app = express();
// use json form parser middleware
app.use(bodyParser.json());
// use query string parser middlware
app.use(bodyParser.urlencoded({ extended: true }));
// set view engine
app.set('views', path.join(__dirname, '../src/view'))
app.set('view engine', 'pug');
// set static file source
app.use(express.static(path.join(__dirname, "../public")));
app.use(cors({origin: 'http://localhost:5000'}));
app.use(cors({origin: '/'} ));
app.use(cors({origin: '/user'}));
app.get('/', (req,res) => {
res.render('pages/login', {})
// a res.redirect('/user') redirects immediately here
});
app.post('/', (req, res) => {
// this does not redirect
console.log('\n+++++++++++++++++++++++++++ POST')
res.redirect('/user');
})
app.get('/user' , (req, res) => {
console.log('\n############################### GET /user')
res.render('pages/user')
});
exports.app = functions.https.onRequest(app);
前端post
ajson
对应的app.js
:
const config = {
"apiKey" : ""
"authDomain" : ""
"databaseURL" : ""
"projectId" : ""
"storageBucket" : ""
"messagingSenderId": ""
};
firebase.initializeApp(config);
const auth = firebase.auth();
auth.onAuthStateChanged(user => {
if (user) {
console.log("loaded page with user: ", user['email'])
user.getIdToken(true)
.then( idToken => {
console.log('user token: ', idToken)
post_utoken(idToken);
})
} else {
console.log('no user found')
}
});
/**
@Use: send user id to server
*/
function post_utoken(tok){
var data = {};
data.userToken = tok
$.ajax({
type : 'POST'
, url : 'http://localhost:5000/'
, data : data
, dataType : 'json'
, success : function(data) {
console.log('\n======================================')
console.log('success sending data from app.js')
}
})
}
一切都很标准。此外,在我的bash
上,我可以看到重定向和app.get(“/user”…)
都启动了,因为我:
++++++++++++++++++++++++++ POST
info: Execution took 1 ms, user function completed successfully
127.0.0.1 - - [31/May/2018:22:03:28 +0000] "POST / HTTP/1.1" 302 27 "http://localhost:5000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"
[hosting] Rewriting /user to local function app
info: User function triggered, starting execution
info:
############################### GET /user
info: Execution took 78 ms, user function completed successfully
127.0.0.1 - - [31/May/2018:22:03:28 +0000] "GET /user HTTP/1.1" 200 6547 "http://localhost:5000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"
然而,在客户端,我仍然在localhost:5000
上,即使app.get(“/user”…)
已经启动
===============================================================
编辑:
我发现在发布到服务器时,对ajax
在做什么存在概念上的误解。我希望将所有应用程序状态集中在服务器端,因此我希望将重定向到应用程序中的/user
。如果可能,获取('/')
回调。这意味着客户端没有ajax,如果是这样,我如何向服务器端发送信息?我可以用socket.io来做它吗?或者它是在设计它吗?如果是这样,我该怎么做
同样,我必须从服务器端重定向,因为我使用index.ts作为我的应用程序控制器,所以我根本不希望在客户端使用状态更改逻辑,除了由于firebase限制而进行的用户身份验证。您的期望值有点偏离
当服务器以响应时,它会告诉浏览器下一步要去哪里,这在使用GET
请求导航时是有意义的,而在通过ajax发布数据时则没有意义,因为在ajax中,您可以完全控制接下来发生的事情
实际上更容易,试试这样:
success : function(data) {
window.location.href = '/user'
}
这正是您所期望的,在客户端完成
如果确实需要在服务器端完成,那么添加一个html表单并通过javascript提交,这样浏览器将处理请求并采取适当的操作
将以下内容添加到您的HTML:
然后在脚本中:
auth.onAuthStateChanged(user => {
if (user) {
document.getElementById('userform_email').value = user['email'];
document.getElementById('userform').submit();
} else {
console.log('no user found')
}
});
您所做的是创建一个不可见的表单,一旦Firebase完成它的工作,它就会被提交。数据将以不同的形式到达服务器,因此您可能需要在那里进行一些调整。我的意思是。。。您是否希望在执行ajax请求后使用服务器端重定向来重定向页面?或什么。因为,它不会。@KevinB yes如果我将代码片段res.redirect('/user')
放在对app.get('/'(req,res)=>…)
的响应中,那么它会按预期重定向。使用javascript在app.post
之后如何重定向。get请求会重定向,因为您没有使用ajax。重定向的ajax请求不会重定向浏览器。所以ajax调用暂时将控制权交给服务器?并在完成计算之前等待响应?有没有一种方法可以在没有Ajax的情况下发布到服务器,这样我就可以在服务器端重定向?这样,我就不会让应用程序状态逻辑分散在代码中。戈麦斯,你是说html中的表单吗?不幸的是,我在firebase的限制下工作,据我所知,没有办法从服务器端(只有客户端)监听身份验证状态的更改。因此,我必须在客户端监听,并在auth.onAuthStateChanged
回调中插入对服务器的调用。。。