作者:-刘耀宗_690 | 来源:互联网 | 2023-05-21 14:49
Firebase(使用 Google 登录)使用 Firebase UI 和 COOKIE 会话在 Node.js 中进行身份验
Firebase(使用 Google 登录)使用 Firebase UI 和 COOKIE 会话在 Node.js 中进行身份验证
原文:https://www . geeksforgeeks . org/firebase-用 google 登录-节点中身份验证-js-使用-firebase-ui-和-COOKIE-sessions/
Firebase 身份验证提供易于使用的 SDK 和现成的用户界面库后端服务,以向您的应用程序验证用户。
先决条件:节点、Javascript、firebase 基础知识。
设置:首先我们需要创建一个火基地项目,前往火基地控制台并创建一个新项目。
我打算用谷歌把它命名为 sign in
点击网页创建一个网络应用程序。
转到 Firebase 设置>服务帐户>生成新密钥。该密钥应保持为私有,建议将其保存在环境变量中。
现在进入认证选项卡,打开 使用谷歌登录。T3】
现在创建一个新项目,其中 success.html()带有一个简单的锚点标签,指向“/”根 )和 login.html【留下一个 id 为“firebasei-auth-container”的空白区域,firebaseui 将被初始化的地方】
使用控制台中的以下命令,将控制台目录更改为项目类型的根目录
$npm init
$npm install express firebase-admin COOKIE-parser https fs
注意:只有当你想在本地主机中保存 COOKIEs 时,才需要最后两个包,但是,如果你将在 https 上运行后端,那么就没有必要了。
const express = require("express");
const admin = require("firebase-admin");
const COOKIEParser = require("COOKIE-parser");
const https = require('https');
const fs = require('fs');
const app = express();
app.use(COOKIEParser());
var key="--BEGIN PRIVATE KEY--\nMIIEvgIBADANBgk"
+ "qhkiG9w0BAQE--your key here--+1d4\n--END"
+ " PRIVATE KEY-\n";
admin.initializeApp({
credential: admin.credential.cert({
"private_key": key.replace(/\\n/g, '\n'),
"client_email": "YOUR CLIENT EMAIL HERE",
"project_id": "YOUR PROJECT ID "
})
});
app.get('/', (req, res) => {
res.sendFile(__dirname +'/login.html');
});
app.get('/logout', (req, res) => {
res.clearCOOKIE('__session');
res.redirect('/');
});
app.get('/success', checkCOOKIE, (req, res) => {
res.sendFile(__dirname + '/success.html');
console.log("UID of Signed in User is"
+ req.decodedClaims.uid);
// You will reach here only if session
// is working Fine
});
app.get('saveCOOKIE', (req, res) => {
const Idtoken=req.query.token;
setCOOKIE(Idtoken, res);
});
// Saving COOKIEs and verify COOKIEs
// Reference :
//https://firebase.google.com/docs/auth/admin/manage-COOKIEs
function saveCOOKIE(idtoken, res) {
const expiresIn = 60 * 60 * 24 * 5 * 1000;
admin.auth().createSessionCOOKIE(idtoken, {expiresIn})
.then((sessionCOOKIE) => {
const optiOns= {maxAge: expiresIn,
httpOnly: true, secure: true};
admin.auth().verifyIdToken(idtoken)
.then(function(decodedClaims) {
res.redirect('/success');
});
}, error => {
res.status(401).send("UnAuthorised Request");
});
}
function checkCOOKIE(req, res, next) {
const sessiOnCOOKIE= req.COOKIEs.__session || '';
admin.auth().verifySessionCOOKIE(
sessionCOOKIE, true).then((decodedClaims) => {
req.decodedClaims = decodedClaims;
next();
})
.catch(error => {
// Session COOKIE is unavailable or invalid.
// Force user to login.
res.redirect('/');
});
}
这是 app.js 文件,仔细看会发现没有端口在监听我们的请求。这就是我们需要这两个节点模块的地方。
大多数浏览器不允许您将 COOKIEs 保存在本地主机中,这就是为什么我们将为本地主机设置 HTTPS 连接。
确保您在项目的根目录中。
打开 bash 并键入
$ OpenSSL req-nodes-new-x509-key out server . key-out server . cert
将生成两个文件(server.key 和 server.cert)。
将以下代码添加到 app.js 文件-
https.createServer({
key: fs.readFileSync('server.key'),
cert: fs.readFileSync('server.cert')
}, app)
.listen(3000, function () {
console.log('listening on port 3000!'
+ ' Go to https://localhost:3000/')
});
在登录页面的正文标记之前加载此脚本
"https://cdn.firebase.com/libs/firebaseui/3.5.2/firebaseui.css" />
在登录页面的 body 标签后加载这个脚本(填充从 firebase 控制台获得的配置数据)。
var cOnfig= {
apiKey: "YOUR_KEY",
authDomain: "YOUR_DOMAIN",
databaseURL: "YOURURL",
projectId: "--",
storageBucket: "",
messagingSenderId: "",
appId: ""
};
firebase.initializeApp(config);
firebase.auth().setPersistence(
firebase.auth.Auth.Persistence.NONE);
// FirebaseUI config.
var uiCOnfig= {
signInOptions: [
// Google sign in option
firebase.auth.GoogleAuthProvider.PROVIDER_ID,
],
// Terms of service url/callback.
tosUrl: '',
// Privacy policy url/callback.
privacyPolicyUrl: function () {
window.location.assign(
'');
},
callbacks: {
signInSuccess: function (user,
credential, redirectUrl) {
// User successfully signed in.
user.getIdToken().then(function (idToken) {
window.location.href =
'/saveCOOKIE?idToken=' + idToken;
}).catch(error => {
console.log(error);
});
}
}
};
// Initialize the FirebaseUI Widget using Firebase.
var ui = new firebaseui.auth.AuthUI(firebase.auth());
// The start method will wait until the DOM is loaded.
ui.start('#firebaseui-auth-container', uiConfig);
现在点击保存并运行命令$node app.js
现在转到 https://localhost:3000/并登录,然后关闭选项卡或浏览器并键入 https://localhost:3000/success,您将看到您不会再次被重定向到登录页面,而是被带到成功页面。
注意:这里它没有要求我选择使用哪个帐户登录应用程序,因为我只使用一个帐户登录,如果您使用多个帐户登录,它会要求您选择一个帐户继续。
https://media.geeksforgeeks.org/wp-content/uploads/20200813165115/finalResult.mp4
下载我已完成的项目如果你遇到任何错误或写在评论里
参考:T2】https://firebase.google.com/docs/auth/admin/manage-COOKIEs