提问者:小点点

如何在nodejs的Firebase-admin中对用户进行身份验证?


目前,我正在nodejs上创建一个FirebaseAPI。我想在nodejs上使用Firebase-admin处理所有Firebase的东西(如身份验证)。但是,在客户端没有Javascript FirebaseSDK的情况下,在Firebase-admin中通过nodejs对用户进行身份验证的正确方法是什么?在官方的管理留档中,我没有找到nodejs的名为signInWellEmailAndPassword的函数(就像在客户端SDK一样)。只有一个名为getUserByEmail的函数,但是这个函数不会检查用户是否输入了正确的密码。

这是我的表格:

<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>

提交表单后,我将值传递给nodejs中的API:

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 ?

});

我的第一个想法是在客户端使用FirebaseSDK使用signInWellEmailAndPassword登录并获取uid。一旦我有了UID,我想将UID发送到nodejs并调用函数createCustomToken并将生成的令牌(带有一些额外的声明)返回给客户端。一旦我取回令牌,我将使用函数signWellCustomToken(在客户端)对用户进行身份验证。这种方法是正确的还是有更好的方法?


共3个答案

匿名用户

实际上,对于身份验证,您需要使用Firebase常规api,而不是管理员。

首先,这将为您提供一个刷新的Firebase令牌,而不是自定义令牌。如果您愿意,您可以做同样的事情来获得自定义令牌,如果您需要自定义令牌,我也有一个示例。

npm安装火力基地--保存

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'));
    }
});

注意:我正在使用此登录功能来测试Postman的其他功能,这就是我发送密钥的原因,所以我可以私下使用它。

现在结合ADMIN和FIREBASE节点,我可以在我的火力基础上用HTTP功能做很多非常有趣的事情。

希望它能有所帮助。

匿名用户

对于任何服务器端React用户,我被带到这里是因为我试图在客户端没有Javascript FirebaseSDK的情况下在Firebase中对用户进行身份验证。我正在构建一个服务器端渲染的react应用程序。客户端Firebase. auth()不适用于服务器端节点环境。

事实证明,您可以在组件DDMount()中运行fire base. auth()命令,因为它不在服务器上运行。在这里,您可以进行身份验证并获取用户的令牌,然后将其发送到云函数以进行任何需要用户身份验证的服务端渲染。

在服务器端,您可以使用admin sdk验证令牌。

您还需要Firebase/app和fire base/auth,并在浏览器特定的bundle. js中初始化Firebase,以便它不包含在服务器的bundle.js中

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

匿名用户

来自官方文档:

如果您的Firebase客户端应用与自定义后端服务器通信,您可能需要识别该服务器上的当前登录用户。要安全地做到这一点,请在成功登录后,使用HTTPS将用户的ID令牌发送到您的服务器。然后,在服务器上验证ID令牌的完整性和真实性,并从中检索uid。您可以使用以这种方式传输的uid安全地识别服务器上的当前登录用户。

工作流程是:

  1. 在客户端中使用Firebase WebSDK
  2. 用户使用任何身份验证方法登录
  3. 检索客户端上的ID令牌
firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
  // Send token to your backend via HTTPS
  // ...
}).catch(function(error) {
  // Handle error
});
// idToken comes from the client app
getAuth()
  .verifyIdToken(idToken)
  .then((decodedToken) => {
    const uid = decodedToken.uid;
    // ...
  })
  .catch((error) => {
    // Handle error
  });