Independientemente de OAuth2 PKCE o cualquier otro flujo, la pregunta se reduce a "¿puede el servidor verificar la integridad de la aplicación?". La respuesta a esta pregunta es simplemente NO.
La aplicación reside en el dominio del usuario, lo que significa que un atacante tiene control total sobre la aplicación. El atacante puede instalarlo en su dispositivo, parchearlo, cambiar dinámicamente su comportamiento (enganche) o cambiar los valores en la memoria, etc ...
Lo único que puedes hacer es dificultar que un atacante se meta con tu aplicación. Algunas contramedidas son:
- Detección de raíz / jailbreak.
- Ofuscación de código: incluye el método de ofuscación / nombres de variables, ofuscación de flujo de control, etc ...
- Algo llamado Autoprotección de la aplicación en tiempo de ejecución (RASP): generalmente incluye detección de gancho y amp; detección de depuración.
- Cifrado: por ejemplo, en Android es posible cargar dinámicamente un archivo DEX, algunas aplicaciones cargan un archivo DEX cifrado en la memoria y lo descifran.
- Impresión digital del dispositivo: verifique, por ejemplo, si el dispositivo se ejecuta dentro del emulador.
Las medidas contrarias anteriores se pueden implementar de diferentes maneras. Hay productos por ahí que pueden hacer esto por ti. Al final, es posible evitar todas estas medidas, pero requiere un poco de esfuerzo. La pregunta generalmente se reduce a un modelo de amenaza: ¿Qué estás tratando de proteger? ¿Cuánto quieres gastar en tales soluciones? ¿Qué puede lograr un atacante si estas soluciones se omiten? ¿Qué tan fácil / difícil es?
Tampoco te olvides del endurecimiento de la comunicación. Puede implementar todas las medidas anteriores, pero un atacante, por ejemplo, también puede usar un proxy mitm como Burp para interceptar y cambiar datos en tránsito. Por lo tanto, el uso de TLS en todas partes puede ser un hecho, pero no se olvide de las medidas de endurecimiento, como la fijación de TLS. Para ser honesto, esto es fácil de evitar si me preguntas. He visto a algunas personas ser creativas y hacer cosas como: cifrar y firmar las cargas útiles enviadas al servidor, usar protocolos binarios en lugar de HTTP y mucho más.
Recuerde, al final del día, un atacante motivado puede superar todos estos obstáculos.