728x90
구축 환경 💻
Spring boot + JSP
📌 Naver 공식 문서
📌 Naver API 서비스 등록하기
[Naver Developers] 들어가기 - 왼쪽 상단바 클릭 - [네이버 로그인] -[네이버 로그인 API]
맨 아래로 이동 - [오픈 API 이용 신청]
다음과 같은 순서로 진행하기
[애플리케이션 이름] 등록 - [사용 API] 선택하기
[환경 추가] 설정하기 - [PC웹] 선택 - [서비스 URL] / [Callback URL] 설정하기 - [등록하기]
Client ID / Client Secret는 필요하므로 기록해두기
📌 프론트 설정하기
naver login 아이콘을 클릭하여 해당 페이지를 요청하기 위해 img에 해당하는 곳에 <a></a> 및 링크를 걸어두었다.
<a href="https://nid.naver.com/oauth2.0/authorize
?response_type=code
&client_id={클라이언트 ID}
&state=STATE_STRING
&redirect_uri={리다이렉트 URL}" >
다음과 같이 redirect 창이 뜬다
📌 서버 설정하기
OAuthToken
package com.tenco.bank.dto;
import java.util.Properties;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;
@Data
@JsonNaming(value=PropertyNamingStrategies.SnakeCaseStrategy.class)
public class OAuthToken {
private String accessToken;
private String tokenType;
private String refreshToken;
private Integer expiresIn;
private String scope;
private Integer refreshTokenExpiresIn;
}
NaverProfile
package com.tenco.bank.dto.oauth.naver;
import lombok.Data;
@Data
public class NaverProfile {
private String resultcode;
private String message;
private NaverResponse response;
}
NaverResponse
package com.tenco.bank.dto.oauth.naver;
import lombok.Data;
@Data
public class NaverResponse {
private String id;
private String nickname;
private String profileImage;
private String email;
private String name;
}
UserController
@Slf4j
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/naver-callback")
public String naverCallback(@RequestParam String code) {
RestTemplate rt1 = new RestTemplate();
HttpHeaders headers1 = new HttpHeaders();
headers1.add("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("grant_type", "authorization_code");
params.add("client_id", "클라이언트 아이디");
params.add("client_secret", "클라이언트 key");
params.add("code", code);
params.add("state", "STATE_STRING");
HttpEntity<MultiValueMap<String, String>> reqMsg
= new HttpEntity<>(params, headers1);
ResponseEntity<OAuthToken> response
= rt1.exchange("https://nid.naver.com/oauth2.0/token",
HttpMethod.POST,
reqMsg,
OAuthToken.class);
RestTemplate rt2 = new RestTemplate();
HttpHeaders headers2 = new HttpHeaders();
headers2.add("Authorization", "Bearer "+ response.getBody().getAccessToken());
headers2.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
HttpEntity<MultiValueMap<String, String>> naverInfo
= new HttpEntity<>(headers2);
ResponseEntity<NaverProfile> response2
= rt2.exchange("https://openapi.naver.com/v1/nid/me",
HttpMethod.POST,
naverInfo,
NaverProfile.class);
NaverProfile naverProfile = response2.getBody();
SignUpFormDto dto = SignUpFormDto.builder()
.username("Naver_"+ naverProfile.getResponse().getNickname())
.fullname(naverProfile.getResponse().getName())
.email(naverProfile.getResponse().getEmail())
.password("1111")
.build();
User oldUser = userService.readUserByUsername(dto.getUsername());
if(oldUser == null) {
userService.createUser(dto);
oldUser = new User();
oldUser.setUsername(dto.getUsername());
oldUser.setFullname(dto.getFullname());
oldUser.setEmail(dto.getEmail());
}
oldUser.setPassword(null);
// 로그인 처리
httpSession.setAttribute(Define.PRINCIPAL, oldUser);
return "redirect:/account/list";
}
}
토큰 요청 URI : https://nid.naver.com/oauth2.0/token
> Method: POST
사용자 정보 요청 URI : https://openapi.naver.com/v1/nid/me
> Method: POST
<관련 자료>
Kakao 소셜 로그인 하러 가기
https://31daylee.tistory.com/51
Google 소셜 로그인 하러 가기
https://31daylee.tistory.com/52
728x90
'Spring > Skill' 카테고리의 다른 글
[MyBatis] upsert (insert + update) mapper 작성법 (0) | 2024.03.18 |
---|---|
[Spring Data MongoDB] UpdateResult 와 WriteResult의 차이 (0) | 2024.03.12 |
[Javascript] active 값 활성화하기 (0) | 2024.02.12 |
[spring] OAuth2 구글 인증하기 (0) | 2024.02.07 |
[Spring] OAuth2 카카오 인증하기 + kakao 이메일 인증 권한 받는 법 (1) | 2024.02.06 |