Un inicio de sesión secundario en Facebook con Spring Social

1. Información general

En este tutorial, nos centraremos en agregar un nuevo inicio de sesión de Facebook a una aplicación de inicio de sesión de formulario existente.

Usaremos el soporte de Spring Social para interactuar con Facebook y mantener las cosas limpias y simples.

2. Configuración de Maven

Primero, necesitaremos agregar la dependencia spring-social-facebook a nuestro pom.xml :

 org.springframework.social spring-social-facebook 2.0.3.RELEASE 

3. Configuración de seguridad: solo formulario de inicio de sesión

Comencemos primero con la configuración de seguridad simple donde solo tenemos autenticación basada en formularios:

@Configuration @EnableWebSecurity @ComponentScan(basePackages = { "com.baeldung.security" }) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService); } @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/login*").permitAll() .anyRequest().authenticated() .and() .formLogin().loginPage("/login").permitAll(); } }

No vamos a dedicar mucho tiempo a esta configuración; si quieres entenderla mejor, echa un vistazo al artículo de inicio de sesión del formulario.

4. Las propiedades de Facebook

A continuación, configuremos las propiedades de Facebook en nuestra application.properties :

spring.social.facebook.appId=YOUR_APP_ID spring.social.facebook.appSecret=YOUR_APP_SECRET

Tenga en cuenta que:

  • Necesitamos crear una aplicación de Facebook para obtener appId y appSecret
  • Desde la configuración de la aplicación de Facebook, asegúrese de agregar la plataforma "Sitio web" y // localhost: 8080 / es la "URL del sitio"

5. Configuración de seguridad: agregar Facebook

Ahora, agreguemos una nueva forma de autenticarse en el sistema, impulsada por Facebook:

public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private FacebookConnectionSignup facebookConnectionSignup; @Value("${spring.social.facebook.appSecret}") String appSecret; @Value("${spring.social.facebook.appId}") String appId; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login*","/signin/**","/signup/**").permitAll() ... } @Bean public ProviderSignInController providerSignInController() { ConnectionFactoryLocator connectionFactoryLocator = connectionFactoryLocator(); UsersConnectionRepository usersConnectionRepository = getUsersConnectionRepository(connectionFactoryLocator); ((InMemoryUsersConnectionRepository) usersConnectionRepository) .setConnectionSignUp(facebookConnectionSignup); return new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, new FacebookSignInAdapter()); } private ConnectionFactoryLocator connectionFactoryLocator() { ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry(); registry.addConnectionFactory(new FacebookConnectionFactory(appId, appSecret)); return registry; } private UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) { return new InMemoryUsersConnectionRepository(connectionFactoryLocator); } }

Miremos cuidadosamente la nueva configuración:

  • estamos usando un ProviderSignInController para habilitar la autenticación de Facebook, que necesita dos cosas:

    primero, un ConnectionFactoryLocator registrado como FacebookConnectionFactory con las propiedades de Facebook que definimos anteriormente.

    en segundo lugar, un InMemoryUsersConnectionRepository .

  • enviando un POST a " / signin / facebook ": este controlador iniciará un inicio de sesión de usuario utilizando el proveedor de servicios de Facebook
  • estamos configurando un SignInAdapter para manejar la lógica de inicio de sesión en nuestra aplicación
  • y también configuramos un ConnectionSignUp para manejar el registro de usuarios implícitamente cuando se autentican por primera vez con Facebook

6. El adaptador de inicio de sesión

En pocas palabras, este adaptador es un puente entre el controlador anterior, que impulsa el flujo de inicio de sesión de los usuarios de Facebook, y nuestra aplicación local específica:

public class FacebookSignInAdapter implements SignInAdapter { @Override public String signIn( String localUserId, Connection connection, NativeWebRequest request) { SecurityContextHolder.getContext().setAuthentication( new UsernamePasswordAuthenticationToken( connection.getDisplayName(), null, Arrays.asList(new SimpleGrantedAuthority("FACEBOOK_USER")))); return null; } }

Tenga en cuenta que los usuarios que hayan iniciado sesión con Facebook tendrán el rol FACEBOOK_USER , mientras que los usuarios que hayan iniciado sesión usando el formulario tendrán el rol USER.

7. Registro de conexión

Cuando un usuario se autentica con Facebook por primera vez, no tiene una cuenta existente en nuestra aplicación.

Este es el punto en el que debemos crear esa cuenta automáticamente para ellos; vamos a utilizar un ConnectionSignUp para impulsar esa lógica de creación de usuarios:

@Service public class FacebookConnectionSignup implements ConnectionSignUp { @Autowired private UserRepository userRepository; @Override public String execute(Connection connection) { User user = new User(); user.setUsername(connection.getDisplayName()); user.setPassword(randomAlphabetic(8)); userRepository.save(user); return user.getUsername(); } }

Como puede ver, creamos una cuenta para el nuevo usuario, usando su DisplayName como nombre de usuario.

8. La interfaz

Finalmente, echemos un vistazo a nuestra interfaz.

Ahora vamos a tener soporte para estos dos flujos de autenticación (inicio de sesión de formulario y Facebook) en nuestra página de inicio de sesión:

 You have been logged out There was an error, please try again 

Finalmente, aquí está el index.html :

Username

Logout

User authorities

Observe cómo esta página de índice muestra los nombres de usuario y las autoridades.

Y eso es todo: ahora tenemos dos formas de autenticarnos en la aplicación.

9. Conclusión

In this quick article, we learned how to use spring-social-facebook to implement a secondary authentication flow for our application.

And of course, as always, the source code is fully available over on GitHub.