Spring Boot

SpringBoot

Tutorial SpringBoot: Autenticación OAuth con GitHub

Aprende a implementar autenticación OAuth con GitHub en Spring Boot. Configura OAuth App, seguridad y login personalizado fácilmente.

Aprende SpringBoot y certifícate

Crear una GitHub OAuth App

Para implementar autenticación OAuth con GitHub en nuestra aplicación Spring Boot, el primer paso es registrar nuestra aplicación en GitHub como una OAuth App. Este proceso nos proporcionará las credenciales necesarias que GitHub utilizará para identificar y autorizar nuestra aplicación.

Acceso al panel de configuración

Inicia sesión en tu cuenta de GitHub y navega hasta la configuración de desarrollador. Puedes acceder directamente desde tu perfil haciendo clic en Settings > Developer settings > OAuth Apps, o visitando directamente la URL https://github.com/settings/developers.

Una vez en la sección de OAuth Apps, encontrarás un botón "New OAuth App" que te permitirá crear una nueva aplicación.

Configuración de la OAuth App

Al crear una nueva OAuth App, GitHub te solicitará varios campos obligatorios que definen cómo interactuará tu aplicación con el servicio de autenticación:

Application name: Introduce un nombre descriptivo para tu aplicación, como "Mi App Spring Boot" o "Sistema de Gestión OAuth". Este nombre será visible para los usuarios durante el proceso de autorización.

Homepage URL: Especifica la URL principal de tu aplicación. Para desarrollo local, utiliza http://localhost:8080. En producción, será la URL real de tu aplicación desplegada.

Application description: Aunque es opcional, es recomendable incluir una breve descripción de tu aplicación para que los usuarios entiendan qué servicio están autorizando.

Authorization callback URL: Este es el campo más crítico de la configuración. Aquí debes especificar la URL a la que GitHub redirigirá al usuario después de completar la autenticación. Para Spring Boot con OAuth2, la URL sigue un patrón específico:

http://localhost:8080/login/oauth2/code/github

Esta URL está compuesta por:

  • http://localhost:8080: La base de tu aplicación
  • /login/oauth2/code/: El endpoint estándar de Spring Security OAuth2
  • github: El identificador del proveedor OAuth que configuraremos en Spring Boot

Obtención de credenciales

Una vez completado el formulario y creada la aplicación, GitHub te proporcionará dos elementos fundamentales:

Client ID: Un identificador público único para tu aplicación. Este valor no es secreto y puede ser visible en el código del cliente.

Client Secret: Una clave privada que debe mantenerse segura y nunca exponerse públicamente. GitHub te mostrará este valor solo una vez, así que asegúrate de copiarlo y guardarlo de forma segura.

Estas credenciales son las que utilizarás en la configuración de Spring Boot para establecer la comunicación segura entre tu aplicación y GitHub.

Consideraciones de seguridad

Es importante tratar el Client Secret como información sensible. Nunca lo incluyas directamente en tu código fuente ni lo subas a repositorios públicos. En su lugar, utiliza variables de entorno o archivos de configuración externos que no se incluyan en el control de versiones.

Para desarrollo local, puedes crear un archivo application-local.properties que contenga estas credenciales y añadirlo a tu .gitignore. En entornos de producción, utiliza las herramientas de gestión de secretos de tu plataforma de despliegue.

Configuración para diferentes entornos

Durante el desarrollo, es común trabajar con múltiples entornos. Puedes crear diferentes OAuth Apps para cada entorno (desarrollo, testing, producción) o configurar múltiples callback URLs en la misma aplicación separándolas por comas:

http://localhost:8080/login/oauth2/code/github,
https://miapp.com/login/oauth2/code/github

Esta flexibilidad te permite mantener la misma configuración de GitHub mientras trabajas en diferentes etapas del desarrollo de tu aplicación.

Configuración oauth2-client en Spring Boot

Una vez que tenemos nuestra GitHub OAuth App configurada, el siguiente paso es integrar las credenciales en nuestra aplicación Spring Boot y configurar el cliente OAuth2. Spring Boot 3 incluye soporte nativo para OAuth2 a través de Spring Security, lo que simplifica considerablemente la implementación.

