Skip to content

Feature/oauth2 google login - #47

Merged
Valeeeu merged 21 commits into
devfrom
feature/oauth2-google-login
Mar 13, 2026
Merged

Feature/oauth2 google login#47
Valeeeu merged 21 commits into
devfrom
feature/oauth2-google-login

Conversation

@michelzzw

@michelzzw michelzzw commented Feb 12, 2026

Copy link
Copy Markdown

Équipe 3 – Phase 2: Google OAuth2 Authentication + Code Quality

Summary

This PR delivers the second part of the Phase 2 milestone for Équipe 3 — Google OAuth2 Login, Code Cleanup & Documentation. The objective was to add a second authentication method (Google OAuth2) alongside the existing JWT system, integrate it into the Angular frontend, clean up code quality issues across the entire Team 2 codebase, and update the README.

When we started this work, the application only supported username/password authentication via JWT (delivered in the first Phase 2 PR). There was no social login capability, and the codebase contained numerous unused imports, dead code, logic bugs, and an outdated README referencing deleted configuration files.

After our changes, users can log in with either their local credentials (JWT) or their Google account (OAuth2). The Angular frontend has a "Se connecter avec Google" button on the login page. After a successful Google login, the user is automatically registered in MongoDB (or linked to an existing account) and receives a JWT token — the same token format used by the local login, ensuring a unified authentication experience. Additionally, 20+ code quality issues have been fixed across 6 modules, and the README has been completely rewritten.

Problems Found & Changes Made

1. No social login — only username/password authentication

Problem: The application only supported local registration and login. Users had to create a new account with a unique username, email, and password. There was no way to use an existing identity provider (e.g., Google) to sign in, which is inconvenient for users who prefer single sign-on.

