OAuthService.java

package com.archiweb.service;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Map;

@Service
@Slf4j
public class OAuthService {

    private final RestTemplate restTemplate;
    private final ObjectMapper objectMapper;
    
    public OAuthService() {
        this.restTemplate = new RestTemplate();
        this.objectMapper = new ObjectMapper();
    }

    /**
     * Vérifie un token Google et récupère les informations utilisateur
     */
    public Map<String, String> verifyGoogleToken(String token) {
        try {
            String url = "https://www.googleapis.com/oauth2/v2/userinfo?access_token=" + token;
            HttpHeaders headers = new HttpHeaders();
            HttpEntity<String> entity = new HttpEntity<>(headers);
            
            log.info("Vérification du token Google - URL: {}", url.replace(token, "***"));
            ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
            
            log.info("Réponse Google API - Status: {}, Body length: {}", 
                    response.getStatusCode(), 
                    response.getBody() != null ? response.getBody().length() : 0);
            
            if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
                JsonNode userInfo = objectMapper.readTree(response.getBody());
                
                String email = userInfo.has("email") ? userInfo.get("email").asText() : "";
                String firstName = userInfo.has("given_name") ? userInfo.get("given_name").asText() : "";
                String lastName = userInfo.has("family_name") ? userInfo.get("family_name").asText() : "";
                String username = userInfo.has("email") ? userInfo.get("email").asText().split("@")[0] : "";
                
                log.info("Token Google valide - Email: {}, FirstName: {}, LastName: {}", email, firstName, lastName);
                
                return Map.of(
                    "email", email,
                    "firstName", firstName,
                    "lastName", lastName,
                    "username", username,
                    "valid", "true"
                );
            } else {
                log.warn("Token Google invalide - Status: {}, Body: {}", 
                        response.getStatusCode(), 
                        response.getBody());
            }
        } catch (Exception e) {
            log.error("Erreur lors de la vérification du token Google: {}", e.getMessage(), e);
        }
        return Map.of("valid", "false");
    }

    /**
     * Vérifie un token Facebook et récupère les informations utilisateur
     */
    public Map<String, String> verifyFacebookToken(String token) {
        try {
            // Vérifier d'abord que le token est valide
            String verifyUrl = "https://graph.facebook.com/me?access_token=" + token + "&fields=id,email,first_name,last_name,name";
            HttpHeaders headers = new HttpHeaders();
            HttpEntity<String> entity = new HttpEntity<>(headers);
            
            ResponseEntity<String> response = restTemplate.exchange(verifyUrl, HttpMethod.GET, entity, String.class);
            
            log.info("Réponse Facebook API - Status: {}, Body: {}", response.getStatusCode(), response.getBody());
            
            if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
                JsonNode userInfo = objectMapper.readTree(response.getBody());
                
                String email = userInfo.has("email") ? userInfo.get("email").asText() : "";
                String firstName = userInfo.has("first_name") ? userInfo.get("first_name").asText() : "";
                String lastName = userInfo.has("last_name") ? userInfo.get("last_name").asText() : "";
                String username = email.isEmpty() ? 
                    (userInfo.has("name") ? userInfo.get("name").asText().replaceAll("\\s+", "_") : "") :
                    email.split("@")[0];
                
                log.info("Token Facebook valide - Email: {}, FirstName: {}, LastName: {}", email, firstName, lastName);
                
                return Map.of(
                    "email", email,
                    "firstName", firstName,
                    "lastName", lastName,
                    "username", username,
                    "valid", "true"
                );
            } else {
                log.warn("Token Facebook invalide - Status: {}, Body: {}", response.getStatusCode(), response.getBody());
            }
        } catch (Exception e) {
            log.error("Erreur lors de la vérification du token Facebook: {}", e.getMessage(), e);
        }
        return Map.of("valid", "false");
    }
}