Ami*_*ine 6 firebase react-native firebase-authentication
我在我的本机应用程序中使用 firebase 作为后端。所有客户端 API 请求都转到我的 firebase 云函数,这些函数使用 Firebase(身份验证、firestore、存储)处理所有后端逻辑。对于我的身份验证逻辑,一旦用户使用电子邮件和密码登录,我就会得到一个令牌。令牌存储在 AsyncStorage 中并添加到后端的每个请求的标头中。
到目前为止一切正常,问题是令牌在 1 小时左右后过期,用户被迫再次登录。我搜索了 firebase 文档和网络,我知道我需要在每个经过身份验证的请求之前要求一个新的令牌。问题是我想不通怎么办?
为了提高精度,我对所有需要身份验证的请求使用了一个中间件函数 (isAuthenticated),在那里我验证了令牌(这是在我的后端服务器中完成的)。
// Users routes
app.post("/signup", signup);
app.post("/login", login);
app.post("/user/image", isAuthenticated, uploadImage);
app.post("/user", isAuthenticated, addUserDetails);
Run Code Online (Sandbox Code Playgroud)
我的问题是如何实现令牌刷新逻辑,我可以要求一个带有过期令牌的新令牌吗?提前致谢。
更新:(更多详细信息)这是我首先获取令牌的方式:客户端应用程序(移动+网络)向我的 firebase 函数发送 REST 请求。例如登录,我有这个功能:
exports.login = (req, res) => {
const user = {
email: req.body.email,
password: req.body.password
};
const { valid, errors } = validateLoginData(user);
if (!valid) return res.status(400).json(errors);
firebase
.auth()
.signInWithEmailAndPassword(user.email, user.password)
.then(data => {
return data.user.getIdToken();
})
.then(token => {
return res.json({ token });
})
.catch(err => {
return res
.status(403)
.json({ general: "Wrong credentials, please try again" });
});
};
Run Code Online (Sandbox Code Playgroud)
登录后,客户端会收到令牌并使用 AsyncStorage/LocalStorage 将其存储在授权标头中。
对于所有经过身份验证的根,我使用此中间件函数检查用户令牌:
exports.isAuthenticated = async (req, res, next) => {
let idToken;
if (
req.headers.authorization &&
req.headers.authorization.startsWith("Bearer ")
) {
idToken = req.headers.authorization.split("Bearer ")[1];
} else {
console.error("No token found");
return res.status(403).json({ error: "Unauthorized" });
}
admin
.auth()
.verifyIdToken(idToken)
.then(decodedToken => {
req.user = decodedToken;
return db
.collection("users")
.where("userId", "==", req.user.uid)
.limit(1)
.get();
})
.then(data => {
return next();
})
} catch (err) {
console.error(err);
}
};
Run Code Online (Sandbox Code Playgroud)
提前致谢。
小智 1
我发现有一段时间没有人更新这个,所以我想我应该在后端写下我所做的事情来重新验证过期的令牌。它被埋在某个地方,很难找到,因为官方文档没有涵盖这一点。
let body = {
grant_type: "refresh_token",
refresh_token: req.body.refreshToken || null
};
if (!body.refresh_token) {
return res.status(400).json({
message: ERROR._400
})
}
const {data: {refresh_token, id_token}} = await axios.post(`https://securetoken.googleapis.com/v1/tokenkey=${config.apiKey}`, body);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1159 次 |
| 最近记录: |