Estoy implementando una API y una aplicación web del lado del cliente, y se supone que deben comunicarse a través de una API y usar OAuth 2 para la autenticación.
No puedo superar mi confusión sobre cuál es la forma correcta de autenticar a los usuarios (es decir, sin grandes descuidos de seguridad).
Reuní lo siguiente:
- Idealmente, debería exponer un formulario web en el servidor API que toma el nombre de usuario y la contraseña y los redirige con un código de autorización, que se intercambiará del lado del cliente por un token de acceso al token de acceso.
- El enfoque que describí se considera engorroso, por lo que OAuth 2 ofrece un flujo implícito en el que la aplicación del lado del cliente realiza una solicitud que contiene un
client_id
y las credenciales del usuario, que recopila. Recibe un token de acceso. - Los kits de herramientas de autenticación parecen desconfiar de permitir que solo se pase
client_id
y, en cambio, requiere que se incluyaclient_secret
. - Según el punto anterior, como desarrollador puede que tenga que incrustar su
client_secret
en la aplicación distribuible, por lo tanto, hacerla pública. - Algunos colegas que comprenden OAuth 2 me dijeron que no es raro que los desarrolladores incluyan
client_secret
en sus distribuibles, y que algunos servicios de alto perfil (supuestamente Twitter) también lo hacen. - Si agrega un proxy entre el cliente y el servidor OAuth 2 para agregar el
client_secret
a las solicitudes, no mejora la seguridad ya que es similar a ignorar elclient_secret
por completo. - La única preocupación de seguridad que puedo encontrar relacionada con la incrustación de
client_id
yclient_secret
en el cliente es que un atacante puede implementar su propio cliente que, cuando se le dan credenciales de usuario, puede actuar en nombre del usuario. Esto no parece un ataque probable, ya que el phishing es similar y produce mayores beneficios.
Las siguientes preguntas aún no han sido respondidas para mí:
- ¿Cuál es la diferencia entre el flujo de credenciales del cliente y el flujo de contraseña del propietario del recurso ? ¿Cuál debería preferir? Las respuestas a esta pregunta do No me des una clara comprensión de la diferencia.
- ¿Hay algún problema de seguridad importante con el uso del flujo implícito o es viable?
- ¿Es seguro incrustar
client_secret
?- Si no, ¿cuál es la alternativa? ¿Debo seguir solicitando
client_id
o permitir el uso de clientes "públicos" (no registrados)?
- Si no, ¿cuál es la alternativa? ¿Debo seguir solicitando