Обработка задержки инициализации firebase и токенов id для пользовательского бэкэнда apollo graphql - PullRequest
0 голосов
/ 17 апреля 2019

В настоящее время, когда я аутентифицирую пользователя с помощью firebase, я сохраняю его токен авторизации в localStorage, чтобы позже использовать его для подключения к своему бэкэнду следующим образом:

const httpLink = new HttpLink({uri: 'http://localhost:9000/graphql'})

const authMiddleware = new ApolloLink((operation, forward) => {
  // add the authorization token to the headers
  const token = localStorage.getItem(AUTH_TOKEN) || null
  operation.setContext({
    headers: {
      authorization: token ? `Bearer ${token}` : ''
    }
  })
  return forward(operation)
})

const authAfterware = onError(({networkError}) => {
  if (networkError.statusCode === 401) AuthService.signout()
})

function createApolloClient() {
  return new ApolloClient({
    cache: new InMemoryCache(),
    link: authMiddleware.concat(authAfterware).concat(httpLink)
  })
}

Моя проблема в том, что янет способа обновить токен после его истечения.Поэтому я попытался использовать следующее для установки токена авторизации для apollo:

const httpLink = new HttpLink({uri: 'http://localhost:9000/graphql'})

const asyncAuthLink = setContext(
  () => {
    return new Promise((success, reject) => {
      firebase.auth().currentUser.getToken().then(token => {
        success({
          headers: {
            authorization: token ? `Bearer ${token}` : ''
          }
        })
      }).catch(error => {
        reject(error)
      })
    })
  }
)

const authAfterware = onError(({networkError}) => {
  if (networkError.statusCode === 401) AuthService.signout()
})

function createApolloClient() {
  return new ApolloClient({
    cache: new InMemoryCache(),
    link: asyncAuthLink.concat(authAfterware.concat(httpLink))
  })
}

Это работает, когда пользователь впервые аутентифицируется, но как только пользователь обновляет страницу, firebase больше не инициализируется, когда мои запросы graphqlотправлено на мой бэкэнд, поэтому токен не отправляется вместе с ним.Есть ли способ, которым я могу асинхронно ждать firebase.auth().currentUser, чтобы это работало?Или есть другой подход, который я должен использовать полностью?Насколько я знаю (уверен на 100%) currentUser.getIdToken делает сетевой вызов только в том случае, если текущий токен больше не действителен.Я думаю, что это приемлемо, так как в случаях, когда токен недействителен, серверная часть не может ответить в любом случае, поэтому мне нужно будет ждать продолжения обновления токена.

Некоторые другие идеи, о которых я подумал:

  • Продолжайте использовать localStorage для хранения токена аутентификации, обновите его в authAfterware, если мой бэкэнд отправит ответ 401 и повторите запрос.
  • Установите задержку при получениитокен аутентификации (не желательно)
  • Есть еще идеи?

Спасибо!

...