javascript - 使用 apollo-client + firebase auth 刷新令牌
问题描述
使用 apollo-client 和 firebase 的身份验证服务时,我在确定令牌刷新时遇到了一些麻烦。
我之前使用 apollo 客户端设置了令牌刷新。通常我使用 apollo-link-error 包(apollo-link-error docs)。
我的理解是您从 firebase auth 获得最新的令牌,并承诺如下:
firebase.auth().currentUser.getIdToken
如何使用 Firebase refreshToken 重新认证?
阅读这篇文章的答案:
当您从浏览器拨打电话时, .getIdToken(true) 将自动刷新您的令牌。
根据我上面的阅读,我想出了下面的片段
import { onError } from 'apollo-link-error';
import { Observable } from 'apollo-link'; // <-- Add Observable
import firebase from 'lib/firebase';
const errorLink = onError(
({ graphQLErrors, networkError, operation, forward }) => {
let accessToken = window.localStorage.getItem('access_token');
if (graphQLErrors) {
// User access token has expired
if (graphQLErrors[0].message.includes('Signature has expired')) {
if (accessToken && accessToken !== 'undefined') {
// Let's refresh token through async request
return new Observable(observer => {
firebase
.auth()
.currentUser.getIdToken(true)
.then(function(idToken) {
if (!idToken) {
window.localStorage.removeItem('access_token');
return console.log('Refresh token has expired');
}
window.localStorage.setItem('access_token', idToken);
// reset the headers
operation.setContext(({ headers = {} }) => ({
headers: {
// Re-add old headers
...headers,
// Switch out old access token for new one
'login-token': idToken || null
}
}));
const subscriber = {
next: observer.next.bind(observer),
error: observer.error.bind(observer),
complete: observer.complete.bind(observer)
};
// Retry last failed request
forward(operation).subscribe(subscriber);
})
.catch(error => {
// No refresh or client token available, we force user to login
observer.error(error);
});
});
}
}
}
}
);
export default errorLink;
解决方案
上面的代码确实有效!
我的问题在这里:
if (graphQLErrors[0].message.includes('Signature has expired')) {
我的服务器的错误消息实际上是“令牌已过期”。我更改了上面的 if 语句,一切都很好!
我没有在网上找到很多 apollo-client+firebase-auth 的例子,所以希望这个面包屑可以帮助其他人在使用 apollo-client 和 firebase auth 时。
推荐阅读
- python - 确保输入名称只有字母
- python - 从另一个函数返回“文件名”后未定义 NameErorr 名称“文件名”
- elasticsearch - 如何从弹性搜索标记器中删除一个分隔符?
- python - 检查当前时间是否早于到期时间的代码
- python - W&B Keras 回调 TypeError:输入类型不支持 ufunc 'isfinite'
- python - 使用 CDO 计算 ERA5 每日总降水量
- python - python查找作为参数传入的二维列表的列大小
- python - python:从字典生成二维数组
- javascript - babeljs.io 版本的箭头函数在 safari 中失败
- bartender - A4 中的调酒师打印