[Flutter] Client Credentials Grant 3 - 네이버 로그인

류재성's avatar
Jun 07, 2024
[Flutter] Client Credentials Grant 3 - 네이버 로그인
 
 

1. 기본 설정

 

1.1 내 애플리케이션 만들기

 
 
notion image
 
notion image
notion image
 
필요한 데이터를 체크한다.
 
notion image
 
플러터는 안드로이드, iOS 둘 다 사용 가능하다. 지금은 안드로이드만 사용할 예정이라 안드로이드만 체크한다.
 
 
 
notion image
 
다운로드 URL 과 패키지 이름을 넣는다. 테스트용이기 때문에 임의의 다운로드 URL 주소를 넣는다.
 
notion image
 
패키지 주소는 플러터의 build.gradle 에서 확인할 수 있다.
 
notion image
 
Client ID 와 Client Secret 을 확인할 수 있다.
 

2. 플러터 설정

 

2.1 strings.xml 설정

notion image
 
android/app/src/main/res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="client_id">[client_id]</string> <string name="client_secret">[client_secret]</string> <string name="client_name">[client_name]</string> </resources>
 
strings.xml 을 생성 후 위의 코드를 넣어준다.
 
notion image
 
💡
strings.xml 에 값을 직접 입력해놓는다. Client_name은 임의의 값을 넣어도 된다.
 

2.2 AndroidManifest.xml 설정

 
android/app/src/main/AndroidManifest.xm
notion image
 
<meta-data android:name="com.naver.sdk.clientId" android:value="@string/client_id" /> <meta-data android:name="com.naver.sdk.clientSecret" android:value="@string/client_secret" /> <meta-data android:name="com.naver.sdk.clientName" android:value="@string/client_name" />
 
notion image
 
AndroidManifest.xml에 meta-data를 넣는다.
 

2.3 flutter_naver_login 라이브러리 적용

 
 
pub.dev 의 네이버 로그인 라이브러리를 설치한다.
 
notion image
 
pubspec.yaml 에 flutter_naver_login 라이브러리를 적용 후 pub get을 누른다.
 

3. 서버와 통신하기

 

3.1 네이버 토큰 받기

 
login_page.dart
void NaverLogin() async { try { // 1. 로그인 (토큰 가져오기) await FlutterNaverLogin.logIn(); // 네이버 로그인 시도 NaverAccessToken token = await FlutterNaverLogin.currentAccessToken; // 토큰 가져오기 print('네이버계정으로 로그인 성공 ${token.accessToken}'); } catch (error) { print('네이버계정으로 로그인 실패 $error'); }
 
notion image
notion image
 
 
 
notion image
 
네이버에서 받은 토큰을 확인할 수 있다.
 

3.2토큰 서버로 보내기

 
login_page.dart
final response = await dio.get("/oauth/naver/callback", queryParameters: {"accessToken": token.accessToken});
 
userContoller
@GetMapping("/oauth/naver/callback") public ResponseEntity<?> oauthNaverCallback(@RequestParam("accessToken") String naverAccessToken){ System.out.println("스프링에서 받은 카카오토큰 : "+naverAccessToken); return null ; }
 
notion image
 
스프링 서버에서 토큰을 받았다.
 

3.3 토큰 검증 후 로그인

 
UserController
@Transactional public String 네이버로그인(String naverAccessToken) { // 1. RestTemplate 객체 생성 RestTemplate rt = new RestTemplate(); // 2. 토큰으로 사용자 정보 받기 (PK, Email) HttpHeaders headers = new HttpHeaders(); headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8"); headers.add("Authorization", "Bearer " + naverAccessToken); HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(headers); ResponseEntity<NaerResponse.NaverUserDTO> response = rt.exchange( "https://openapi.naver.com/v1/nid/me", HttpMethod.GET, request, NaerResponse.NaverUserDTO.class); // 3. 해당정보로 DB조회 (있을수, 없을수) String username = "Naver_" + response.getBody().getResponse().getId(); User userPS = userJPARepository.findByUsername(username) .orElse(null); // 4. 있으면? - 조회된 유저정보 리턴 if (userPS != null) { return JwtUtil.create(userPS); } else { // 5. 없으면? - 강제 회원가입 User user = User.builder() .username(username) .password(UUID.randomUUID().toString()) .email(response.getBody().getResponse().getEmail()) .provider("naver") .build(); User returnUser = userJPARepository.save(user); return JwtUtil.create(returnUser); } }
 
NaverLogin
package shop.mtcoding.blog.user; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; public class NaerResponse { @Data public static class TokenDTO { @JsonProperty("access_token") private String accessToken; @JsonProperty("refresh_token") private String refreshToken; @JsonProperty("token_type") private String tokenType; @JsonProperty("expires_in") private String expiresIn; } @Data public static class NaverUserDTO { private String resultcode; private String message; private ResponseDTO response; @Data class ResponseDTO { private String id; private String email; } } }
 
UserController
@GetMapping("/oauth/naver/callback") public ResponseEntity<?> oauthNaverCallback(@RequestParam("accessToken") String naverAccessToken){ System.out.println("스프링에서 받은 카카오토큰 : "+naverAccessToken); String blogAccessToken = userService.네이버로그인(naverAccessToken); return ResponseEntity.ok().header("Authorization", "Bearer "+blogAccessToken).body(new ApiUtil(null)); }
 
notion image
 

3.4 토큰 디바이스 저장

 
void NaverLogin() async { try { // 1. 로그인 (토큰 가져오기) await FlutterNaverLogin.logIn(); // 네이버 로그인 시도 NaverAccessToken token = await FlutterNaverLogin.currentAccessToken; // 토큰 가져오기 print('네이버계정으로 로그인 성공 ${token.accessToken}'); //2. 토큰 서버로 보내기 final response = await dio.get("/oauth/naver/callback", queryParameters: {"accessToken": token.accessToken}); // 3. 토큰 응답받기 final blogAccessToken = response.headers["Authorization"]!.first; print("blogAccessToken : ${blogAccessToken}"); // 4. 시큐어 스토리지에 저장 secureStorage.write(key: "blogAccessToken", value: blogAccessToken); } catch (error) { print('네이버계정으로 로그인 실패 $error'); } }
notion image
 
스프링 서버에서 발급받은 새로운 토큰을 확인할 수 있다.
 
Share article
RSSPowered by inblog