2017-07-04 54 views
4

目前我正在爲nodejs創建一個Firebase API。我想用nodejs上的firebase-admin處理所有的Firebase資料(如身份驗證)。但是,通過firebase-admin 而不是客戶端上的Javascript Firebase SDK對用戶進行身份驗證的正確方法是什麼?在官方documentation for admin我沒有找到一個名爲的函數signInWithEmailAndPassword(就像在客戶端SDK上)的nodejs。只有一個函數叫做「getUserByEmail」,但是這個函數並不檢查用戶是否輸入了正確的密碼。如何在nodejs中驗證firebase-admin中的用戶?

這是我的形式:

<form class="sign-box" action="/login" method="post"> 

     <div class="form-group"> 
      <input id="username" name="username" type="text" class="form-control" placeholder="E-Mail"/> 
     </div> 
     <div class="form-group"> 
      <input id="password" name="password" type="password" class="form-control" placeholder="Password"/> 
     </div> 
     <button type="submit" class="btn btn-rounded">Sign in</button> 

</form> 

一旦提交表單我值傳遞給我的API中的NodeJS:

app.post('/login', urlencodedParser, function (req, res) { 

    // getting the values 

    response = { 
     username: req.body.username, 
     password: req.body.password 

    };  

    // authenticate the user here, but how ? 

}); 

我最初的想法是使用火力地堡SDK在客戶端上方面用signInWithEmailAndPassword並獲得uid。一旦我有UID,我想將UID發送到nodejs並調用函數createCustomToken,並將生成的令牌(帶有一些額外的聲明)返回給客戶端。一旦我獲得令牌,我將使用函數signWithCustomToken(在客戶端)對用戶進行身份驗證。這種方式是正確的還是有更好的方法?

+0

通常,用戶在客戶端進行身份驗證。 Firebase經過優化,可以在客戶端運行。無論如何,如果你堅持,你可以在你的服務器上使用客戶端node.js'require('firebase')'庫。這就是你需要的客戶端API'signInWithEmailAndPassword'等。 – bojeil

+0

是的,這是真的。我使用firebase-admin的原因是我可以將自定義聲明添加到令牌並將其發回給用戶。但是,這是在nodejs中使用firebase模塊的一種好方法,可以對令牌進行身份驗證並將其發回。謝謝! – Harry

回答

3

其實對於身份驗證,您將需要使用firebase的常規API,不需要管理員。

首先,這會爲您提供刷新的firebase令牌,而不是自定義令牌。 如果你喜歡,你可以做同樣的事情來獲得自定義的令牌,如果你需要自定義的令牌,我也有一個例子。

NPM安裝火力--save

const firebase = require("firebase"); 
const config = { 
    apiKey: "", 
    authDomain: "", 
    databaseURL: "", 
    projectId: "", 
    storageBucket: "", 
    messagingSenderId: "" 
}; 
firebase.initializeApp(config); 

我張貼我的登錄火力功能,但你可以改變它來輕鬆地表達。

exports.login = functions.https.onRequest((req, rsp)=>{ 
    const email = req.body.email; 
    const password = req.body.password; 
    const key = req.body.key; 
    const _key = '_my_key_'; 
    let token = ''; 
    if(key === _key){   
    firebase.auth().signInWithEmailAndPassword(email,password).then((user)=>{ 
//The promise sends me a user object, now I get the token, and refresh it by sending true (obviously another promise)    
user.getIdToken(true).then((token)=>{ 
       rsp.writeHead(200, {"Content-Type": "application/json"}); 
       rsp.end(JSON.stringify({token:token})); 
      }).catch((err)=>{ 
       rsp.writeHead(500, {"Content-Type": "application/json"}); 
       rsp.end(JSON.stringify({error:err})); 
      }); 
     }).catch((err)=>{ 
      rsp.writeHead(500, {"Content-Type": "application/json"}); 
      rsp.end(JSON.stringify({error:err})); 
     }); 
    } else { 
     rsp.writeHead(500, {"Content-Type": "application/json"}); 
     rsp.end(JSON.stringify('error - no key')); 
    } 
}); 

注:我用這個登錄功能來測試我的郵差等功能,所以這就是爲什麼我發送的關鍵,所以我可以私下使用。

現在結合了ADMIN和FIREBASE節點apy,我可以在我的firebase上使用HTTP功能做很多非常有趣的事情。

希望它以某種方式幫助。

0

對於任何服務器端陣營 我被帶到這裏的用戶是因爲我試圖不JavaScript的火力地堡SDK在客戶端和認證的火力用戶。我正在構建一個服務器端渲染反應的應用程序客戶端firebase.auth()在服務器端節點環境中不起作用。

事實證明,您可以在componentDidMount()內運行firebase.auth()命令,因爲它不在服務器上運行。這是您可以進行身份​​驗證並獲取用戶令牌的位置,然後將其發送到任何需要用戶身份驗證的服務器端呈現的雲功能。

在服務器端,您可以使用admin sdk驗證令牌。

您還需要爲需要火力/應用程序和火力/ AUTH,並在您的瀏覽器特定的bundle.js初始化火力點,所以它不會在你的服務器的bundle.js包括

componentDidMount() { 
 
    firebase.auth().onAuthStateChanged(function(user) { 
 
     if (user) { 
 
      console.log("User signed in!"); 
 
     } else { 
 
      console.log("User NOT signed in!"); 
 
     } 
 
    }); 
 
}