From 2308e6074e7c1226047fecce54e2b70fad400bda Mon Sep 17 00:00:00 2001 From: Daniel Cortes Date: Tue, 23 Jun 2020 22:47:26 -0400 Subject: [PATCH] Issue #21 usando refresh_token para refrescar el access_token --- src/services/auth_service.js | 71 +++++++++++++++++++++++++----------- 1 file changed, 50 insertions(+), 21 deletions(-) diff --git a/src/services/auth_service.js b/src/services/auth_service.js index 816f1b3..dfa9641 100644 --- a/src/services/auth_service.js +++ b/src/services/auth_service.js @@ -30,7 +30,7 @@ export const redirect_to_code = () => { return null; } -export const get_auth = async (code, code_verifier) => { +export const do_auth = async (code, code_verifier) => { const params = { code: code, code_verifier: code_verifier, @@ -44,30 +44,59 @@ export const get_auth = async (code, code_verifier) => { 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) => { - // Primera fase, obtener código - // Si es que no se tiene se tiene que redirigir a la pagina de oauth que entregara el código - // 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 - if (!window.localStorage.getItem('code_verifier')) { - redirect_to_code(); - return {status: 'redirect_to_code'}; + // Como response se puede obtener desde refresh o desde un auth regular, se almacena al inicio + let response; + + // Preámbulo, puede existir un refresh_token usable asi que debe hacer el flow de renew + if (window.localStorage.getItem('refresh_token')) { + const expires = new Date(window.localStorage.getItem('expires')); + + // 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. - // 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}; + if (!response) { + // Primera fase, obtener código + // Si es que no se tiene se tiene que redirigir a la pagina de oauth que entregara el código + // 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 + 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. - 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 + // Puede que la respuesta sea errónea por varias razones if (response.error) { return {status: response.error} } @@ -101,7 +130,7 @@ export const logout = async (access_token) => { } window.localStorage.clear(); - + const url = `${oauth_url}/revoke_token/`; const response_access_revoke = await axios.post(url, new URLSearchParams(revoke_access_params)); const response_refresh_revoke = await axios.post(url, new URLSearchParams(revoke_refresh_params));