Как обновить токен доступа для нескольких API, вызываемых параллельно, когда токен доступа для всех API становится недейAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как обновить токен доступа для нескольких API, вызываемых параллельно, когда токен доступа для всех API становится недей

Сообщение Anonymous »

В моем приложении React Native я получаю токен доступа и токен обновления после входа в систему.
Существует общая функция для повторного вызова токена доступа с использованием токена обновления при доступе. токен недействителен
На моей домашней странице есть 6 API, но когда токен доступа становится недействительным, эти 6 API параллельно вызывают общую функцию и обновляют токен доступа. Это приводит к блокировке конкретного пользователя.
Как это предотвратить? Блокировка остальных API с помощью флага, когда токен первого API становится недействительным, невозможна, поскольку перед первым ответом все API обновят токен доступа.
The handleResponse сначала запускается функция, затем код достигает функции getNewToken, затем он достигает диспетчеризации (logout()); потому что вызов токена доступа не завершается успехом, и приложение аварийно завершает работу, потому что вызывается выход из системы несколько раз.
const handleResponse = async (
res: ApiResponse | null,
) => {

if (res?.data?.error === 'invalid_token') {
let tokenVal;
try {
if (token.refresh_token) {
tokenVal = await getNewToken(token.refresh_token);
} else {
//refresh the public token
tokenVal = await refreshPublicToken();
}
if (tokenVal?.access_token && tokenVal?.access_token.length > 0) {
const newTokenHeader = {
Authorization: `Bearer ${tokenVal.access_token}`,
};
invoke({
requestHeader: { ...requestHeader, ...newTokenHeader },
requestBody,
requestParams,
requestQuery,
url: formattedEndpoint,
onResultCallback,
onErrorCallback,
});
dispatch(setToken(tokenVal));
} else {
setInvalidToken(true);
navigation.dispatch(
StackActions.replace(NAVIGATION_SCREENS.ROOT),
);
return;
}
return;
} catch (e) {
const newToken = await refreshPublicToken();
dispatch(setToken(newToken));
return;
}
}
const err = new CustomError(
res?.data?.error || res?.originalError?.message,
res?.data?.status || 200,
);
if (typeof onErrorCallback === 'function') {
onErrorCallback(err);
} else if (typeof onError === 'function') {
onError(err as CustomError);
}
handleParseError(err);
} else {
const responseData = res?.data as unknown as R;
if (renderData) {
setData(res?.data);
}
if (typeof onResultCallback === 'function') {
onResultCallback(res?.data as unknown as R);
} else if (typeof onResult === 'function') {
onResult(res?.data);
}
}
};

const getNewToken = async (refToken: string) => {
let formattedEndpoint = ENDPOINT.LOGIN;
let tokenVal = {};
const header = { refresh_token: refToken };
const requestQuery = {
...REFRESH_AUTH_HEADERS,
...header,
};
const queryParams = new URLSearchParams({
...requestQuery,
}).toString();
formattedEndpoint = `${formattedEndpoint}?${queryParams}`;
const refreshResponse = await api.post(
formattedEndpoint,
{},
{
headers: basicAuthHeaders,
},
);
if (refreshResponse.status === 200) {
tokenVal = {
access_token: refreshResponse.data?.access_token,
refresh_token: refreshResponse.data?.refresh_token,
expires_in: refreshResponse.data?.expires_in,
type: 'private',
};
} else {
// The logout gets called multiple times and app crashes
dispatch(logout());
tokenVal = {
access_token: null,
token_type: null,
refresh_token: null,
expires_in: null,
scope: null,
id_token: null,
type: 'public',
};
tokenVal = await refreshPublicToken();
navigation.dispatch(StackActions.replace(NAVIGATION_SCREENS.ROOT));
}
return tokenVal;
};


Подробнее здесь: https://stackoverflow.com/questions/777 ... hen-access
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»