В настоящее время, когда я аутентифицирую пользователя с помощью 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 и повторите запрос. - Установите задержку при получениитокен аутентификации (не желательно)
- Есть еще идеи?
Спасибо!