使用 apollo-client + firebase auth 刷新令牌 [英] refreshing a token with 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';从阿波罗链接"导入 { Observable };//<-- 添加可观察对象从lib/firebase"导入 firebase;const errorLink = onError(({ graphQLErrors, networkError, operation, forward }) =>{让 accessToken = window.localStorage.getItem('access_token');如果(graphQLErrors){//用户访问令牌已过期if (graphQLErrors[0].message.includes('Signature has expired')) {if (accessToken && accessToken !== 'undefined') {//让我们通过异步请求刷新令牌返回新的 Observable(观察者 => {火力基地.auth().currentUser.getIdToken(true).then(function(idToken) {如果(!idToken){window.localStorage.removeItem('access_token');return console.log('刷新令牌已过期');}window.localStorage.setItem('access_token', idToken);//重置标题operation.setContext(({ headers = {} }) => ({标题:{//重新添加旧标题...标题,//将旧的访问令牌换成新的'登录令牌':idToken ||空值}}));常量订阅者 = {下一个:observer.next.bind(observer),错误:observer.error.bind(observer),完成:observer.complete.bind(observer)};//重试上次失败的请求转发(操作).订阅(订阅者);}).catch(错误=> {//没有可用的刷新或客户端令牌,我们强制用户登录观察者.错误(错误);});});}}}});导出默认错误链接;
上面的代码确实有效!
我的问题在这里:
if (graphQLErrors[0].message.includes('Signature has expired')) {
我的服务器的错误消息实际上是令牌已过期".我更改了上面的 if 语句,一切正常!
我在网上没有找到很多 apollo-client+firebase-auth 的例子,所以希望这个面包屑可以帮助其他人在使用 apollo-client 和 firebase auth 时.
I'm having some trouble figuring out token refreshes when using apollo-client and firebase's auth service.
I've setup token refresh using apollo client before. Typically I use the apollo-link-error package (apollo-link-error docs).
My understanding is you get the latest token from firebase auth with a promise like:
firebase.auth().currentUser.getIdToken
How to use the Firebase refreshToken to reauthenticate?
reading the answer from this post:
When you make call from a browser .getIdToken(true) will automatically refresh your token.
based on my above reading, I came up with the below snippet
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;
The code above actually works!
My issue was here:
if (graphQLErrors[0].message.includes('Signature has expired')) {
My server's error message is actually 'Token has expired'. I changed my if statement above, and all is well!
I didn't find a lot of examples of apollo-client+firebase-auth online, so hopefully this breadcrumb can help others when working with apollo-client and firebase auth.
这篇关于使用 apollo-client + firebase auth 刷新令牌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!