首页 > 解决方案 > 了解 Firebase 如何处理使用 JWT 登录

问题描述

我在 ExpressJS 应用程序中使用 firebase 实现 JWT 身份验证,其中 JWT 由 firebase 本身生成

login.html中

<form method="POST" class="register-form" id="login-form">
                        <div class="form-group">
                            <label><i class="zmdi zmdi-account material-icons-name"></i></label>
                            <input type="text" name="email" id="email" placeholder="Email" required/>
                        </div>
                        <div class="form-group">
                            <label><i class="zmdi zmdi-lock"></i></label>
                            <input type="password" name="password" id="password" placeholder="Password" required/>
                        </div>
                        <div class="form-group">
                            <input type="checkbox" name="remember-me" id="remember-me" class="agree-term" />
                            <label for="remember-me" class="label-agree-term"><span><span></span></span>Remember me</label>
                        </div>
                        <div class="form-group form-button">
                            <input type="submit" name="signin" id="signin" class="form-submit" value="Log in"/>
                        </div>

<script>
    // afterinitialzing firebase app
    document
          .getElementById("login-form")
          .addEventListener("submit", (event) => {
            event.preventDefault();
            const login = event.target.email.value;
            const password = event.target.password.value;

            const getToken = () => {
              console.log(login, password);
              return fetch(
                '/getToken', 
                { 
                  method: 'POST', 
                  headers: {
                    'Accept': 'application/json',
                    'Content-Type': 'application/json'
                  }, 
                  body: JSON.stringify({ 
                          email: login,
                          password: password 
                        }) 
                  }
              )
            }
            getToken();
</script>

根据firebase生成自定义令牌,我必须创建一条路由,在该路由中我验证用户的密码和电子邮件并获取uid并生成令牌为

app.post('/getToken', (req, res) => {
  const email = req.body.email
  const password = req.body.password

  admin
  .auth()
  .getUserByEmail(email)
  .then((userRecord) => {
    const uid = userRecord.uid;
    admin
    .auth()
    .createCustomToken(uid)
    .then((customToken) => {
      res.json({ token: customToken });
    })
    .catch((error) => {
      console.log('Error creating custom token:', error);
    });
  })
  .catch((error) => {
    console.log('Error fetching user data:', error);
  });

})

然后以这种方式完成签名

const getToken = () => {
              console.log(login, password);
              return fetch(
                '/getToken', 
                { 
                  method: 'POST', 
                  headers: {
                    'Accept': 'application/json',
                    'Content-Type': 'application/json'
                  }, 
                  body: JSON.stringify({ 
                          email: login,
                          password: password 
                        }) 
                  }
              ).then((responseData) => {
                firebase.auth().signInWithCustomToken(token)
                .then((userCredential) => {
                  // Signed in
                  var user = userCredential.user;
                  // ...
                })
                .catch((error) => {
                  var errorCode = error.code;
                  var errorMessage = error.message;
                  // ...
                });

              })
            }
            getToken();

我希望这是需要做的。我意识到在整个过程中我没有验证用户在任何地方输入的密码。我对 jwt 的工作原理知之甚少,但我想了解如何验证用户密码,如上面链接的文档中所述

标签: node.jsfirebasefirebase-authentication

解决方案


当您在服务器端代码中为用户创建自定义令牌时,有责任检查用户的凭据是否有效。当您拥有想要与 Firebase 集成的现有用户凭据目录时,通常会生成自定义令牌。

虽然可以根据存储在该用户的 Firebase 身份验证中的数据检查输入的凭据,但它非常复杂,当您铸造自定义令牌时,将凭据存储在 Firebase 身份验证中几乎没有意义。我有一种感觉,我们正在处理一个XY 问题

为什么不使用 Firebase 身份验证客户端 JavaScript SDK?对于这种情况,这将变得更加容易和惯用。


推荐阅读