OAuth2.0-Client가 제공하는 Provider는 "Google", "Facebook", "Twitter"가 있다.
이 3개를 제외하고 다른 포털사이트를 통해 로그인을 하려면 application.yml
에 몇가지를 추가해야한다.
spring:
security:
oauth2:
client:
registration:
naver:
client-id: C8Y__XpYiQ588321H6do
client-secret: pJWthHNMnZ
scope:
- name
- email
# - profile-image
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
기존 구글과 페이스북으로 로그인 할 때, 추가한 코드보다 훨씬 더 많이 추가했다.
authorization-grant-type
: 권한 부여 방식의 종류를 선택하는 것이다. 우리는 "authorization_code" 방식을 사용한다.
redirect-uri
: 소셜 로그인을 통해 인증 받고 우리 페이지로 돌아올 경로를 설정한다.
provider 전까지만 설정하면 네이버 로그인 창이 떠서 로그인은 가능하지만, OAuth2-client에 provider로 저장이 되어있지 않아 NPE가 발생한다.
이제 provider에 naver를 추가해보자.
authorization-uri
: 네이버 로그인 인증 요청 URI이다.
token-uri
: 네이버 로그인 인증이 완료되면 "code"값을 콜백해주는데, 콜백해준 "code"값을 통해 접근 토큰 발급 요청하는 URI이다.
user-info-uri
: 접근 토큰을 이용하여 프로필 API를 호출하는 URI이다.
user-name-attribute
: 이따가 보여주겠지만, 네이버 사용자의 정보가 "response"안에 들어있다.
이제 설정을 완료했으니 회원가입을 해보겠다. 추가 코드는 별로 없다.
우선 NaverUserInfo
클래스를 만들어 주자.
public class NaverUserInfo implements OAuth2UserInfo{
private Map<String, Object> attributes;
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");
}
}
이제 PrincipalOauth2UserService
클래스에서 몇가지 코드만 추가하기 전에 response
에 대해서 설명하고 추가하자.
OAuth2User oAuth2User = super.loadUser(userRequest);
System.out.println("oAuth2User.getAttributes() = " + oAuth2User.getAttributes());
PrincipalOauth2UserService
클래스 안에 위 코드가 들어있다.
oAuth2User.getAttributes()
는 토큰을 통해 받은 사용자의 정보가 Map타입으로 구성되어 있는데, 이 정보를 가져오는 코드이다.
이 코드를 실행시키면 다음과 같다.
oAuth2User.getAttributes() = {
resultcode=00,
message=success,
response={id=5AOZZVMtYjR..., email=zz1996zz@naver.com, name=이정수}
}
출력결과를 보면 우리가 필요한 정보는 "response"라는 키의 값으로 들어가있다.
그래서 우리가 그렇게 설정한 것이다.
이제 "response" 안에 있는 정보를 NaverUserInfo
객체에 넘겨주면 된다.
다음 코드만 추가하면 끝이다.
else if (userRequest.getClientRegistration().getRegistrationId().equals("naver")) {
System.out.println("네이버 로그인 요청");
oAuth2UserInfo = new NaverUserInfo((Map) oAuth2User.getAttributes().get("response"));
}
"response"도 Map의 형태이기 때문에 Map으로 캐스팅해준 다음에 넘겨주었다.
이렇게 추가하면 네이버 로그인도 완성이다.