Auth basico completado

This commit is contained in:
Daniel Cortes
2020-06-23 18:55:42 -04:00
parent 72107bbc91
commit f98ed25ed4
4 changed files with 113 additions and 52 deletions

View File

@@ -12,7 +12,7 @@ const generate_challenge = () => {
}
}
export const obtain_code = () => {
export const redirect_to_code = () => {
const challenge = generate_challenge()
const params = {
response_type: 'code',
@@ -24,10 +24,10 @@ export const obtain_code = () => {
};
const url = `${oauth_url}/authorize/?${new URLSearchParams(params).toString()}`;
return {
redirect: url,
code_verifier: challenge.code
}
window.localStorage.setItem('code_verifier', challenge.code);
window.location.href = url;
return null;
}
export const get_auth = async (code, code_verifier) => {
@@ -43,3 +43,71 @@ export const get_auth = async (code, code_verifier) => {
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'};
}
// 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');
const response = await get_auth(code, code_verifier)
// Puede que la respuesta sea erronea por varias razones
if (response.error) {
return {status: response.error}
}
// Una vez se tiene la respuesta se almacena el refresh_token y el expires_in
// en localstorage para ser utilizado mas tarde para renovar el access_token
window.localStorage.clear()
const refresh = response.refresh_token;
const expires = new Date(new Date().getTime() + ((response.expires_in) * 1000))
window.localStorage.setItem('refresh_token', refresh);
window.localStorage.setItem('expires', expires);
// Finalmente se retorna el access_token para ser utilizado en el estado de la app
return {status: 'done', access_token: response.access_token};
}
export const logout = async (access_token) => {
// Para hacer logout de un usuario es necesario eliminar el refresh token de su localStorage
// y se llama a revocar los tokens en el servidor oauth
const revoke_access_params = {
token: access_token,
client_id: client_id,
token_type_hint: 'access_token'
}
const revoke_refresh_params = {
token: window.localStorage.getItem('refresh_token'),
client_id: client_id,
token_type_hint: 'refresh_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));
return {
access_revoke: response_access_revoke,
refresh_revoke: response_refresh_revoke,
}
}