微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Firebase中的身份验证问题-为什么我的令牌会立即过期?

如何解决Firebase中的身份验证问题-为什么我的令牌会立即过期?

我正在测试要构建的Firebase应用中的路由。有问题的路由会收到类似于状态更新的“呼喊”。无论如何,我只是使用FBuath集成了auth来保护此路由,但始终出现以下错误

Firebase ID令牌已过期。从您的客户端应用中获取新的ID令牌,然后重试

我尝试使用有效的凭据重新登录,然后立即尝试通过该路由发布内容,但始终收到此错误。有什么想法吗?代码如下,所讨论的路由具有端点“ / shout”。干杯

const functions = require('firebase-functions');
const admin = require('firebase-admin')
admin.initializeApp()

const config  = {
  apiKey: "AIzaSyBZjz9BNwj4UDwWLoQ1SOD5hB5QcNw3qqs",authDomain: "social-ape-21874.firebaseapp.com",databaseURL: "https://social-ape-21874.firebaseio.com",projectId: "social-ape-21874",storageBucket: "social-ape-21874.appspot.com",messagingSenderId: "323044904203",appId: "1:323044904203:web:edcbc619169a2087f8e60e",measurementId: "G-T34PXDM1X7"
}

admin.initializeApp

const express = require('express')
const app = express()

const firebase = require('firebase')
firebase.initializeApp(config)

const db = admin.firestore()

app.get('/shouts',(req,res) => {
  db
  .collection('shouts')
  .orderBy('createdAt','desc') //returns shouts in order in which they were made
  .get()
  .then((data) => {
    let shouts = []
    data.forEach((doc) => {
      shouts.push({
        shoutId: doc.id,body: doc.data().body,userHandle: doc.data().userHandle,createdAt: doc.data().createdAt
      })
    })
    return res.json(shouts)
  })
  .catch((err) => console.error(err))
})

const FBauth = (req,res,next) => {
  let idToken
  if(req.headers.authorization && req.headers.authorization.startsWith('Bearer ')){
    idToken = req.headers.authorization.split('Bearer ')[1]
  }else{
    console.error('No token found')
    return res.status(403).json({error: 'Unauthorized'})
  }
  //verify that this token was issued by our application
  admin.auth().verifyIdToken(idToken)
  .then(decodedToken => {
    req.user = decodedToken
    return db.collection('users')
    .where('userId','==',req.user.uid)
    .limit(1) //limits results to one document
    .get()
  })
  .then(data => {
    req.user.handle = data.docs[0].data().handle  //data() is a function that extracts data from document
    return next() //next() is a function that allows request to proceed to shout post route
  })
  .catch(err => {
    console.error('Error while verifying token',err)
    return res.status(403).json(err)
  })
}


app.post('/shout',FBauth,res) => {
  const newShout = {
    body: req.body.body,userHandle: req.body.userHandle,//userhandle identifies who is owner of shout
    createdAt: new Date().toISOString()
  }

  db
  .collection('shouts')
  .add(newShout)
  .then((doc) => {
    res.json({message: `document ${doc.id} created successfully`})
  })
  .catch((err) =>{
    res.status(500).json({error: 'something went wrong'})
    console.error(err)
  })
})

//helper function to determine if string is empty or not
//note: .trim() removes whitespace from email field
const isEmpty = (string) => {
  if (string.trim()=== '') {
    return true
  } else {
    return false
  }
}

//helper function to determine if valid email
const isEmail = (email) => {
  const regEx = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  if (email.match(regEx)) {
    return true
  } else {
    return false
  }
}


//Sign up route
app.post('/signup',res) => {
  //here we need to extract form data from request body
  const newUser = {
    email: req.body.email,password: req.body.password,confirmPassword: req.body.confirmPassword,handle: req.body.handle,}

  let errors = {}

  if(isEmpty(newUser.email)){
    errors.email = 'Email must not be empty'
  } else if(!isEmail(newUser.email)) {
    errors.email = 'Must be a valid email address'
  } //if not empty,need to check if valid email

  if(isEmpty(newUser.password)){
    errors.password = 'Must not be empty'
  }

  if(newUser.password !== newUser.confirmPassword) {
    errors.confirmPassword = 'Passwords must match'
  }

  if(isEmpty(newUser.handle)){
    errors.handle = 'Must not be empty'
  }

  if(Object.keys(errors).length>0) {
    return res.status(400).json(errors)
  }

  //sign up user
  let token
  db.doc(`/users/${newUser.handle}`).get()
  .then((doc)=> {
    if(doc.exists){
      return res.status(400).json({handle: 'this handle is already taken'})
    } else {
      return firebase
  .auth()
  .createuserWithEmailAndPassword(newUser.email,newUser.password)
    }
  })
  .then(data => {
    userId = data.user.uid
   return data.user.getIdToken()
  })
  .then(token => {
    token=token
    const userCredentials = {
      handle: newUser.handle,email: newUser.email,createdAt: new Date().toISOString(),userId:userId
    }
    db.doc(`/users/${newUser.handle}`).set(userCredentials)
    return res.status(201).json({token})
  })
  .then(() => {
    return res.status(201).json({token})
  })
  .catch(err => {
    console.error(err)
    return res.status(500).json({error:err.code})
  })
})
//token is used to access route that is protected


//login route
app.post('/login',res) => {
  const user = {
    email: req.body.email,password: req.body.password
  }

  let errors = {}

  if(isEmpty(user.email)){
    errors.email = 'Must not be empty'
  }
  if(isEmpty(user.password)){
    errors.password = 'Must not be empty'
  }

  if(Object.keys(errors).length >0) {
    return res.status(400).json(errors)
  }



  firebase.auth().signInWithEmailAndPassword(user.email,user.password)
  .then(data => {
    return data.user.getIdToken()
  })
  .then(token => {
    return res.json({token})
  })
  .catch(err => {
    console.error(err)
    if(err.code ==="auth/wrong-password" ){
      return res.status(403).json({general: 'Wrong credentials,please try again'})
    } else
    return res.status(500).json({error: err.code})
  })
})


exports.api = functions.https.onRequest(app)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?