leobz / Organize-matches

Football match management web service: Java, React, MongoDB, Telegram Bot, Vegeta load tests, Certbot and AWS.
MIT License
0 stars 0 forks source link

E1: Autenticacion de aplicacion (Login + Logout) #25

Closed leobz closed 2 years ago

leobz commented 2 years ago

La APP tiene que cumplir con requerimientos mínimos de seguridad (manejo de contraseñas, recursos externos, etc.) Las claves deben ser guardadas de forma correcta. En caso de existir, las API keys NUNCA debe ser expuestas al usuario

leobz commented 2 years ago

Nota: Quedamos en utilizar una biblioteca de Autenticacion /Gestion de sesion y utilizarla. Queda investigar y decidir cual usar

aleasquini commented 2 years ago

image

El endpoint será POST /login El DTO que utilicé tiene al alias como el usuario (esto se puede cambiar por el mail).

En result llega el token. Dentro del token vendrá el id_user en caso de la autenticación sea exitosa. De existir algun fallo en la autenticación, devuelve código 401, Acces Denied.

FranCICSo commented 2 years ago

Para mi deberíamos usar el email, porque el alias puede ser algo como "El huevo", y me parece raro que una app te permita loguear con un string con espacios. Respecto al login por lo que nos recomendó Diego, el token debe venir como un set-cookie con http only, un tiempo de expiración bajo. Y cuando se hace el logout, el token se mete en una lista en memoria de blacklisteados. Cuando se accede a crear o ver partidos, se chequea primero que el token no esté blacklisteado, y que sea válido.

FranCICSo commented 2 years ago

Para mi ni hace falta que crees un DTO para mapear el request de /login. Yo recibiría un User, de ese objeto sólo agarraría el mail y password que es lo que te voy a mandar desde el front, y en la respuesta armaría un json a mano con el userId como único atributo, además de que el endpoint reciba un HttpServletResponse para meterle el header set-cookie:

@GetMapping("/login", produces = MediaType.APPLICATION_JSON_VALUE)
public String login(User userToLogin, HttpServletResponse response) {

    User user = userService.getUserByEmail(userToLogin.getEmail()); //<-- yo te creo este método en mi branch 39-sign-in
    String token = loginService.loginUser(user);//<-- si el usuario no existe, tirás el 401 desde acá

    // crea una cookie
    Cookie cookie = new Cookie("token",token);
    // expira en 1 hora
    cookie.setMaxAge(60 * 60);
    // para seguridad
    cookie.setSecure(true);
    cookie.setHttpOnly(true);
    cookie.setPath("/");

    // agrego cookie al response
    response.addCookie(cookie);

    JsonObject loginResponse = new JsonObject();
    loginResponse.addProperty("userId",user.getId());
    return loginResponse.toString();
}
leobz commented 2 years ago

Related PR -> https://github.com/leobz/organize-matches/pull/60