Dependencias necesarias

Para habilitar la funcionalidad OAuth2 en Spring Boot, necesitamos añadir la dependencia correspondiente en nuestro archivo pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

Esta dependencia incluye automáticamente Spring Security y todas las librerías necesarias para manejar el flujo OAuth2. No necesitas añadir dependencias adicionales de Spring Security ya que están incluidas.

Configuración básica en application.properties

La configuración OAuth2 en Spring Boot se realiza principalmente a través del archivo application.properties. Aquí definimos los parámetros de conexión con GitHub utilizando las credenciales obtenidas anteriormente:

# Configuración OAuth2 para GitHub
spring.security.oauth2.client.registration.github.client-id=tu_client_id_aqui
spring.security.oauth2.client.registration.github.client-secret=tu_client_secret_aqui
spring.security.oauth2.client.registration.github.scope=read:user,user:email

El parámetro scope define qué información del usuario solicitaremos a GitHub. Los scopes más comunes son:

  • read:user: Acceso básico al perfil del usuario
  • user:email: Acceso a las direcciones de email del usuario

Configuración de seguridad

Para que OAuth2 funcione correctamente con nuestros controladores MVC, necesitamos crear una clase de configuración de seguridad. Esta clase define qué rutas requieren autenticación y cómo manejar el proceso de login:

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authz -> authz
                .requestMatchers("/", "/login", "/error").permitAll()
                .anyRequest().authenticated()
            )
            .oauth2Login(oauth2 -> oauth2
                .loginPage("/login")
                .defaultSuccessUrl("/dashboard", true)
            );
        
        return http.build();
    }
}

Esta configuración establece que:

  • Las rutas /, /login y /error son públicas
  • Cualquier otra ruta requiere autenticación
  • El login se maneja a través de OAuth2 con una página personalizada
  • Después del login exitoso, el usuario es redirigido a /dashboard

Controlador de login personalizado

Para proporcionar una experiencia de usuario coherente con nuestro diseño Bootstrap, creamos un controlador que maneje la página de login:

@Controller
public class AuthController {

    @GetMapping("/login")
    public String login() {
        return "login";
    }
    
    @GetMapping("/dashboard")
    public String dashboard(Authentication authentication, Model model) {
        OAuth2AuthenticationToken oauth2Token = (OAuth2AuthenticationToken) authentication;
        String username = oauth2Token.getPrincipal().getAttribute("login");
        String email = oauth2Token.getPrincipal().getAttribute("email");
        
        model.addAttribute("username", username);
        model.addAttribute("email", email);
        
        return "dashboard";
    }
}

El método dashboard muestra cómo extraer información del usuario autenticado. GitHub proporciona los datos del usuario a través del objeto OAuth2AuthenticationToken.

Plantilla Thymeleaf para login

Creamos una plantilla login.html en src/main/resources/templates/ que integre con Bootstrap 5.3:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Iniciar Sesión</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light">
    <div class="container mt-5">
        <div class="row justify-content-center">
            <div class="col-md-6">
                <div class="card">
                    <div class="card-body text-center">
                        <h2 class="card-title mb-4">Iniciar Sesión</h2>
                        <p class="text-muted mb-4">Accede con tu cuenta de GitHub</p>
                        <a href="/oauth2/authorization/github" class="btn btn-dark btn-lg">
                            <i class="fab fa-github me-2"></i>
                            Continuar con GitHub
                        </a>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

El enlace /oauth2/authorization/github es la URL estándar que Spring Security OAuth2 utiliza para iniciar el flujo de autenticación con GitHub.

Gestión de variables de entorno

Para mantener las credenciales seguras, es recomendable utilizar variables de entorno en lugar de valores hardcodeados. Modifica tu application.properties:

spring.security.oauth2.client.registration.github.client-id=${GITHUB_CLIENT_ID}
spring.security.oauth2.client.registration.github.client-secret=${GITHUB_CLIENT_SECRET}
spring.security.oauth2.client.registration.github.scope=read:user,user:email

