with tutorial secure mkyong example and spring-mvc spring-security oauth-2.0 spring-social spring-security-oauth2

spring mvc - tutorial - Servidor Own OAuth2 de Spring junto con proveedores OAuth de terceros



spring security oauth2 example mkyong (1)

En la aplicación de arranque de primavera, tengo servidores de autorización / recursos de OAuth2. Basado en esto y en Spring Security, he asegurado los puntos finales de la API REST de Spring MVC.

Además de esto, me gustaría también agregar autenticación a mis puntos finales REST basados ​​en proveedores terceros de OAuth como Twitter, Facebook, Google.

En mi aplicación tengo dos entidades: User y User SocialUser . SocialUser representa el perfil del usuario en las redes sociales. User puede tener 0- * SocialUsers asociados. Ahora puedo autenticar al usuario en Twitter y luego crear dos registros en mi base de datos: usuario y usuario social. SocialUser contiene tokens de acceso / actualización emitidos por Twitter y otra información de perfil de esta red social.

En este momento, no sé cómo vincular este usuario creado a partir de una red social con mi flujo de autenticación / autorización existente. Para este usuario me gustaría crear mi propio (por mi propio servidor de autorización OAuth2) accessToken y proporcionarlo al cliente.

Además, este usuario no tiene nombre de usuario, contraseña y correo electrónico en su entidad de User . Y tampoco sé cómo crear manualmente mi propio Token de acceso y enviarlo al cliente para futuras llamadas a API.

Encontré un ejemplo:

@Inject private TokenEndpoint tokenEndpoint; public String createAccessToken(User user) { HashMap<String, String> parameters = new HashMap<String, String>(); parameters.put("client_id", "appid"); parameters.put("client_secret", "myOAuthSecret"); parameters.put("grant_type", "password"); parameters.put("password", user.getPassword()); parameters.put("scope", "read write"); parameters.put("username", user.getUsername()); // principal ?? return tokenEndpoint.getAccessToken(principal, parameters); }

pero no sé cómo crear el Principal basado en mi entidad User y también estoy seguro de que esta es una forma correcta de hacerlo.

Entonces, la pregunta principal es: ¿cómo generar manualmente este nuevo token a través de mi propio servidor OAuth para este nuevo usuario?

Por favor, avísenme cómo se puede implementar correctamente. Gracias.

ACTUALIZADO:

He agregado ProviderSignInController a mi aplicación y ahora puedo realizar un baile completo de OAuth con Twitter. Además, he implementado mi propio Neo4jConnectionRepository y Neo4jUsersConnectionRepository porque utilizo Neo4j como una base de datos primaria.

@Bean public ProviderSignInController providerSignInController() { return new ProviderSignInController(socialAuthenticationServiceLocator, usersConnectionRepository, new SignInAdapter() { @Override public String signIn(String userId, Connection<?> connection, NativeWebRequest request) { System.out.println("User ID: " + userId + " social display name: " + connection.getDisplayName()); return null; } }); }

Hasta ahora, todo funciona bien.

La única pregunta es: ¿cómo autenticar / autorizar al User través de mi propio servidor de autorización OAuth2 en el método SignInAdapter.signIn ?

Creo que necesito crear el objeto OAuth2Authentication para este usuario y ponerlo en contexto de seguridad. ¿Estoy en lo cierto? Si es así, ¿podrías mostrarme un ejemplo de cómo se puede implementar esto?


Entonces, lo que quiere lograr es que cuando los clientes redirigen a los usuarios a su servidor de autorización (código de autorización o subvención implícita) para obtener un token, el usuario pueda iniciar sesión usando su red social favorita.

Si lo entiendo correctamente, ha lanzado su propia implementación de inicio de sesión único (SSO) con Twitter ( ProviderSignInController ), y ahora se queda preguntándose cómo generar un token cuando Twitter responde "OK".

Creo que tomaste el problema por el lado equivocado: en lugar de construir tu cliente de Twitter y generar un token programáticamente, la idea es integrar SSO social dentro del flujo de spring-security-oauth2, que en realidad es cómo integrar SSO social en Seguridad de primavera.

Al final, se trata de cómo su servidor de autorizaciones asegura el AuthorizationEndpoint: /oauth/authorize . Dado que su servidor de autorización funciona, usted ya tiene una clase de configuración que extiende WebSecurityConfigurerAdapter que maneja la seguridad para /oauth/authorize con formLogin . Ahí es donde necesitas integrar cosas sociales.

En lugar de usar el mecanismo de autenticación de formularios integrado de Spring Security, tendrá que agregar su propia seguridad que le permita al usuario iniciar sesión con un formulario o inicie el SSO con otros proveedores.
Spring Security está hecho de un montón de abstracciones, pero realmente solo se trata de rellenar SecurityContext con un objeto Authentication para cada solicitud.

Una vez que se completa el proceso de autenticación, el usuario continuará /oauth/authorize , /oauth/authorize consentimiento para que el cliente acceda a algunos ámbitos, y el token se entregará como se hace generalmente, sin que tenga que generar tokens mediante programación.

Lo he hecho usando SAML (Spring Security SAML extension), pero en tu caso deberías cavar en los proyectos de Spring Social , que parecen ser compatibles con todas las redes sociales más importantes.
La buena noticia es que ya tiene muchas herramientas disponibles, la "mala noticia" es que tendrá que comprender cómo funcionan hasta cierto punto para conectarlas.