1

I'm creating web app using vue.js(Front-end), nodejs and firebase(Back-end).

My question is how to get permission to write in back-end(nodejs, firebase)?

First, I set under the rule about database:

"users": {
  "$uid": {
    ".write": "$uid === auth.uid",
    ".read": "auth != null && auth.uid === $uid"
  }
},

Second, I succeeded to sing-in on front-end(firebase, google sign-in) and verify IdToken(credential.accessToken) on the back-end:

Front-end:

  // Get logging user's idToken
  firebase.auth().onAuthStateChanged((user) => {
    if (user) {
      userObj.user = user
      firebase.auth().currentUser.getIdToken().then((idToken) => {
        console.log(`idToken ==> ${idToken}`)
        userObj.token = idToken
      })
    }
    resolve(userObj)
  })

  // Send idToken to backend
  HTTP.verifyUserToken(userObj.token)
    .then((result) => {
      console.log('verifyUserToken result ==> ', result)
      localStorage.setItem('tkn_usr_og', JSON.stringify(result))

      console.log('userObj.user')
      console.log(userObj.user)
    })

Back-end:

admin.auth().verifyIdToken(idToken)
  .then(function(decodedToken) {
     var uid = decodedToken.uid;
     console.log(decodedToken);
     res.status(200).json({success: true, result: decodedToken})
  }).catch(function(error) {
     // Handle error
     console.log('verifyIdToken error');
     console.log(error);
     res.status(400).json({success: false, result: err})
  });

Third, I can get decodedToken from nodejs back-end. decodedToken data is included under the data:

{
  iss: ~,
  name: ~,
  user_id: ~,
  sub: ~,
  iat: ~
  ....
},

Then, I attempt to write firebase database in back-end.

Under code is Writing to database in backend (node.js):

const usersDV = usersDB.child(usrData.uid) 
console.log(usersDV ==> ${usersDV}); 
usersDV.set(usrData) 
  .then(() => { 
    resolve(usrData.uid) 
  }) 
  .catch((err) => { 
    reject({'writeUserData':err}) 
  })

However, a Permission denied error is issued.

How can I solve this issue?

Below are my reference links:

https://firebase.google.com/docs/auth/admin/verify-id-tokens

Refresh Firebase Token

Firebase: Permission denied - setValue()

How to refresh expired google sign-in logins?

https://firebase.google.com/docs/auth/web/google-signin#-nodejs-firebase-

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
김준태
  • 33
  • 4
  • Can you add the code you are using to write to the database? And please specifiy were this code is located withing your project. – André Kool Apr 16 '18 at 12:11
  • @AndréKool Sure! Under code is Writing to database in backend (node.js). const usersDV = usersDB.child(usrData.uid) console.log(`usersDV ==> ${usersDV}`); usersDV.set(usrData) .then(() => { resolve(usrData.uid) }) .catch((err) => { reject({'writeUserData':err}) }) – 김준태 Apr 16 '18 at 12:16
  • @AndréKool Can I ask you a question? i want to write a data in nodejs backend. then, is it necessary to verify IdToken using admin.auth().verifyIdToken(idToken) ? – 김준태 Apr 16 '18 at 14:10
  • I have no idea, I never worked with nodejs or the admin SDK of firebase. – André Kool Apr 16 '18 at 14:16
  • Something's not quite right about this design. Why are you verifying ID token in the backend and then send the decoded token back to the client? You should just access the DB at that point using the Admin SDK. – Hiranya Jayathilaka Apr 16 '18 at 17:55

0 Answers0