Closed leobz closed 2 years ago
Nota: Quedamos en utilizar una biblioteca de Autenticacion /Gestion de sesion y utilizarla. Queda investigar y decidir cual usar
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.
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.
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();
}
Related PR -> https://github.com/leobz/organize-matches/pull/60
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