Skip to content

Commit 8f030e3

Browse files
authored
Merge pull request #50 from GDSCINHA/feature/issue-5
[FEAT] 프론트에 코드 받으면 사용자 정보 불러와지는지 확인
2 parents 37e8c22 + dfb70e2 commit 8f030e3

File tree

5 files changed

+110
-0
lines changed

5 files changed

+110
-0
lines changed

gdgoc/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ dependencies {
4848
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
4949
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
5050
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
51+
52+
// OAuth
53+
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
5154
}
5255

5356
tasks.withType(JavaCompile).configureEach {
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package inha.gdgoc.domain.user.controller;
2+
3+
import inha.gdgoc.domain.user.service.GoogleOAuthService;
4+
import inha.gdgoc.global.common.ApiResponse;
5+
import jakarta.servlet.http.HttpServletResponse;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.web.bind.annotation.GetMapping;
9+
import org.springframework.web.bind.annotation.RequestMapping;
10+
import org.springframework.web.bind.annotation.RequestParam;
11+
import org.springframework.web.bind.annotation.RestController;
12+
13+
@RequestMapping("/auth/oauth2")
14+
@RestController
15+
@RequiredArgsConstructor
16+
public class AuthController {
17+
18+
private final GoogleOAuthService googleOAuthService;
19+
20+
@GetMapping("/google/callback")
21+
public ResponseEntity<ApiResponse<?>> handleGoogleCallback(
22+
@RequestParam String code,
23+
HttpServletResponse response
24+
) {
25+
googleOAuthService.processOAuthLogin(code, response);
26+
return ResponseEntity.ok(ApiResponse.success("code 받기 성공"));
27+
}
28+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package inha.gdgoc.domain.user.service;
2+
3+
import org.springframework.beans.factory.annotation.Value;
4+
import inha.gdgoc.domain.user.repository.UserRepository;
5+
import jakarta.servlet.http.HttpServletResponse;
6+
import java.util.Map;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.http.HttpEntity;
9+
import org.springframework.http.HttpHeaders;
10+
import org.springframework.http.HttpMethod;
11+
import org.springframework.http.MediaType;
12+
import org.springframework.http.ResponseEntity;
13+
import org.springframework.stereotype.Service;
14+
import org.springframework.util.LinkedMultiValueMap;
15+
import org.springframework.util.MultiValueMap;
16+
import org.springframework.web.client.RestTemplate;
17+
18+
@Service
19+
@RequiredArgsConstructor
20+
public class GoogleOAuthService {
21+
22+
@Value("${google.client-id}")
23+
private String clientId;
24+
25+
@Value("${google.client-secret}")
26+
private String clientSecret;
27+
28+
@Value("${google.redirect-uri}")
29+
private String redirectUri;
30+
31+
private final UserRepository userRepository;
32+
33+
private final RestTemplate restTemplate = new RestTemplate();
34+
35+
public void processOAuthLogin(String code, HttpServletResponse response) {
36+
// 1. code → access token 요청
37+
HttpHeaders headers = new HttpHeaders();
38+
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
39+
40+
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
41+
params.add("code", code);
42+
params.add("client_id", clientId);
43+
params.add("client_secret", clientSecret);
44+
params.add("redirect_uri", redirectUri);
45+
params.add("grant_type", "authorization_code");
46+
47+
HttpEntity<MultiValueMap<String, String>> tokenRequest = new HttpEntity<>(params, headers);
48+
ResponseEntity<Map> tokenResponse = restTemplate.postForEntity(
49+
"https://oauth2.googleapis.com/token",
50+
tokenRequest,
51+
Map.class
52+
);
53+
54+
String accessToken = (String) tokenResponse.getBody().get("access_token");
55+
56+
// 2. access token → 사용자 정보 요청
57+
HttpHeaders userInfoHeaders = new HttpHeaders();
58+
userInfoHeaders.setBearerAuth(accessToken);
59+
HttpEntity<Void> userInfoRequest = new HttpEntity<>(userInfoHeaders);
60+
61+
ResponseEntity<Map> userInfoResponse = restTemplate.exchange(
62+
"https://www.googleapis.com/oauth2/v2/userinfo",
63+
HttpMethod.GET,
64+
userInfoRequest,
65+
Map.class
66+
);
67+
}
68+
}

gdgoc/src/main/resources/application-local.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ spring:
1515
jdbc:
1616
time_zone: Asia/Seoul
1717

18+
google:
19+
client-id: ${GOOGLE_CLIENT_ID}
20+
client-secret: ${GOOGLE_CLIENT_SECRET}
21+
redirect-uri: ${GOOGLE_REDIRECT_URI}
22+
1823
logging:
1924
level:
2025
org.hibernate.SQL: debug

gdgoc/src/main/resources/application-prod.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,9 @@ logging:
2323
level:
2424
org.hibernate.SQL: debug
2525
org.hibername.type: trace
26+
27+
28+
google:
29+
client-id: ${GOOGLE_CLIENT_ID}
30+
client-secret: ${GOOGLE_CLIENT_SECRET}
31+
redirect-uri: ${GOOGLE_REDIRECT_URI}

0 commit comments

Comments
 (0)