Tengo una API que usa oAuth2 y mis propias aplicaciones móviles que usan esta API como back-end. Dado que los usuarios pueden iniciar sesión a través de múltiples dispositivos (es decir, iPhone, iPad, tableta Android o teléfono Android) al mismo tiempo, necesito la API para distinguir entre cada conexión. Me gustaría hacer esto a través de tokens de acceso separados: cada cliente obtiene un token de acceso separado.
El problema es que la implementación actual que utilizamos (spring-security-oauth2) genera una clave única basada en client_id, nombre de usuario y alcance. Básicamente, al obtener un token de acceso, todos los clientes obtienen el mismo token de acceso para el mismo usuario. Esto se hace usando DefaultAuthenticationKeyGenerator.
¿Es seguro ignorar el generador de claves de autenticación y simplemente crear un nuevo token de acceso en cada solicitud de un cliente?
AuthenticationKeyGenerator
interfaz. ¿Podría crear su propia implementación y usarla en su lugar?Respuestas:
Spring Cloud ya proporciona este comportamiento. Simplemente agregue diferentes clientes. Al igual que iosAppClient, androidAppClient en su clase AuthorizationServerConfiguration.
En el backend puede obtener el ID de cliente como el siguiente
e implementar diferentes comportamientos basados en el clientId.
fuente
Una respuesta es que cada plataforma de aplicación es un cliente diferente, por lo que debe tener una identificación de cliente diferente. Uno para la aplicación iOS, otro para el sitio web, etc.
En cuanto a diferenciar entre un iPad y un iPhone, sugiero no depender del sistema OAuth para esto.
fuente
Me encontré con el mismo problema al desarrollar mi backend con Spring Boot y OAuth2. El problema que encontré fue que, si varios dispositivos compartían los mismos tokens, una vez que un dispositivo actualizaba el token, el otro dispositivo no tendría ni idea y, para resumir, ambos dispositivos entraron en un frenesí de actualización de tokens. Mi solución fue reemplazar el valor predeterminado
AuthenticationKeyGenerator
con una implementación personalizada que anulaDefaultAuthenticationKeyGenerator
y agrega un nuevo parámetroclient_instance_id
en la mezcla del generador de claves. Mis clientes móviles enviarían este parámetro, que debe ser único en todas las instalaciones de aplicaciones (iOS o Android). Este no es un requisito especial, ya que la mayoría de las aplicaciones móviles ya rastrean la instancia de la aplicación de alguna forma.que luego inyectarías de manera similar:
La solicitud HTTP se vería así
El beneficio de usar este enfoque es que, si el cliente no envía un
client_instance_id
, se generará la clave predeterminada, y si se proporciona una instancia, se devuelve la misma clave cada vez para la misma instancia. Además, la clave es la plataforma independiente. La desventaja sería que el resumen MD5 (utilizado internamente) se llama dos veces.fuente