Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

DOing

[Spring Security] 소셜로그인 - 네이버 본문

Spring

[Spring Security] 소셜로그인 - 네이버

mangdo 2021. 4. 11. 22:39

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로 혼자 구현하는 웹 서비스(이동욱 저)

developers.naver.com/docs/common/openapiguide/apilist.md