Javascript Firebase身份验证集会话过期

Javascript Firebase身份验证集会话过期,javascript,firebase-authentication,Javascript,Firebase Authentication,如何设置Firebase身份验证会话的会话过期时间? 默认情况下,会话永不过期 我希望会议在8小时不活动后结束 我已经读过了,但不知道如何设置会话过期 用于登录用户并在登录和注销时执行任务的我的代码 firebase.auth().signInWithEmailAndPassword(data.email, data.password) firebase.auth().onAuthStateChanged((user) => { if (user) { //Signed in

如何设置Firebase身份验证会话的会话过期时间? 默认情况下,会话永不过期

我希望会议在8小时不活动后结束

我已经读过了,但不知道如何设置会话过期

用于登录用户并在登录和注销时执行任务的我的代码

firebase.auth().signInWithEmailAndPassword(data.email, data.password)

firebase.auth().onAuthStateChanged((user) => {
  if (user) {
    //Signed in
  }else{
    //Signed out
  }
}
感谢所有回复! 我已经尝试过,但似乎无法让Firebase管理员工作

Firebase-db.js

const admin = require('firebase-admin')

const databaseConnection = {
  serviceAccountFile: './serviceAccount.json',
  databaseURL: 'https://myProject.firebaseio.com/'
}

const serviceAccount = require(databaseConnection.serviceAccountFile)

const app = admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: databaseConnection.databaseURL
}, 'test')

const database = admin.database(app)

module.exports = database
sessionSignout.js

const functions = require('firebase-functions')   
const database = require('../../firebase-db')
const admin = database.admin

exports.sessionSignout = functions
.region('europe-west1')
.pubsub
.schedule('*/15 * * * *')
.timeZone('Europe/Stockholm')
.onRun(async (event) => {
  database.ref(`users`)
  .once('value', (usersSnapshots) => {
    usersSnapshots.forEach((snapshot) => {
      const uid = snapshot.key
      admin.auth().revokeRefreshTokens(uid)
    })
  })
}
我犯了一个错误

错误:函数执行失败。详细信息:无法读取未定义的属性“auth”


您链接的文档中说,您可以使用Firebase Admin SDK终止他们的会话。此代码必须在您控制的后端上运行,这意味着您将无法在客户端应用程序中执行此操作。后端需要知道用户何时变为“非活动”,无论您选择什么定义。将这一切连接起来是不平凡的,但也是可能的。

感谢所有的答案! 我只是想分享我的代码供其他人使用

我已经准备好了代码来适应状态感知

index.js

import database from './firebase/firebase' //Firebase setup for client

firebase.auth().onAuthStateChanged((user) => {
  //Handle login and redirect

  if (user) {
    //We are logged in
    addPresenceAwarenessListener()
  }else{
    ...
  }
}

const addPresenceAwarenessListener = () => {
  // Create a reference to the special '.info/connected' path in 
  // Realtime Database. This path returns `true` when connected
  // and `false` when disconnected.
  database.ref('.info/connected').on('value', (snapshot) => {
    // If we're not currently connected, don't do anything.
    if (snapshot.val() == false) {
      return
    }

    const uid = firebase.auth().currentUser.uid

    //Push last login/logout to user profile
    const userLastLoginOutRef = database.ref(`users/${uid}`)
    userLastLoginOutRef.onDisconnect().update({lastLoginOut: firebase.database.ServerValue.TIMESTAMP})
    .then(() => { userLastLoginOutRef.update({lastLoginOut: firebase.database.ServerValue.TIMESTAMP}) })
  })
}
会话处理-在n小时后使会话过期(在数据库中设置“sessExp”)

firebase-db.js-云功能的基本firebase设置

const admin = require('firebase-admin')

const databaseConnection = {
  serviceAccountFile: './my-project.json',
  databaseURL: 'https://my-project.firebaseio.com/'
}

const serviceAccount = require(databaseConnection.serviceAccountFile)

const app = admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: databaseConnection.databaseURL
}, 'remindMiNotifier')

const database = admin.database(app)
module.exports = database
sessionSignout.js-在特定时间段后注销用户-如果指定。默认为永久会话

const functions = require('firebase-functions')
const moment = require('moment')
const database = require('../../firebase-db')
const admin = database.app

//Import enviroment variable config (.env)
require('dotenv').config()

//Export cron job - deploy: firebase deploy --only functions:sessionSignout
exports.sessionSignout = functions
.region('europe-west1')
.pubsub
.schedule('*/15 * * * *')
.timeZone('Europe/Stockholm')
.onRun(async (event) => {
  //Start execution
  const now = moment()
  const defaultSessionTime = 0 //Eternal session

  //Get all users and calculate inactive time - time since last login
  let logoutUsersArray = []
  await database.ref(`users`)
  .once('value', (usersSnapshots) => {
    usersSnapshots.forEach((snapshot) => {
      const userData = snapshot.val()
      const lastLoginOut = (userData.lastLoginOut) ? userData.lastLoginOut : 0
      //Only process users that has a login/out time stamp
      if(lastLoginOut > 0){
        const userSessionTime = (userData.sessExp) ? userData.sessExp : defaultSessionTime
        const hoursSinceLastLoginOut = now.diff(lastLoginOut, 'hours')
        const logoutUser = ( userSessionTime > 0 && (hoursSinceLastLoginOut > userSessionTime) )

        if(logoutUser){
          const userId = snapshot.key
          const userName = (userData.alias) ? userData.alias : userData.displayName
          const email = (userData.email) ? userData.email : ''
          const userObject = {
            userId,
            userName,
            email,
            lastLoginOut,
            diffHours: now.diff(lastLoginOut, 'hours')
          }
          logoutUsersArray.push(userObject)
        }
      }
    })
  })
  console.log('logoutUsersArray', logoutUsersArray)

  //Collect all promises to carry out 
  let myPromises = []

  // Revoke all refresh tokens for each user
  logoutUsersArray.forEach((logoutUser) => {
    const uid = logoutUser.userId
    myPromises.push(
      admin.auth().revokeRefreshTokens(uid)
      .then(() => {
        return admin.auth().getUser(uid)
      })
      .then((userRecord) => {
        return new Date(userRecord.tokensValidAfterTime).getTime() / 1000
      })
      .then((timestamp) => {
        // Retrieve the timestamp of the revocation, in seconds since the epoch.
        console.log('Tokens revoked at: ', timestamp)
        return Promise.resolve(true)
      })
      .catch((err) => {
        console.error('Error', err)
        return Promise.reject(err)
      })
    )
  })

  //Execute promises
  console.log('Execute promises')
  return Promise.all(myPromises)
  .then(() => Promise.resolve(true))
  .catch((err) => {
    console.error('Error', err)
    return Promise.reject(err)
  })

})//End sessionSignout

使用自定义身份验证声明,并且仅允许用户访问在过去8小时内具有时间戳的数据。否则不允许访问。这有点像会话到期;)或者只需使用AdminSDK撤销会话令牌。您提到的链接有示例实现Hi Har Kal!谢谢你的回复!我要试试看!非常感谢!我发现了错误,请参阅下面的完整代码/将第3行的“const admin=database.admin”更改为“从firebase admin导入*作为管理员”,谢谢Doug的回复!我已经有了支持状态感知的代码-我知道用户是否登录以及何时登录!我将尝试并用示例代码更新这种方法!非常感谢!嗨,道格!我无法正确访问firebase应用程序。除此之外,我相信我的代码可以工作。