예제 #1
0
        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);
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
        }
예제 #4
0
        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));
        }