Issue #21 usando refresh_token para refrescar el access_token

This commit is contained in:
Daniel Cortes
2020-06-23 22:47:26 -04:00
parent 5902ee53fc
commit 2308e6074e

View File

@@ -30,7 +30,7 @@ export const redirect_to_code = () => {
return null; return null;
} }
export const get_auth = async (code, code_verifier) => { export const do_auth = async (code, code_verifier) => {
const params = { const params = {
code: code, code: code,
code_verifier: code_verifier, code_verifier: code_verifier,
@@ -44,30 +44,59 @@ export const get_auth = async (code, code_verifier) => {
return response.data return response.data
} }
export const do_refresh = async (token) => {
const params = {
grant_type: 'refresh_token',
refresh_token: token,
client_id: client_id,
};
const url = `${oauth_url}/token/`
const response = await axios.post(url, new URLSearchParams(params));
return response.data;
}
export const auth = async (params) => { export const auth = async (params) => {
// Primera fase, obtener código // Como response se puede obtener desde refresh o desde un auth regular, se almacena al inicio
// Si es que no se tiene se tiene que redirigir a la pagina de oauth que entregara el código let response;
// a la pagina de redirect como parámetro GET, este trabajo lo hace redirect y se volverá a
// ejecutar este método cuando se entre a esa ruta // Preámbulo, puede existir un refresh_token usable asi que debe hacer el flow de renew
if (!window.localStorage.getItem('code_verifier')) { if (window.localStorage.getItem('refresh_token')) {
redirect_to_code(); const expires = new Date(window.localStorage.getItem('expires'));
return {status: 'redirect_to_code'};
// Si es que el token aun es valido se llama a refresh
if (expires > new Date()) {
const refresh_token = window.localStorage.getItem('refresh_token');
response = await do_refresh(refresh_token);
console.log('refresh response', response);
}
} }
// Segunda fase, se llama a auth con los parámetros de la ruta. if (!response) {
// Estos parámetros puede contener un error, en ese caso se elimina el code_verifier del storage // Primera fase, obtener código
// porque no sera util y fallo la request. // Si es que no se tiene se tiene que redirigir a la pagina de oauth que entregara el código
if (params.error) { // a la pagina de redirect como parámetro GET, este trabajo lo hace redirect y se volverá a
window.localStorage.clear() // ejecutar este método cuando se entre a esa ruta
return {status: 'code_error', value: params.error}; if (!window.localStorage.getItem('code_verifier')) {
redirect_to_code();
return {status: 'redirect_to_code'};
}
// Segunda fase, se llama a auth con los parámetros de la ruta.
// Estos parámetros puede contener un error, en ese caso se elimina el code_verifier del storage
// porque no sera util y fallo la request.
if (params.error) {
window.localStorage.clear()
return {status: 'code_error', value: params.error};
}
// Teniendo el código en los parámetros se intenta obtener el código de autorización.
const code = params.code;
const code_verifier = window.localStorage.getItem('code_verifier');
response = await do_auth(code, code_verifier)
} }
// Teniendo el código en los parámetros se intenta obtener el código de autorización. // Puede que la respuesta sea errónea por varias razones
const code = params.code;
const code_verifier = window.localStorage.getItem('code_verifier');
const response = await get_auth(code, code_verifier)
// Puede que la respuesta sea erronea por varias razones
if (response.error) { if (response.error) {
return {status: response.error} return {status: response.error}
} }