이번엔 소셜로그인을 구현했다.
이제 관리자 페이지만 만들면 커뮤니티 프로젝트가 마무리 된다.
마지막으로 AWS EC2로 배포를 하고,
프로필이미지나 첨부파일 기능을 위한 로컬위치 변경과
몇가지 설정을 해주면 끝이다.
네이버 개발자센터로 가서
API 이용설정
Service URL 설정
Callback URL설정
을 해준다.
Service URL은 http://localhost:8080로 적어줬고,
callback URL은 로그인 연결시 , 호출할 URL을 적어주자.
로그인이 연결되어 데이터가 넘어오면 URL로 컨트롤러에서 해당값을 받아서 DB에 insert하거나,
select해서 이미 insert되있다면 세션값을 줘서 로그인 시키는 등의 방법으로 활용하면 되겠다.
Pom.xml
<!-- oauth2 login -->
<dependency>
<groupId>com.github.scribejava</groupId>
<artifactId>scribejava-apis</artifactId>
<version>5.6.0</version>
</dependency>
<dependency>
<groupId>com.github.scribejava</groupId>
<artifactId>scribejava-core</artifactId>
<version>5.6.0</version>
</dependency>
Oauth2 를 사용하기 위한 라이브러리 추가.
root-servlet.xml
<!-- 네이버 로그인 -->
<bean id="naverClientID" class="java.lang.String">
<constructor-arg value="클라이언트ID" />
</bean>
<bean id="naverClientSecret" class="java.lang.String">
<constructor-arg value="secret코드" />
</bean>
<bean id="naverRedirectUrl" class="java.lang.String">
<constructor-arg value="http://localhost:8080/member/naverLogin" />
</bean>
<bean id="naverSns" class="kr.co.commons.sns.SnsValue">
<constructor-arg value="naver" />
<constructor-arg ref="naverClientID" />
<constructor-arg ref="naverClientSecret" />
<constructor-arg ref="naverRedirectUrl" />
</bean>
<!-- -->
라이브러리를 받았으니 , 설정을 해주자.
파일 생성
NaverAPI20
public class NaverAPI20 extends DefaultApi20 implements SnsUrls{
private NaverAPI20() {
}
private static class InstanceHolder {
private static final NaverAPI20 INSTANCE = new NaverAPI20();
}
public static NaverAPI20 instance() {
return InstanceHolder.INSTANCE;
}
@Override
public String getAccessTokenEndpoint() {
return NAVER_ACCESS_TOKEN;
}
@Override
protected String getAuthorizationBaseUrl() {
return NAVER_AUTH;
}
}
SNSLogin
public class SNSLogin {
private OAuth20Service oauthService;
private SnsValue sns;
public SNSLogin(SnsValue sns) {
this.oauthService = new ServiceBuilder(sns.getClientId())
.apiSecret(sns.getClientSecret())
.callback(sns.getRedirectUrl())
.scope("profile")
.build(sns.getApi20Instance());
this.sns = sns;
}
public String getNaverAuthURL() {
return this.oauthService.getAuthorizationUrl();
}
public MemberVO getUserProfile(String code) throws Exception {
OAuth2AccessToken accessToken = oauthService.getAccessToken(code);
OAuthRequest request = new OAuthRequest(Verb.GET, this.sns.getProfileUrl());
oauthService.signRequest(accessToken, request);
Response response = oauthService.execute(request);
return parseJson(response.getBody());
}
private MemberVO parseJson(String body) throws Exception {
System.out.println("============================\n" + body + "\n==================");
MemberVO user = new MemberVO();
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(body);
if (this.sns.isNaver()) {
JsonNode resNode = rootNode.get("response");
user.setNaverid(resNode.get("id").asText());
user.setNickname(resNode.get("nickname").asText());
user.setEmail(resNode.get("email").asText());
}
System.out.println("user"+user.getEmail());
return user;
}
}
SnsUrls
public interface SnsUrls {
static final String NAVER_ACCESS_TOKEN =
"https://nid.naver.com/oauth2.0/token?grant_type=authorization_code";
static final String NAVER_AUTH = "https://nid.naver.com/oauth2.0/authorize";
static final String GOOGLE_PROFILE_URL =
"https://www.googleapis.com/plus/v1/people/me";
static final String NAVER_PROFILE_URL =
"https://openapi.naver.com/v1/nid/me";
}
SnsValue
public class SnsValue implements SnsUrls{
private String service;
private String clientId;
private String clientSecret;
private String redirectUrl;
private DefaultApi20 api20Instance;
private String profileUrl;
private boolean isNaver;
private boolean isGoogle;
public boolean isNaver() {
return isNaver;
}
public void setNaver(boolean isNaver) {
this.isNaver = isNaver;
}
public boolean isGoogle() {
return isGoogle;
}
public void setGoogle(boolean isGoogle) {
this.isGoogle = isGoogle;
}
public String getProfileUrl() {
return profileUrl;
}
public void setProfileUrl(String profileUrl) {
this.profileUrl = profileUrl;
}
public DefaultApi20 getApi20Instance() {
return api20Instance;
}
public void setApi20Instance(DefaultApi20 api20Instance) {
this.api20Instance = api20Instance;
}
public String getService() {
return service;
}
public void setService(String service) {
this.service = service;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getClientSecret() {
return clientSecret;
}
public void setClientSecret(String clientSecret) {
this.clientSecret = clientSecret;
}
public String getRedirectUrl() {
return redirectUrl;
}
public void setRedirectUrl(String redirectUrl) {
this.redirectUrl = redirectUrl;
}
public SnsValue(String service, String clientId, String clientSecret,String redirectUrl) {
this.service = service;
this.clientId = clientId;
this.clientSecret = clientSecret;
this.redirectUrl = redirectUrl;
this.isNaver = StringUtils.equalsIgnoreCase("naver", this.service);
this.isGoogle = StringUtils.equalsIgnoreCase("google", this.service);
if (isNaver) {
this.api20Instance = NaverAPI20.instance();
this.profileUrl = NAVER_PROFILE_URL;
}
}
}
Controller
@RequestMapping(value="/naverLogin", method = {RequestMethod.GET, RequestMethod.POST})
public String snsLoginCallback(HttpSession session,Model model,@RequestParam String code)throws Exception{
logger.info("naverLogin");
SnsValue sns = naverSns;
SNSLogin snsLogin = new SNSLogin(sns);
MemberVO snsUser = snsLogin.getUserProfile(code);
logger.info("Profile="+snsUser.getNaverid());
if(memberService.snsLoginCheck(snsUser.getNaverid()) == 0) {
memberService.snsRegister(snsUser.getNaverid(), snsUser.getNickname(), snsUser.getEmail());
}
MemberVO memberVO = memberService.snsLogin(snsUser.getNaverid());
session.setAttribute("login", memberVO);
return "redirect:/board/list";
}
snsLogin 에서 UserProfile로 네이버 유저 값을 받아왓는데,
해당값을 회원VO로 받아서
만약 id값 (회원PR) 이 없다면 ,
자체적으로 구현한 커뮤니티 회원가입 로직에 네이버 유저데이터를 이용해서 회원가입되도록 한다.
id값이 있다면 네이버에서 받은 id값으로 세션값을 select해서 Session에 set시켜, 로그인을 시켜준다.
결국 네이버에서 받아온 값으로 내가 구현한 프로젝트의 회원가입, 로그인 로직에 그대로 적용시켜주기만 하면 된다.
데이터를 받는 부분이 조금 복잡했을 뿐, 데이터를 받아왔다면 log로 확인하며 필요한 것을, 사용하게 만들어주면 된다.
생각보다 간단했다.
로그인 뷰
<a href="${naver_url}" class="btn btn-facebook btn-user btn-block">
Login with Naver
</a>
결과
1. 로그인 화면 네이버 로그인 클릭.
2. 네이버 로그인 사이트로 이동, 아이디 입력.
3. 정상적으로 로그인 되었음.
'SPRING > IceWater Community' 카테고리의 다른 글
IceWater 커뮤니티 프로젝트 마무리 (5) | 2021.10.24 |
---|---|
[스프링] 커뮤니티 관리자 페이지 (0) | 2021.10.24 |
[스프링] 커뮤니티 알림목록 (0) | 2021.10.24 |
[스프링] 커뮤니티 실시간 푸시알림 - 웹소켓 (1) | 2021.10.24 |
[스프링] 메인페이지,인기글 구현 (블라인드 참고) (0) | 2021.10.17 |