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");
}
}