问题描述
使用Apollo-Client和Firebase的Auther Service时,我在找出令牌刷新时遇到了一些麻烦.
之前,我之前使用Apollo客户端设置了令牌刷新.通常,我使用Apollo-link-error软件包( apollo-link-link-link-ernor docs ).
我的理解是,您从Firebase Auth获得了最新的令牌,其承诺是:
firebase.auth().currentUser.getIdToken
从此帖子:>:>:
当您从浏览器拨打电话时.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')) {
我的服务器的错误消息实际上是"令牌已过期".我更改了上述语句,一切都很好!
我找不到在线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.