네이버 API 등록
https://developers.naver.com/apps/#/register?api=nvlogin
애플리케이션 이름, 사용 API, 사용 환경, 서비스 URL (http://localhost:8080/), callbackURL 등록
-> ClientID, ClientSecret가 생성됨
application-oauth.properties
spring.security.oauth2.client.registration.naver.client-id=9V6XsAlBeeZKCnP4huO8
spring.security.oauth2.client.registration.naver.client-secret=7nbpNteg6z
spring.security.oauth2.client.registration.naver.redirect-uri={baseUrl}/{action}/oauth2/code/{registrationId}
spring.security.oauth2.client.registration.naver.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration..naver.scope=name,email,profile_image
spring.security.oauth2.client.registration.naver.client-name=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
spring.security.oauth2.client.provider.naver.user_name_attribute=response
기준이 되는 user_name의 이름을 네이버에서는 response로 해야함 - 네이버의 회원 조회 시 반환되는 JSON 형태 때문
네이버 오픈 API 로그인 회원 결과
{
"resultcode": "00",
"message": "success",
"response": {
"email" : "openapi@naver.com",
...
}
}
- 스프링 시큐리티에서는 하위 필드를 명시할 수 없음
- 최상위 필드들만 user_name으로 지정 가능한데 네이버는 resultcode, message, response 3개라서 골라야함
OAuthAttributes
of 메서드 바꾸기
public static OAuthAttributes of(String registrationId, String userNameAttributeName,
Map<String, Object> attributes) {
if ("naver".equals(registrationId)) {
return ofNaver("id", attributes);
}
return ofGoogle(userNameAttributeName, attributes);
}
ofNaver 메서드 추가
private static OAuthAttributes ofNaver(String userNameAttributeName, Map<String, Object> attributes) {
Map<String, Object> response = (Map<String, Object>) attributes.get("response");
return OAuthAttributes.builder()
.name((String) response.get("name"))
.email((String) response.get("email"))
.picture((String) response.get("picture"))
.attributes(response)
.nameAttributeKey(userNameAttributeName)
.build();
}