繁体   English   中英

了解 firebase 如何处理使用 JWT 登录

[英]Understanding how firebase handles signing In with JWT

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

登录.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 生成自定义令牌,我必须创建一条路径,在其中验证用户密码和 email 并获取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 的工作原理知之甚少,但我想了解如何验证上面链接的文档中所述的用户密码

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM