node.js - 了解 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 的工作原理知之甚少,但我想了解如何验证用户密码,如上面链接的文档中所述
解决方案
当您在服务器端代码中为用户创建自定义令牌时,您有责任检查用户的凭据是否有效。当您拥有想要与 Firebase 集成的现有用户凭据目录时,通常会生成自定义令牌。
虽然可以根据存储在该用户的 Firebase 身份验证中的数据检查输入的凭据,但它非常复杂,当您铸造自定义令牌时,将凭据存储在 Firebase 身份验证中几乎没有意义。我有一种感觉,我们正在处理一个XY 问题。
为什么不使用 Firebase 身份验证客户端 JavaScript SDK?对于这种情况,这将变得更加容易和惯用。
推荐阅读
- excel - excel vba将csv文件的内容合并到新工作簿
- java - If-else-if not working(或如何切换多个 PostMapping 参数以查询 Spring MVC 上的方法)
- r - 用 1 和 0 填充矩阵中的单元格
- c++ - 为什么 FOLDERID_ProgramData 返回空字符串?
- amazon-web-services - 如何在(胶水)Spark Streaming 作业中使用 Spark SQL?
- reactjs - 编剧等待基本 URL
- javascript - 独立于前一个数组的对象的总和
- r - 通过添加两列来新建列
- flutter - Flutter FutureBuilder snapshot.data接收null
- python-3.x - 如何在不计算文本格式的情况下获取字符串的长度