En tu entorno de desarrollo, puedes definir estas variables en tu IDE o crear un archivo application-local.properties:

GITHUB_CLIENT_ID=tu_client_id_real
GITHUB_CLIENT_SECRET=tu_client_secret_real

Prueba de la configuración

Una vez completada la configuración, inicia tu aplicación Spring Boot y navega a http://localhost:8080/dashboard. Como esta ruta requiere autenticación, serás redirigido automáticamente a la página de login.

Al hacer clic en "Continuar con GitHub", el navegador te llevará a GitHub donde podrás autorizar tu aplicación. Después de la autorización exitosa, GitHub te redirigirá de vuelta a tu aplicación con el usuario autenticado.

El flujo completo funciona de la siguiente manera: usuario accede a ruta protegida → redirección a /login → clic en botón GitHub → autorización en GitHub → callback a tu aplicación → acceso concedido a la ruta original.

Aprende SpringBoot online

Otras lecciones de SpringBoot

Accede a todas las lecciones de SpringBoot y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Spring Boot

Spring Boot

Introducción Y Entorno

Spring Boot Starters

Spring Boot

Introducción Y Entorno

Inyección De Dependencias

Spring Boot

Introducción Y Entorno

Crear Proyecto Con Spring Initializr

Spring Boot

Introducción Y Entorno

Crear Proyecto Desde Visual Studio Code

Spring Boot

Introducción Y Entorno

Controladores Spring Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Vista En Spring Mvc Con Thymeleaf

Spring Boot

Spring Mvc Con Thymeleaf

Controladores Spring Rest

Spring Boot

Spring Mvc Con Thymeleaf

Open Api Y Cómo Agregarlo En Spring Boot

Spring Boot

Spring Mvc Con Thymeleaf

Servicios En Spring

Spring Boot

Spring Mvc Con Thymeleaf

Clientes Resttemplate Y Restclient

Spring Boot

Spring Mvc Con Thymeleaf

Rxjava En Spring Web

Spring Boot

Spring Mvc Con Thymeleaf

Métodos Post En Controladores Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Métodos Get En Controladores Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Formularios En Spring Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Crear Proyecto Con Intellij Idea

Spring Boot

Spring Mvc Con Thymeleaf

Introducción A Los Modelos Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Layouts Y Fragmentos En Thymeleaf

Spring Boot

Spring Mvc Con Thymeleaf

Estilización Con Bootstrap Css

Spring Boot

Spring Mvc Con Thymeleaf

Gestión De Errores Controlleradvice

Spring Boot

Spring Mvc Con Thymeleaf

Estilización Con Tailwind Css

Spring Boot

Spring Mvc Con Thymeleaf

Introducción A Controladores Rest

Spring Boot

Spring Rest

Métodos Get En Controladores Rest

Spring Boot

Spring Rest

Métodos Post En Controladores Rest

Spring Boot

Spring Rest

Métodos Delete En Controladores Rest

Spring Boot

Spring Rest

Métodos Put Y Patch En Controladores Rest

Spring Boot

Spring Rest

Gestión De Errores Restcontrolleradvice

Spring Boot

Spring Rest

Creación De Entidades Jpa

Spring Boot

Spring Data Jpa

Asociaciones De Entidades Jpa

Spring Boot

Spring Data Jpa

Repositorios Spring Data

Spring Boot

Spring Data Jpa

Métodos Find En Repositorios

Spring Boot

Spring Data Jpa

Inserción De Datos

Spring Boot

Spring Data Jpa

Actualizar Datos De Base De Datos

Spring Boot

Spring Data Jpa

Borrar Datos De Base De Datos

Spring Boot

Spring Data Jpa

Consultas Jpql Con @Query En Spring Data Jpa

Spring Boot

Spring Data Jpa

Api Query By Example (Qbe)

Spring Boot

Spring Data Jpa

Api Specification

Spring Boot

Spring Data Jpa

Repositorios Reactivos

