javascript - 将firebase访问令牌传递给axios拦截器中的后端
问题描述
我需要一些帮助来了解如何通过我的 api 请求将 firebase 不记名/jwt 令牌传递到后端。
我正在使用 axios 并使用拦截器来设置与此类似的不记名令牌
axios.interceptors.request.use(
config => {
const userData = store.getters['firebaseAuth/user']
if (userData && userData.accessToken) {
config.headers['Authorization'] = 'Bearer ' + userData.accessToken
}
在 firebase auth 的所有示例中,我已经看到获取 jwt 令牌的方法是这样的:
firebase
.auth()
.currentUser.getIdToken(/* forceRefresh */ true)
.then(idToken => {
在我的拦截器中运行它以获取访问令牌是否是一种好习惯?..
对于向我的后端服务器发出的每个请求,感觉就像是对 firebase 服务器的不必要的额外 api 调用。
此外,当令牌可作为user
对象的属性使用时,我也很难理解为什么我什至应该使用这个 firebase 方法 (getIdToken)。它有一个奇怪的名字“za”,我认为这是从 firebase 故意的,并且没有提到使用它来获取 id/bearer/access 令牌。
firebase.auth().onAuthStateChanged(user => {
if (user) {
//user.za id the id/bearer/access token
我最初的想法是将 user.za 存储在 localstorage 中,然后从拦截器的本地存储中获取它。
解决方案
我不确定这是否是最好的方法,但我最终直接在我的拦截器中使用了 Firebase SDK 方法。我对getIdToken
API 的理解是,promise 返回一个缓存的 JWT,除非它过期,在这种情况下它会返回一个新的。我将拦截器函数设为异步,并用于await
同步请求令牌。
axios.interceptors.request.use(
async function (request) {
const user = currentUser();
if (user) {
try {
const token = await user.getIdToken(false); // Force refresh is false
request.headers["Authorization"] = "Bearer " + token;
} catch (error) {
console.log("Error obtaining auth token in interceptor, ", error);
}
}
return request;
},...
推荐阅读
- r - 启动错误:未使用的参数(原始),但正在使用参数
- android - 我在设置 Flutter 时遇到问题。我无法解决“AVD Pixel_3_API30 的模拟器进程被杀死。”
- microsoft-graph-api - 在 Microsoft 365 中自定义个人资料卡
- mysql - 为什么这不会通过表日期导入向导加载到 MySQL 中?
- http - 为什么邮递员 post 请求不发送正文变量?
- javascript - CSS 转换/转换在单击播放按钮时不起作用
- html - 位置:粘性在网站标题上不起作用
- mongodb - MongoDB 查询为一件事返回空数组,但不是另一件事
- css - CSS动画下划线从左到右,我需要从右到左
- varnish-vcl - 在 Varnish 中设置 BLOB 变量