autorizaSesion method
Este evento es utilizado para autorizar la sesion del usuario
este evento se ejecuta cuando se realiza un login o cuando el status
de la peticion al servidor devuelve un sataus == 400 y inStatus == 101
parametros
clientId- es el clientId que se obtiene del servidorclientSecret- es el clientSecret que se obtiene del servidor Pata Tener en cuenta este evento es utilizado caundo se trabaja con el login SDK por lo tanto se pasa como valor en redirectoUri el valorsocketrespuesta - solamente emite un Mapa con el KeydataOkcuando el status de que devuelve el server es200y la funcion obtieneToken utilizando el codigoAutorizacion da un resultado OK de lo contrario devuelve un mapa con el KeydataNOkahora si el status es302tambien devuelve un mapa con el KeydataNOkpero con el keyredirectUriy en su valor la url de redireccionamiento para realizar el login
Implementation
Future<Map<String, dynamic>> autorizaSesion({
required String clientId,
required String clientSecret,
}) async {
return FlutterUtilsProvider.ejecutaPeticion(() async {
// Inicializamos el provider con la cascada para asignar valores
final dataShpProvider = DataShpProvider();
logDebug('CloudApi.autorizaSesion: Inicio debugMode');
// Construimos el body para la petición
final body = {
EnvironmentApiRest.clientId: clientId,
EnvironmentApiRest.clientSecret: clientSecret,
EnvironmentApiRest.redirectUri: RedirectUri.socket.name,
EnvironmentApiRest.idSesion: dataShpProvider.idSesion,
EnvironmentApiRest.keyLogin: dataShpProvider.keyLogin,
};
logDebug(
'CloudApi.autorizaSesion: endPoint: '
'${cloudDb.endpointAuth}${EnvironmentApiRest.rutaAutorizaSesion}, '
'body: $body',
);
// Ejecutamos la petición HTTP
final flutterHttpProvider =
FlutterHttpProvider(enableDebugLogs: enableDebugLogs);
final response = await flutterHttpProvider.httpAccion(
'POST',
'${cloudDb.endpointAuth}${EnvironmentApiRest.rutaAutorizaSesion}',
false,
'',
'',
body: body,
);
logDebug('CloudApi.autorizaSesion: response: $response');
// Manejo del estado cuando no hay conexión (offline)
if (response[EnvironmentApiRest.status] ==
EnvironmentApiRest.sinInternet) {
// Si hay una sesión almacenada localmente, permitimos trabajar offline
if (dataShpProvider.idSesion.isNotEmpty) {
return {
EnvironmentApiRest.dataOk: 'Sesion iniciada Offline',
EnvironmentApiRest.cambioUsuario: false,
EnvironmentApiRest.idColeccionAuth: dataShpProvider.idColeccionAuth,
};
}
}
// Si el response contiene dataNOk, significa que hubo un error en backend
if (response.containsKey(EnvironmentApiRest.dataNOk)) {
throw response[EnvironmentApiRest.error];
}
// Revisamos el status devuelto
final status = response[EnvironmentApiRest.status];
// Caso: 200 - Sesión autorizada en el servidor
if (status == '200') {
final respuesta = List.from(response[EnvironmentApiRest.data] ?? []);
if (respuesta.isEmpty) {
throw 'No se obtuvo respuesta del servidor';
}
final firstItem = respuesta.first as Map<String, dynamic>;
final codigoAutorizacion =
firstItem[EnvironmentApiRest.codigoAutorizacion] ?? '';
// Obtenemos el token usando el código de autorización
final respuestaObtieneToken = await cloudDb.obtieneToken(
codigoAutorizacion: codigoAutorizacion,
);
if (respuestaObtieneToken.containsKey(EnvironmentApiRest.dataNOk)) {
throw respuestaObtieneToken[EnvironmentApiRest.error];
}
await dataShpProvider
.setIdSesion(firstItem[EnvironmentApiRest.idSesion] ?? '');
// dataShpProvider.idSesion = firstItem[EnvironmentApiRest.idSesion] ?? '';
final idColeccionAuth = firstItem[EnvironmentApiRest.idColeccion] ?? '';
return {
EnvironmentApiRest.dataOk: 'Sesion Autorizada Correctamente',
EnvironmentApiRest.cambioUsuario:
dataShpProvider.idColeccionAuth != idColeccionAuth,
EnvironmentApiRest.idColeccionAuth: idColeccionAuth,
};
}
// Caso: 302 - Redirección requerida
if (status == '302') {
dataShpProvider
.setIdSesion(response[EnvironmentApiRest.idSesion] ?? '');
// dataShpProvider.idSesion = response[EnvironmentApiRest.idSesion] ?? '';
logDebug(
'CloudApi.autorizaSesion: redirectUri(location): '
'${response[EnvironmentApiRest.location]}',
);
return {
EnvironmentApiRest.dataNOk: 'NOK',
EnvironmentApiRest.redirectUri:
response[EnvironmentApiRest.location] ?? '',
EnvironmentApiRest.socketChannel:
response[EnvironmentApiRest.socketChannel] ?? '',
};
}
// Si no es ninguno de los anteriores, se retorna la respuesta tal cual
return response;
});
}