热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Firebase(使用Google登录)使用FirebaseUI和Cookie会话在

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


推荐阅读
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 前言:原本纠结于Web模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中ev ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文介绍了在Go语言中可见性与scope的规则,包括在函数内外声明的可见性、命名规范和命名风格,以及变量声明和短变量声明的语法。同时,还介绍了变量的生命周期,包括包级别变量和局部变量的生命周期,以及变量在堆和栈上分配的规则和逃逸分析的概念。 ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • QuestionThereareatotalofncoursesyouhavetotake,labeledfrom0ton-1.Somecoursesmayhaveprerequi ... [详细]
  • 表达式树摘录(1)
    本文主要讲述ConstantExpression介绍表示具有常量值的表达式。ParameterExpression介绍表示命名的参数表达式。UnaryExpression介绍表示包 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
author-avatar
-刘耀宗_690
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有