DOing
[Spring Security] 소셜로그인 - 네이버 본문
1. 네이버 API에 등록
네이버 오픈 API로 이동해서 애플리케이션을 등록시켜 Client ID, Client Secret을 발급받는다.
2. appliation-oauth.properties 등록
네이버에서는 스프링 시큐리티를 공식 지원하지 않기때문에 그동안 Common-OAuth2Provider에서 해주던 값들도 전부 수동으로 입력해야한다.
# registration
spring.security.oauth2.client.registration.naver.client-id = (Client ID)
spring.security.oauth2.client.registration.naver.client-secret = (Client Secret)
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
# provider
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
authorization_uri = https://nid.naver.com/oauth2.0/authorize
네이버 아이디로 로그인 인증을 요청한다.
token_uri = https://nid.naver.com/oauth2.0/token
접근 토큰을 이용하여 프로필 정보 조회 API를 호출하거나 오픈 API를 호출해야한다. https://nid.naver.com/oauth2.0/token에서는 접근 토큰의 발급, 갱신, 삭제가 가능하다.
user-info-uri = https://openapi.naver.com/v1/nid/me
네이버 회원의 프로필을 조회한다.
user_name_attribute = response
스프링 시큐리티에서는 하위필드를 명시할 수 없다. 네이버의 응답값 최상위 필드는 resultCode, message, response이다. 때문에 id를 담고있는 response를 user_name_attribute로 일단 지정한다.
이후에 자바코드로 response의 id를 user_name으로 지정해야한다.
네이버 프로필 API 조회 응답
더보기
출력 결과
필드타입필수 여부설명
resultcode | String | Y | API 호출 결과 코드 |
message | String | Y | 호출 결과 메시지 |
response/id | String | Y | 동일인 식별 정보 동일인 식별 정보는 네이버 아이디마다 고유하게 발급되는 값입니다. |
response/nickname | String | Y | 사용자 별명 |
response/name | String | Y | 사용자 이름 |
response/email | String | Y | 사용자 메일 주소 |
출처 : 네이버 공식 문서
3. OAuthAttributes 수정
// OAuth2User에서 반환하는 사용자 정보는 Map 이기때문에 값을 하나씩 변환
public static OAuthAttributes of(String registrationId, String userNameAttributeName, Map<String, Object> attributes){
// google은 userNameAttributeName가 기본 제공되지만 네이버는 아니라서 직접 지정
if("naver".equals(registrationId)){
return ofNaver("id", attributes);
}
return ofGoogle(userNameAttributeName, attributes);
}
private static OAuthAttributes ofNaver(String userNameAttributeName, Map<String, Object> attributes){
Map<String, Object> response = (Map<String, Object>)attributes.get("response");
// 네이버의 경우 응답에 resultcode, message, response가 있으며
// response안에 id, email등이 있다.
return OAuthAttributes.builder()
.name((String) response.get("name"))
.email((String) response.get("email"))
.picture((String) response.get("profile_image"))
.attributes(response)
.nameAttributeKey(userNameAttributeName)
.build();
}
4. 화면단 수정
{{^socialName}}
<a href="/oauth2/authorization/google" class="btn btn-success active" role="button">Google Login</a>
<a href="/oauth2/authorization/naver" class="btn btn-secondary active" role="button">Naver Login</a>
{{/socialName}}
출처 :
스프링 부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 저)
'Spring' 카테고리의 다른 글
[Spring Security] UserDetailsService를 이용한 인증 (0) | 2021.04.28 |
---|---|
[Spring Security] DB를 이용하여 로그인 (0) | 2021.04.28 |
[Spring Boot] 세션저장소 (0) | 2021.04.11 |
[Spring Security] 소셜 로그인 - 구글 (0) | 2021.04.10 |
[Spring Security] 로그인 성공, 실패 - 2 (0) | 2021.04.04 |