스프링부트+jsp로 배달사이트 만들기-35 네이버아이디로 로그인

2021. 12. 23. 15:49스프링부트

https://developers.naver.com/apps

 

애플리케이션 - NAVER Developers

 

developers.naver.com

 

 

1. 애플리케이션 등록하기

 

 

 

 

 

 

 

2. Client ID, Client Secret 저장하기

 

 

 

##네이버 로그인
spring.security.oauth2.client.registration.naver.client-id=클라이언트 아이디
spring.security.oauth2.client.registration.naver.client-secret=시크릿 키
spring.security.oauth2.client.registration.naver.scope=name,email
spring.security.oauth2.client.registration.naver.client-name=Naver
spring.security.oauth2.client.registration.naver.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.naver.redirect-uri=http://localhost:8080/login/oauth2/code/naver
spring.security.oauth2.client.provider.naver.authorization-uri=https://nid.naver.com/oauth2.0/authorize
spring.security.oauth2.client.provider.naver.token-uri=https://nid.naver.com/oauth2.0/token
spring.security.oauth2.client.provider.naver.user-info-uri=https://openapi.naver.com/v1/nid/me
#회원 정보를 json으로 받는데 response라는 키값으로 네이버가 리턴
spring.security.oauth2.client.provider.naver.user-name-attribute=response

네이버는 스프링에 기본적으로 등록되어있지 않기 때문에 설정할게 많습니다

 

구글은 username을 만들때 "sub"라는 값을 꺼내서 사용하였지만 네이버는 유저의 정보를 "response"에 담아서 줍니다

provider에 따라 유저 정보를 꺼내올 클래스를 생성합니다

 

login패키지에  OauthUserInfo를 생성합니다

@Service
public class OAuthUserInfo {
	
	@Autowired
	private BCryptPasswordEncoder encodePwd;
	
	
	public Join createUser(String provider, String username, OAuth2User oauth2user) {
		UUID uid = UUID.randomUUID();
		
		String password = encodePwd.encode(uid.toString());
		String email = "";
		String phone = "";
		switch (provider) {

		case "google":
			email = oauth2user.getAttribute("email");
			phone = oauth2user.getAttribute("phone") == null ? "" : oauth2user.getAttribute("phone");
			break;

		case "naver":
			Map<String, Object> response = oauth2user.getAttribute("response");
			email = (String) response.get("email");
			phone = (String) response.get("mobile") == null ? "" : (String) response.get("mobile");
			break;
		}
		
		
		phone = phone.replace("-", "");
		
		Join join = new Join();
		join.setUsername(username);
		join.setPassword(password);
		join.setEmail(email);
		join.setNickname(username);
		join.setPhone(phone);
		
		return join;
	}
	
	
	
	public String getUsername(String provider,OAuth2User oauth2user) {
		String id = "";
		switch (provider) {

		case "google":
			id = oauth2user.getAttribute("sub");
			break;

		case "naver":
			Map<String, Object> response = oauth2user.getAttribute("response");
			id = (String) response.get("id");
			break;
			
		}
		return provider + "_" + id;
		
	}

}

 

 

OauthUserService를 수정합니다

@Service
public class OauthUserService extends DefaultOAuth2UserService {

	@Autowired
	private SqlSession sql;
	
	@Autowired
	private UserDAO userDAO;
	
	@Autowired
	private OAuthUserInfo oauthUserInfo;
	
	@Override
	public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
		
		OAuth2User oauth2user = super.loadUser(userRequest);
		
		String provider = userRequest.getClientRegistration().getRegistrationId();
		
		String username = oauthUserInfo.getUsername(provider, oauth2user);
		
		User user = sql.selectOne("user.login", username);

		if(user == null) {
			// 첫 로그인시 유저정보 생성
			Join join = oauthUserInfo.createUser(provider, username, oauth2user);
			userDAO.join(join);
			user = sql.selectOne("user.login", username);
		}
 		
		LoginService loginService = new LoginService();
		loginService.setUser(user);
		
		return loginService;
	}

	
	
}

 

 

시큐리티 설정 파일에 아래 로그인 성공시 설정을 추가합니다

 

 

 

주문 페이지의 uri를 수정하면서 LgoinSuccess는 수정하지 않았었는데 아래처럼 변경합니다

@Component
public class LoginSuccess implements AuthenticationSuccessHandler {

	@Override
	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
			Authentication authentication) throws IOException, ServletException {
		
		HttpSession session = request.getSession();
		
		String referer = (String) session.getAttribute("referer");
		
		if(referer != null) {
			String domain = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort() + "/";
			String uri = referer.replace(domain, "");
			
			if(uri.split("/")[0].equals("order")) {
				response.sendRedirect("/" + uri);
				return;
			}
		}
		
		response.sendRedirect("/myPage");
	}
}