Spring Boot

Spring Data Jpa

Configuración Base De Datos Postgresql

Spring Boot

Spring Data Jpa

Configuración Base De Datos Mysql

Spring Boot

Spring Data Jpa

Introducción A Jpa Y Spring Data Jpa

Spring Boot

Spring Data Jpa

Configuración Base De Datos H2

Spring Boot

Spring Data Jpa

Testing Unitario De Componentes Y Servicios

Spring Boot

Testing Con Spring Test

Testing De Repositorios Spring Data Jpa

Spring Boot

Testing Con Spring Test

Testing Controladores Spring Mvc Con Thymeleaf

Spring Boot

Testing Con Spring Test

Testing Controladores Rest Con Json

Spring Boot

Testing Con Spring Test

Testing De Aplicaciones Reactivas Webflux

Spring Boot

Testing Con Spring Test

Testing De Seguridad Spring Security

Spring Boot

Testing Con Spring Test

Testing Con Apache Kafka

Spring Boot

Testing Con Spring Test

Introducción Al Testing

Spring Boot

Testing Con Spring Test

Introducción A Spring Security

Spring Boot

Seguridad Con Spring Security

Seguridad Basada En Formulario

Spring Boot

Seguridad Con Spring Security

Registro De Usuarios En Api Rest

Spring Boot

Seguridad Con Spring Security

Login De Usuarios En Api Rest

Spring Boot

Seguridad Con Spring Security

Validación Jwt En Api Rest

Spring Boot

Seguridad Con Spring Security

Autenticación Jwt Completa En Api Rest

Spring Boot

Seguridad Con Spring Security

Seguridad Jwt En Api Rest Reactiva Spring Webflux

Spring Boot

Seguridad Con Spring Security

Autenticación Y Autorización Con Anotaciones

Spring Boot

Seguridad Con Spring Security

Fundamentos De Autenticación Oauth

Spring Boot

Seguridad Con Spring Security

Autenticación Oauth Con Github

Spring Boot

Seguridad Con Spring Security

Testing Con Spring Security Test

Spring Boot

Seguridad Con Spring Security

Autenticación Oauth En Api Rest

Spring Boot

Seguridad Con Spring Security

Introducción A Spring Webflux

Spring Boot

Reactividad Webflux

Spring Data R2dbc

Spring Boot

Reactividad Webflux

Controlador Reactivo Basado En Anotaciones

Spring Boot

Reactividad Webflux

Controlador Reactivo Basado En Funciones

Spring Boot

Reactividad Webflux

Operadores Reactivos Básicos

Spring Boot

Reactividad Webflux

Operadores Reactivos Avanzados

Spring Boot

Reactividad Webflux

Cliente Reactivo Webclient

Spring Boot

Reactividad Webflux

Introducción E Instalación De Apache Kafka

Spring Boot

Mensajería Asíncrona

Crear Proyecto Con Apache Kafka

Spring Boot

Mensajería Asíncrona

Creación De Producers

Spring Boot

Mensajería Asíncrona

Creación De Consumers

Spring Boot

Mensajería Asíncrona

Kafka Streams En Spring Boot

Spring Boot

Mensajería Asíncrona

Integración Con Angular

Spring Boot

Integración Frontend

Integración Con React

Spring Boot

Integración Frontend

Integración Con Vue

Spring Boot

Integración Frontend

Accede GRATIS a SpringBoot y certifícate

Ejercicios de programación de SpringBoot

Evalúa tus conocimientos de esta lección Autenticación OAuth con GitHub con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender cómo registrar y configurar una OAuth App en GitHub para obtener las credenciales necesarias.
  • Aprender a integrar las credenciales de GitHub en una aplicación Spring Boot mediante la configuración de OAuth2.
  • Configurar la seguridad en Spring Boot para proteger rutas y manejar el flujo de autenticación OAuth2.
  • Implementar un controlador y una plantilla de login personalizados para mejorar la experiencia de usuario.
  • Gestionar de forma segura las credenciales utilizando variables de entorno y configuraciones externas.