네이버 로그인을 하기전에 우리가 구글,페이스북 로그인에 사용하던
OAuth2 client 에서 Google,Facebook 은 기본적으로 제공해 주지만,
네이버/카카오 등 나라마다 대형 포털사이트를 모두 제공해주진않는다.
그 이유는 getAttributes 값이 포털 사이트마다 너무 다양하기 때문이다.
구글과 페이스북만 보더라도 provider-id를 "sub" 와 "id" 이렇게 다르게 담아 주었다.
따라서 기본 제공해주지않는 포털사이트 로그인을 위해서는 사이트를 확인해보아야 한다.
순서는 다음과 같이 진행하겠다.
https://developers.naver.com/main/
다음 사이트에 접속하여 로그인을 진행하면 다음과 같은 화면이 나올 것이다.
여기서 Application > Application 등록 > 애플리케이션 이름 / API설정(네이버로그인) / API서비스환경(웹) > CallBack URL 설정(http://localhost:8080/login/oauth2/code/naver) 을 하면 앱이 생성된다.
생성된 앱을 이용하여 application.yml을 작성한다.
security:
oauth2:
client:
registration:
google:
client-id: /**자신의 client-id**/
client-secret: /**자신의 client-secret**/
scope: profile,email
facebook:
client-id: /**자신의 client-id**/
client-secret: /**자신의 client-secret**/
scope: public_profile,email
naver:
client-id: /**자신의 client-id**/
client-secret: /**자신의 client-secret**/
scope: name,email
client-name: Naver
authorization-grant-type: authorization_code
redirect-uri: http://localhost:8080/login/oauth2/code/naver
provider:
naver:
authorization-uri: https://nid.naver.com/oauth2.0/authorize
token-uri: https://nid.naver.com/oauth2.0/token
user-info-uri: https://openapi.naver.com/v1/nid/me
user-name-attribute: response #회원 정보를 JSON으로 받는데 response라는 키값으로 네이버가 리턴해줌.
autorization-grant-type 은 어떤 방식으로 인증을 할 것인가 이다
우리는 기존에 사용하던 권한 코드 부여 방식을 이용하기 때문에 authorization_code 를 입력해 준다
redirect-uri 는 로그인 주소를 적는것이다. 기존의 구글이나 페이스북 같은 경우는 고정이 되어있었기 때문에 적어주지 않았지만 네이버는 적어주어야 한다.
이 경우 기존의 방식을 따르는것이 좋다.
provider를 작성하기 위해서는 사이트를 참고하여야한다고 했다.
https://developers.naver.com/docs/login/devguide/devguide.md
다음 사이트를 참고하면 이해 할 수 있다.
authorization-url : 이 주소로 요청을 하면 네이버 로그인이 뜬다
token-uri : 이 주소를 사용하여야 토큰을 받을 수 있다.
user-info-uri : 이 주소를 사용하여야 프로필 정보를 받을 수 있다.
다음과 같이 설정한뒤 이제 기존에 했던것과 똑같이 구현하면 된다.
// 회원가입
OAuth2UserInfo oAuth2UserInfo = null;
if(userRequest.getClientRegistration().getRegistrationId().equals("google")){
System.out.println("구글 로그인 요청");
oAuth2UserInfo = new GoogleUserInfo(oauth2User.getAttributes());
}else if(userRequest.getClientRegistration().getRegistrationId().equals("facebook")) {
System.out.println("페이스북 로그인 요청");
oAuth2UserInfo = new FacebookUserInfo(oauth2User.getAttributes());
}else if(userRequest.getClientRegistration().getRegistrationId().equals("naver")){
System.out.println("네이버 로그인 요청");
oAuth2UserInfo = new NaverUserInfo((Map)oauth2User.getAttributes().get("response"));
}else{
System.out.println("구글, 페이스북,네이버 로그인만 지원합니다.");
}
네이버 로그인으로 들어 올시 NaverUserInfo 클래스를 이용하여 만든다.
네이버로그인은 특이하게 attributes에서 response라는 attribute를 다시 준다. 그 이유는 네이버는 attributes안에 response라는 속성에 id,email등을 보관하기 때문이다.
public class NaverUserInfo implements OAuth2UserInfo{
private Map<String,Object> attributes; // getAttributes;
// 생성자
public NaverUserInfo(Map<String,Object> attributes){
this.attributes = attributes;
}
@Override
public String getProviderId() {
return (String)attributes.get("id");
}
@Override
public String getProvider() {
return "naver";
}
@Override
public String getEmail() {
return (String)attributes.get("email");
}
@Override
public String getName() {
return (String)attributes.get("name");
}
}
다음과 같이 구현하여 소셜로그인 구글/페이스북/네이버 로그인을 해보았다.