public static UsuarioExterno ObtenerUsuarioDeTokenGoogle(string idToken, IGenService genService) { // Validamos firma del token var validPayload = GoogleJsonWebSignature.ValidateAsync(idToken); if (validPayload == null) { throw new SecurityTokenValidationException("Firma de token no válida."); } UsuarioExterno usuario = null; JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler(); if (tokenHandler.CanReadToken(idToken)) { // Obtenemos datos de claims del payload JwtSecurityToken jwtToken = tokenHandler.ReadJwtToken(idToken); string idExterno = jwtToken.Claims.First(claim => claim.Type == "sub").Value; string nombre = jwtToken.Claims.First(claim => claim.Type == "given_name").Value; string apellido = jwtToken.Claims.First(claim => claim.Type == "family_name").Value; string direccionCorreo = jwtToken.Claims.First(claim => claim.Type == "email").Value; string emisorToken = jwtToken.Claims.First(claim => claim.Type == "iss").Value; string audiencia = jwtToken.Claims.First(claim => claim.Type == "aud").Value; // Validamos el emisor del token var respValorEmisor = genService.ValorParametro("GOOGLE_EMISOR_TOKEN"); if (!respValorEmisor.Codigo.Equals(RiskConstants.CODIGO_OK) || !emisorToken.Contains(respValorEmisor.Datos.Contenido, StringComparison.OrdinalIgnoreCase)) { throw new SecurityTokenValidationException("Emisor de token no válido."); } // Validamos el cliente del token var respValorCliente = genService.ValorParametro("GOOGLE_IDENTIFICADOR_CLIENTE"); if (!respValorCliente.Codigo.Equals(RiskConstants.CODIGO_OK) || respValorCliente.Datos.Contenido != audiencia) { throw new SecurityTokenValidationException("Cliente de token no válido."); } MailAddress addr = new MailAddress(direccionCorreo); string username = addr.User; string domain = addr.Host; usuario = new UsuarioExterno { Alias = username, Nombre = nombre, Apellido = apellido, DireccionCorreo = direccionCorreo, Origen = OrigenSesion.Google, IdExterno = idExterno }; } return(usuario); }
public IActionResult RefrescarSesionFacebook([FromBody] RefrescarSesionFacebookRequestBody requestBody) { // Obtener datos del JWT string aliasUsuario = TokenHelper.ObtenerUsuarioDeAccessToken(requestBody.AccessToken); UsuarioExterno usuario = TokenHelper.ObtenerUsuarioDeTokenFacebook(requestBody.FbToken, _genService); var accessTokenNuevo = TokenHelper.GenerarAccessToken(aliasUsuario, _autService, _genService); var respuesta = _autService.RefrescarSesion(requestBody.AccessToken, null, accessTokenNuevo, null, usuario.Origen, requestBody.FbToken); return(ProcesarRespuesta(respuesta)); }
public static UsuarioExterno ObtenerUsuarioDeTokenFacebook(string accessToken, IGenService genService) { UsuarioExterno usuario = null; try { // Validamos el token a través del Graph de facebook using (var client = new HttpClient()) { client.BaseAddress = new Uri("https://graph.facebook.com"); HttpResponseMessage response = client.GetAsync($"me?fields=id,name,email,first_name,last_name&access_token={accessToken}").Result; response.EnsureSuccessStatusCode(); string result = response.Content.ReadAsStringAsync().Result; var jsonRes = JsonConvert.DeserializeObject <dynamic>(result); // Obtenemos datos recibidos del usuario en la respuesta del Graph de facebook string idExterno = jsonRes["id"].ToString(); string nombre = jsonRes["first_name"].ToString(); string apellido = jsonRes["last_name"].ToString(); string direccionCorreo = jsonRes["email"].ToString(); MailAddress addr = new MailAddress(direccionCorreo); string username = addr.User; string domain = addr.Host; usuario = new UsuarioExterno { Alias = username, Nombre = nombre, Apellido = apellido, DireccionCorreo = direccionCorreo, Origen = OrigenSesion.Facebook, IdExterno = idExterno }; } } catch (Exception e) { throw new SecurityTokenValidationException("Token no válido.", e); } return(usuario); }
public IActionResult IniciarSesionFacebook([FromBody] IniciarSesionFacebookRequestBody requestBody) { // Obtener datos del JWT UsuarioExterno usuario = TokenHelper.ObtenerUsuarioDeTokenFacebook(requestBody.FbToken, _genService); // Registrar el usuario var respRegistrarUsuario = _autService.RegistrarUsuario(usuario.Alias, null, usuario.Nombre, usuario.Apellido, usuario.DireccionCorreo, null, null, usuario.Origen, usuario.IdExterno); if (!respRegistrarUsuario.Codigo.Equals(RiskConstants.CODIGO_OK) && !respRegistrarUsuario.Codigo.Equals(RiskConstants.CODIGO_ERROR_USUARIO_EXTERNO_EXISTENTE)) { return(ProcesarRespuesta(respRegistrarUsuario)); } var accessToken = TokenHelper.GenerarAccessToken(respRegistrarUsuario.Datos.Contenido, _autService, _genService); var respIniciarSesion = _autService.IniciarSesion(respRegistrarUsuario.Datos.Contenido, accessToken, null, requestBody.TokenDispositivo, usuario.Origen, requestBody.FbToken); if (respIniciarSesion.Codigo.Equals(RiskConstants.CODIGO_OK)) { NotificationHubHelper.RegistrarDispositivo(requestBody.TokenDispositivo, _autService, _notificationHubClientConnection); } return(ProcesarRespuesta(respIniciarSesion)); }