Changes (Backend — OAuth2 Integration):

  • Added spring-boot-starter-oauth2-client dependency to both backend/pom.xml and backend/pom.docker.xml
  • Configured Google OAuth2 provider in application.yml:
    • Client registration with ${GOOGLE_CLIENT_ID} and ${GOOGLE_CLIENT_SECRET} (defaults to placeholder if not set)
    • OpenID Connect scope: openid, profile, email
    • Explicit Google provider URIs (authorization, token, userinfo)
    • oauth2FrontendRedirectUrl property to control where the frontend callback lives
  • Created OAuth2LoginSuccessHandler.java (security/oauth2/):
    • Implements SimpleUrlAuthenticationSuccessHandler
    • On successful Google login: extracts sub (Google ID), email, and name from the OAuth2 principal
    • User resolution strategy: find by googleId → find by email (link existing account) → create new user
    • When creating a new user, generates a username from the email prefix (with collision detection) and assigns a random UUID password (unusable for local login)
    • Generates a JWT token via JwtUtils.generateJwtTokenForUsername()
    • Encodes user info (token, id, fullName, username, email, roles) as base64url JSON
    • Redirects to {frontendRedirectUrl}/oauth2/callback?token={jwt}&userInfo={base64}
    • Uses @Autowired ObjectMapper (Spring DI, not new ObjectMapper()) per project conventions
  • Created OAuth2Controller.java (controller/):
    • GET /api/oauth2/login-url — returns the OAuth2 authorization URL (/oauth2/authorization/google) for frontend reference
    • Annotated with Swagger @Tag and @Operation for API documentation
  • Modified WebSecurityConfig.java:
    • Added .oauth2Login(oauth2 -> oauth2.successHandler(oAuth2LoginSuccessHandler))
    • Changed SessionCreationPolicy.STATELESSSessionCreationPolicy.IF_REQUIRED — OAuth2 requires a temporary HTTP session during the authorization code exchange; JWT authentication remains stateless via AuthTokenFilter
    • Added permitAll for /oauth2/** and /login/oauth2/** (Spring Security's OAuth2 endpoints)
    • Added permitAll for /api/oauth2/login-url
  • Modified User.java entity:
    • Added provider field ("local" or "google")
    • Added googleId field for Google account linking
    • New constructor User(fullName, username, email, provider, googleId) for OAuth2 users with UUID.randomUUID() password
    • Removed @NotBlank from password field (OAuth2 users don't have a user-chosen password)
    • Increased username max size from 20 → 50 (Google email prefixes can be long)
  • Modified UserRepository.java: Added findByEmail() and findByGoogleId() query methods
  • Modified JwtUtils.java: Added generateJwtTokenForUsername(String username) — generates a JWT directly from a username string, bypassing Authentication object (needed for OAuth2 where there's no password-based Authentication)
  • Updated OpenApiConfig.java: Updated API description to mention both JWT and OAuth2 authentication methods

2. No frontend support for Google login

Problem: Even with a working OAuth2 backend, there was no way for users to trigger the Google login flow from the Angular frontend.

Changes (Frontend — Angular):

  • Created OAuth2CallbackComponent (oauth2-callback/):
    • oauth2-callback.component.ts: Subscribes to route query parameters, extracts token and userInfo, decodes base64url JSON, saves to TokenStorageService, and redirects to /home. Includes TypeScript type annotations (params: { [key: string]: string }, token: string | undefined, userInfo: Record<string, unknown>)
    • oauth2-callback.component.html: Shows a loading spinner during processing and a clear error message in French if authentication fails
    • oauth2-callback.component.css: Centered layout with Google-branded color scheme
  • Modified login.component.ts: Added loginWithGoogle() method that redirects the browser to environment.oauth2BackendUrl + '/oauth2/authorization/google'
  • Modified login.component.html: Added a styled "Se connecter avec Google" button with SVG Google icon and visual separator ("— OU —") between local and Google login forms
  • Modified login.component.css: Added styles for the Google button (white background, Google brand border, hover effects) and the separator
  • Modified app-routing.module.ts: Added route { path: 'oauth2/callback', component: OAuth2CallbackComponent }
  • Modified app.module.ts: Declared OAuth2CallbackComponent
  • Modified environment.ts: Added oauth2BackendUrl: 'http://localhost:8084'
  • Modified environment.prod.ts: Added oauth2BackendUrl: 'http://localhost:8084' (Docker-mapped port)

3. Docker not configured for OAuth2 credentials

Problem: The Docker Compose configuration had no way to pass Google OAuth2 credentials to the backend container.

Changes (docker-compose-local-test.yml):

  • Added three environment variables to backend-team2 service:
    • GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID:-placeholder}
    • GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET:-placeholder}
    • OAUTH2_FRONTEND_REDIRECT_URL: http://frontend-team2:4200
  • These use PowerShell environment variable injection: users set $env:GOOGLE_CLIENT_ID and $env:GOOGLE_CLIENT_SECRET in the same shell session before running docker compose up

4. Unused imports and dead code across 6 modules

Problem: Multiple modules contained unused imports, unreferenced fields, and dead methods — leftover from previous development phases. This increases compilation warnings, reduces readability, and violates project conventions.

Changes (Code Cleanup):

File Removed
gateway/GatewayApplication.java Unused Map import
auth/services/CustomUserDetailsService.java Unused ArrayList import
auth/services/JwtService.java Unused User, ResponseEntity, UserDetails imports
auth/AuthGatewayApplication.java Unused ServiceInstance, List imports
selenium/requests/UseSelenium.java Unused TimeUnit, Arrays imports; fixed deprecated implicitlyWait(long, TimeUnit)implicitlyWait(Duration.ofSeconds(1)); fixed deprecated getAttribute()getDomAttribute()
selenium/SeleniumApplicationTests.java Unused Test import
user/payload/request/PasswordRequest.java Unused Set import
user/jwt/JwtUtil.java Removed dead createToken() and refreshToken() methods, unused TokenClaims import
user/controller/UserController.java Removed unused AuthenticationManager and JwtService field injections
user/services/JwtService.java Removed unused User, ResponseEntity, etc. imports

5. Logic bugs in UserService

Problem: UserService.update() contained a boolean inversion bug: if (user.getFullName().isEmpty()) should have been if (!user.getFullName().isEmpty()). The method was updating fields only when they were empty, and skipping updates when values were provided — the exact opposite of intended behavior. Additionally, findById() returned null without checking Optional.isPresent().

Changes (user/services/UserService.java):

  • Fixed isEmpty()!isEmpty() for fullName, email, and username checks in update() method
  • Added isPresent() null check in findById() to avoid NoSuchElementException

6. Missing @NonNull annotations causing compiler warnings

Problem: Several Spring component methods had parameters that could theoretically be null, generating -Xlint:nullaway or IDE warnings.

Changes:

  • selenium/config/DevCorsConfiguration.java: Added @NonNull to addCorsMappings(CorsRegistry) parameter
  • user/jwt/JwtAuthenticationFilter.java: Added @NonNull to doFilterInternal() parameters
  • user/repository/UserRepository.java: Added @NonNull to findById() parameter

7. Frontend JWT authentication broken — wrong header and field name

Problem: The Angular frontend could not execute authenticated API requests. Two separate bugs were preventing the JWT token from being sent correctly:

  1. Wrong HTTP header name: auth.interceptor.ts was using x-access-token (Node.js Express convention) instead of Authorization (Spring Boot convention). The backend's AuthTokenFilter only reads the Authorization header.
  2. Wrong response field name: login.component.ts was reading data.accessToken from the login response, but the auth microservice (separate container) returns the JWT in a field named token (Lombok @Getter on private String token). This caused sessionStorage to store "undefined", and the backend reported: "Invalid JWT token: JWT strings must contain exactly 2 period characters. Found: 0".

Changes (Frontend):

  • auth.interceptor.ts: Changed TOKEN_HEADER_KEY from 'x-access-token' to 'Authorization'
  • login.component.ts: Changed data.accessToken to data.token || data.accessToken for compatibility with both the standalone auth microservice and the backend's own JwtResponse

8. TestAPI microservice build failure and false test results

Problem: The TestAPI microservice had three issues:

  1. javax.validation incompatible with Spring Boot 3.x: TestApiController.java and TestApiRequest.java used javax.validation imports, but Spring Boot 3.x requires jakarta.validation. This caused a Docker build failure.
  2. checkOutput() NullNode bug: When expectedOutput is JSON null, Jackson deserializes it as NullNode (not Java null). The original code only checked expectedOutput == null, so NullNode fell through to NullNode.equals(actualResponse) → always false.
  3. checkResponseTime() always fails when not set: When no response time was specified (responseTime = 0), response.getTime() < 0 was always false, causing unnecessary test failures.

Changes (TestAPI):

  • TestApiController.java / TestApiRequest.java: Migrated javax.validationjakarta.validation
  • RequestController.java: Added expectedOutput.isNull() check in checkOutput(); added responseTime <= 0 guard in checkResponseTime()
  • Dockerfile: Added -DskipTests -B flags to mvn clean install to speed up Docker builds
  • pom.xml: Added spring-boot-starter-validation dependency (committed in earlier phase)

9. Outdated README referencing deleted files

Problem: testapi-Service/README.md was significantly outdated:

  • Referenced .docker_config.env which was deleted in Phase 1
  • No mention of JWT authentication or Google OAuth2
  • Incorrect ports and startup commands
  • No environment variable documentation

Changes (testapi-Service/README.md):

  • Complete rewrite with the following sections:
    • Project introduction and table of contents with anchor links
    • Architecture table (backend, testapi, selenium, frontend with ports)
    • API test workflow diagram (Frontend → Backend → TestAPI → External API)
    • Docker startup instructions using docker-compose-local-test.yml
    • Complete API testing documentation: frontend UI usage (6 steps), request JSON format (6 fields), 3 active assertions (status code, JSON body via JsonComparator, response headers), response JSON format (5 fields), error handling, full curl example
    • Brief mention of Gatling/Selenium modules with reference to responsible teams (Projet feat: add export-import module #4 and changes to deploy.sh files and new directory "lionel" that we can use… #2)
    • Compressed authentication section (JWT + OAuth2 summary)
    • Swagger UI usage guide
    • Full environment variable reference table (14 variables)
    • Technology stack table with role descriptions, Rest-Assured highlighted

Testing & Validation

All changes have been validated in a local Docker environment:

Google OAuth2 Flow

Step Action Expected Result Actual Result
1 Click "Se connecter avec Google" on login page Browser redirects to Google consent screen ✅ Pass
2 Select a Google account Google redirects to localhost:8084/login/oauth2/code/google ✅ Pass
3 Backend processes OAuth2 callback User created in MongoDB with provider:"google", JWT generated ✅ Pass
4 Frontend callback page receives token Token and userInfo extracted from URL, saved in sessionStorage ✅ Pass
5 User redirected to /home Home page loads, navbar shows user's Google display name ✅ Pass
6 Second login with same Google account Existing user found by googleId, no duplicate created ✅ Pass

JWT Authentication (Regression Test)

Step Action Expected Result Actual Result
1 POST /api/auth/signup 200 OK, "Inscription Réussie.!" ✅ Pass
2 POST /api/auth/signin 200 OK, JWT accessToken returned ✅ Pass
3 Access protected endpoint without token 401 Unauthorized ✅ Pass
4 Access protected endpoint with Bearer token 200 OK ✅ Pass

OAuth2 User Account Linking

Scenario Expected Actual
New Google user (no existing account) New user created with provider:"google" ✅ Pass
Google email matches existing local user Local user linked — googleId and provider fields updated ✅ Pass
Duplicate username collision Username suffixed with _g{googleId[0:6]} ✅ Pass

System Health

Service Status Port
mongodb healthy 27017
registry healthy 8761
gateway running 8080
auth healthy 8081
backend-team2 healthy 8084
testapi-team2 healthy 8086
selenium-team2 healthy 4445
frontend-team2 running 4300

Files Modified (Phase 2 — OAuth2)

New Files (OAuth2 Core)

File Description
backend/src/.../security/oauth2/OAuth2LoginSuccessHandler.java Google OAuth2 success handler — user resolution, JWT generation, frontend redirect
backend/src/.../controller/OAuth2Controller.java REST endpoint returning OAuth2 login URL
frontend/src/app/oauth2-callback/oauth2-callback.component.ts Angular callback component — token extraction and session storage
frontend/src/app/oauth2-callback/oauth2-callback.component.html Callback page template (loading spinner + error display)
frontend/src/app/oauth2-callback/oauth2-callback.component.css Callback page styling

Modified Files (OAuth2 Integration)

File Type of Change
backend/src/.../security/WebSecurityConfig.java Added .oauth2Login(), changed session policy to IF_REQUIRED, added OAuth2 permitAll paths
backend/src/.../entity/User.java Added provider, googleId fields; OAuth2 constructor; relaxed password validation
backend/src/.../repository/UserRepository.java Added findByEmail(), findByGoogleId()
backend/src/.../security/jwt/JwtUtils.java Added generateJwtTokenForUsername(String) for OAuth2 users
backend/src/.../config/OpenApiConfig.java Updated API description to include OAuth2
backend/src/main/resources/application.yml Added Google OAuth2 client config, oauth2FrontendRedirectUrl
backend/pom.xml Added spring-boot-starter-oauth2-client
backend/pom.docker.xml Added spring-boot-starter-oauth2-client
frontend/src/app/login/login.component.ts Added loginWithGoogle() method
frontend/src/app/login/login.component.html Added Google login button with SVG icon
frontend/src/app/login/login.component.css Added Google button and separator styles
frontend/src/app/app-routing.module.ts Added /oauth2/callback route
frontend/src/app/app.module.ts Declared OAuth2CallbackComponent
frontend/src/environments/environment.ts Added oauth2BackendUrl
frontend/src/environments/environment.prod.ts Added oauth2BackendUrl
docker-compose-local-test.yml Added GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, OAUTH2_FRONTEND_REDIRECT_URL

Modified Files (Frontend Auth Fix)

File Type of Change
frontend/src/app/_helpers/auth.interceptor.ts Changed x-access-tokenAuthorization header
frontend/src/app/login/login.component.ts Changed data.accessTokendata.token || data.accessToken

Modified Files (TestAPI Fix)

File Type of Change
testapi/src/.../RequestController.java Added NullNode handling in checkOutput(), guard in checkResponseTime()
testapi/src/.../TestApiController.java javax.validationjakarta.validation
testapi/src/.../TestApiRequest.java javax.validationjakarta.validation
testapi/Dockerfile Added -DskipTests -B to Maven build

Modified Files (Code Cleanup & Bug Fixes)

File Type of Change
gateway/.../GatewayApplication.java Removed unused Map import
auth/.../CustomUserDetailsService.java Removed unused ArrayList import
auth/.../JwtService.java Removed unused User, ResponseEntity, UserDetails imports
auth/.../AuthGatewayApplication.java Removed unused ServiceInstance, List imports
selenium/.../UseSelenium.java Removed unused imports, fixed deprecated Selenium API calls
selenium/.../SeleniumApplicationTests.java Removed unused Test import
user/.../UserController.java Removed unused AuthenticationManager, JwtService fields
user/.../JwtUtil.java Removed dead createToken(), refreshToken() methods
user/.../PasswordRequest.java Removed unused Set import
user/.../JwtService.java Removed unused imports
user/.../UserService.java Fixed isEmpty()!isEmpty() bug in update(), added null check in findById()
user/.../JwtAuthenticationFilter.java Added @NonNull annotations
user/.../UserRepository.java Added @NonNull annotation
selenium/.../DevCorsConfiguration.java Added @NonNull annotation

Documentation

File Type of Change
testapi-Service/README.md Complete rewrite — API test workflow documentation (request/response format, 3 assertions, curl examples), architecture diagram, compressed auth section

Commit History

# Commit Description
1 feat(oauth2) Backend: OAuth2LoginSuccessHandler, OAuth2Controller, WebSecurityConfig, User entity, JwtUtils
2 feat(frontend-oauth2) Frontend: OAuth2CallbackComponent, login Google button, routing, environment config
3 feat(docker) Docker Compose: Google OAuth2 env vars for backend-team2
4 refactor(cleanup) Code cleanup across 6 modules: unused imports, dead code, deprecated APIs
5 fix(user) UserService: isEmpty → !isEmpty bug, findById null check
6 docs(testapi) README complete rewrite with API testing documentation
7 refactor(backend) @nonnull annotations for controller robustness
8 fix(frontend) JWT auth: Authorization header + token field name compatibility
9 fix(testapi) Jakarta EE migration, NullNode handling, responseTime guard, Dockerfile optimization

Architecture Notes

Google OAuth2 Authentication Flow

User Browser          Angular Frontend         Spring Backend              Google          MongoDB
     │                     │                        │                       │                │
     ├─ Click "Google" ───►│                        │                       │                │
     │                     ├─ redirect ────────────►│                       │                │
     │                     │  /oauth2/authorization │                       │                │
     │                     │  /google               │                       │                │
     │◄─────────────────────────────── 302 ────────►│                       │                │
     │                     │                        │  accounts.google.com  │                │
     │◄─────────────── Google consent screen ──────►│                       │                │
     │  select account     │                        │                       │                │
     ├─────────────────────────────────────────────►│◄── auth code ────────►│                │
     │                     │                        │  exchange for token    │                │
     │                     │                        │◄── user info ─────────│                │
     │                     │                        │                       │                │
     │                     │                        ├── find/create user ──────────────────►│
     │                     │                        ├── generate JWT         │                │
     │                     │                        ├── encode userInfo      │                │
     │                     │                        │   (base64url)          │                │
     │◄───────────── 302 /oauth2/callback ──────────│                       │                │
     │  ?token=xxx&userInfo=xxx                     │                       │                │
     ├─ load callback ────►│                        │                       │                │
     │                     ├── decode base64url     │                       │                │
     │                     ├── save to sessionStorage                        │                │
     │◄── redirect /home ──│                        │                       │                │
     │  (authenticated)    │                        │                       │                │

Key Design Decisions

Decision Rationale
SessionCreationPolicy.IF_REQUIRED instead of STATELESS OAuth2 authorization code flow requires a temporary HTTP session to store the CSRF state parameter during the Google redirect. JWT-based requests are still stateless — AuthTokenFilter validates the token on every request without touching the session
UUID random password for OAuth2 users OAuth2 users must have a password field (MongoDB schema), but it should never be usable for local login. UUID.randomUUID() generates a cryptographically random string that the user doesn't know
Base64url-encoded userInfo in redirect URL The OAuth2 callback redirect uses a URL query parameter to pass user info to the frontend. Base64url encoding avoids issues with special characters in JSON and URL encoding
User resolution: googleId → email → create Supports three scenarios: returning Google user, existing local user linking their Google account, and brand new user registration
Frontend redirect (not API response) OAuth2 is a browser-based flow — the backend cannot return a JSON response. Instead, it redirects to the Angular app with the JWT token in the URL, where the callback component extracts and stores it

declaration fix
The previous teams created two independent services (backend and testapi)
to run the TestAPI functionality, but only backend-team2 was included in
the local deployment configuration. This caused the backend to fail when
trying to forward API test execution requests to the testapi service.

Changes:
- Add testapi-team2 service definition (build from testapi-Service/testapi,
  port 8082, mapped to host 8086)
- Fix TEST_API_SERVICE_PORT for backend-team2 (8080 -> 8082)
- Add testapi-team2 to backend-team2 depends_on
The testapi microservice crashed with NullPointerException or
unhandled ConnectException when:
1. The target API was unreachable (e.g. DNS resolution failure
   inside Docker container)
2. The request body was missing optional fields like expectedHeaders

Changes:
- Add try-catch in execute() to handle ConnectException when the
  target API is unreachable
- Add null check for response in getAnswer() to return a structured
  error message instead of crashing
- Add null check in checkResponseHeaders() for missing expectedHeaders
  field

Before: 500 Internal Server Error with raw stack trace
After: Structured JSON response with clear error message
The testapi container could not resolve external domain names due to
Docker's internal DNS limitations, causing Rest-Assured API calls to
fail with ConnectException.

Added Google public DNS (8.8.8.8, 8.8.4.4) to testapi-team2 service
to enable external API access from within the container.
Updated field annotations to provide meaningful default values in
Swagger UI "Try it out", replacing generic "string" placeholders with
realistic examples (method: GET, apiUrl: jsonplaceholder endpoint,
statusCode: 200). This makes the Swagger interface more user-friendly
for testing and demo purposes.
Java and spring boot version conflict solved
Backend crashes with E11000 duplicate key error on taf.roles collection
every time it restarts against an existing MongoDB instance. This happens
because Spring Data MongoDB attempts to recreate the unique index on the
Role.name field at every startup, conflicting with already existing data.

Changed auto-index-creation from true to false in application.yml. The
index already exists from the first successful startup, so there is no
need to recreate it on every restart.
Multiple .env and config files contained hardcoded external IPs
(185.133.251.89, 15.133.251.89, 198.7.119.0) from previous semesters'
AWS deployments that no longer exist. These have been replaced with
localhost for local development.

Changes:
- testapi-Service/.env: Fix typos (DOKCER→DOCKER, PASWORD→PASSWORD,
  PERFORMACE→PERFORMANCE), replace external IPs with localhost,
  update MongoDB credentials to local defaults
- testapi-Service/backend/.env: Replace DB_URI and EUREKA_HOST
  external IPs with localhost
- frontend environment.ts: Update apiUrl from external IP to localhost
- build.sh: Sync variable references with corrected spelling
- Delete .docker_config.env.old (contained stale plaintext credentials)
- Remove 8 duplicate variables from root .env that already exist in backend/.env (DB_URI, DB_NAME, DB_AUTH, EUREKA_HOST/PORT/USERNAME/PASSWORD, GATEWAY_PORT)
- Remove 3 dead variables from root .env never referenced by any config (GATEWAY_HOST, PERFORMANCE_DB_NAME, PERFORMANCE_DB_URI)
- Remove 5 lines of commented-out MySQL config from backend/.env containing hardcoded credentials, typos (DATABSE, HIBERNETE)
- Root .env now only holds Docker build variables; backend/.env holds all Spring Boot runtime variables
Activate the dormant JWT authentication system and integrate it with Swagger UI for the TAF backend.

Changes:

Rename AuthController.java_ → AuthController.java to enable /api/auth/signup and /api/auth/signin endpoints
Configure WebSecurityConfig to enforce authentication: only auth, swagger, actuator, test, and error paths are public; all other requests require a valid JWT
Create OpenApiConfig.java with @Securityscheme (Bearer JWT) and server URLs (localhost:8084, gateway, relative)
Add @securityrequirement("bearerAuth") to TestApiController, GatlingApiController, TestSeleniumController, TestController
Add @Schema examples to SignupRequest and LoginRequest for better Swagger UI defaults
Add jaxb-api:2.3.1 dependency to fix javax.xml.bind.DatatypeConverter ClassNotFoundException with jjwt:0.9.1 on Java 17
Add okhttp:4.12.0 version, upgrade maven-compiler-plugin to 3.13.0
Upgrade spring-boot to 3.5.10, add xstream:1.4.21 to fix CVE-2024-47072
Update settings.json for Java Language Server Maven project recognition
…ests d'API

- Ajout table des matières avec ancres

- Ajout diagramme de flux du test d'API (Frontend → Backend → TestAPI → API cible)

- Ajout section complète Tests d'API : utilisation UI, format requête/réponse JSON, 3 assertions (status code, corps JSON, en-têtes), exemple curl

- Compression de la section Authentification (JWT + OAuth2 en résumé)

- Réorganisation générale : fonctionnalité principale avant authentification
…s contrôleurs

- Ajout @nonnull sur les paramètres de méthodes pour supprimer les avertissements

- Fichiers modifiés : DevCorsConfiguration, JwtAuthenticationFilter, UserRepository
@michelzzw
michelzzw force-pushed the feature/oauth2-google-login branch from 1a97f06 to 5839077 Compare February 13, 2026 04:10
- Utiliser le header 'Authorization' au lieu de 'x-access-token' dans l'intercepteur HTTP (compatibilité Spring Boot)

- Lire le champ 'token' du service auth en plus de 'accessToken' lors du login (compatibilité avec le microservice auth séparé)
…a EE

- Migrer javax.validation vers jakarta.validation (Spring Boot 3.x)

- Gérer le cas NullNode dans checkOutput() pour éviter les faux négatifs

- Ignorer la vérification du temps de réponse quand non défini (responseTime <= 0)

- Optimiser le Dockerfile avec -DskipTests -B pour accélérer le build
Removed contact information section from README.
@cal-lie
cal-lie self-requested a review March 10, 2026 19:13
michelzzw added a commit that referenced this pull request Mar 11, 2026
@Valeeeu
Valeeeu self-requested a review March 11, 2026 23:48
@Valeeeu
Valeeeu merged commit 2132f57 into dev Mar 13, 2026
3 of 4 checks passed
@Valeeeu
Valeeeu deleted the feature/oauth2-google-login branch March 13, 2026 18:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants