facebook platform login/ 정보 연동 (java/jsp)
최근 웹 어플리케이션을 사용하다보면, 새로운 앱들에 로그인 해야할때가 있는데
그때마다 정보를 입력하고 가입을 해야하니 불편할때가 꽤 있었다.
간혹 페이스북 플랫폼안에 연동된 정보를 바탕으로 회원가입을 간편하게 해주는 웹앱들이 있어
언젠간 우리도 이렇게 사용(?)하지 않을까
준비사항
재료가 필요하다. maven을 사용한다고 가정하고 작성 하겠다.
* pom.xml
<spring-social.version>1.0.2.RELEASE</spring-social.version>
<org.springframework.social-facebook-version>1.0.2.RELEASE</org.springframework.social-facebook-version>
<dependency>
<groupId>org.springframework.social</groupId>
<artifactId>spring-social-core</artifactId>
<version>${spring-social.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.social</groupId>
<artifactId>spring-social-web</artifactId>
<version>${spring-social.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.social</groupId>
<artifactId>spring-social-facebook</artifactId>
<version>${org.springframework.social-facebook-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.social</groupId>
<artifactId>spring-social-facebook-web</artifactId>
<version>1.0.2.RELEASE</version>
</dependency>
위와 같이 필요한 라이브러리를 다운 받으면 사실상? facebook과 연동 하는 부분의 준비는 끝? 이다.
* facebook client : 인증 받는 클레스
이것저것 추가하다보니 생각보다 길어 졌다.
package com.sigongmedia.wbs.sbms.common.social.facebook;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.springframework.social.facebook.api.Facebook;
import org.springframework.social.facebook.api.FacebookLink;
import org.springframework.social.facebook.api.FacebookProfile;
import org.springframework.social.facebook.api.impl.FacebookTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.sigongmedia.wbs.sbms.common.log.SBMSLog;
/**
* <pre>
* Class Name : FacebookClinet.java.java
* Description :
* Modification Information
*
* 수정일 수정자 수정내용
* ──────────── ───────── ───────────────────────────────
* 2013. 4. 22. skan 최초생성
* </pre>
*
* @author skan
* @since 2013. 4. 22.
* @version
*
* Copyright (C) 2011 by SIGONGMEDIA All right reserved.
*/
@Controller
public class FacebookClinet extends SBMSLog implements FacebookClientImpl {
/**
* property 에서 불러 오는걸로 변경
*/
private final String APP_API_KEY = "본인키";
private final String APP_SECRET_KEY = "본인 스키릿 키";
private Facebook facebook;
/*public FacebookClinet(String accessToken) {
System.out.println("=======================FacebookClinet instance============================");
if(accessToken != null && !accessToken.equals("")) {
this.getFaceBookClientInstance(accessToken);
} else {
System.out.println("This class is no Instance Valiable..... Plaze check access token...");
}
}*/
@Override
public void getFaceBookClientInstance(String accessToken) {
try {
facebook = new FacebookTemplate(accessToken);
} catch (Exception e) {
System.out.println("facebook Instance Error ,, please again from the beginning OAuth certification...");
new ModelAndView("/social/facebookSignin.do");
}
}
@Override
public String facebookSignin() throws Exception {
// TODO Auto-generated method stub
return null;
}
@RequestMapping(value="/social/facebookSignin.do" , method = RequestMethod.GET)
@Override
public void facebookSignin(HttpServletResponse response) throws Exception {
StringBuffer urlsb = new StringBuffer();
String appKey = "167776370052745";
String appSecret = "4274eae17c514d025172283672f2da4b";
String url = "http://www.facebook.com/dialog/oauth?client_id="+
appKey+"&redirect_uri=http://skan.com/sbms/social/facebookAccessToken.do&scope=publish_stream,offline_access";
//urlsb.append("redirect:");
urlsb.append(url);
//return urlsb.toString();
System.out.println("rediresturl : " + urlsb.toString());
response.sendRedirect(urlsb.toString());
}
@Override
@RequestMapping(value="/social/facebookAccessToken.do")
public void getFacebookClientAccessToken(HttpServletRequest request , @RequestParam(value="message", defaultValue="" , required=false) String message, HttpServletResponse response) throws Exception {
String code = request.getParameter("code");
String errorReason = request.getParameter("error_reason");
String error = request.getParameter("error");
String errorDescription = request.getParameter("error_description");
String accesstoken = "";
String result = "";
System.out.println("code :: " +code);
/*URIBuilder uRIBuilder = URIBuilder.fromUri("");
URI uri = uRIBuilder.build();
uri.toString();
uri.toASCIIString();
uri.toURL();*/
String url = "https://graph.facebook.com/oauth/access_token"+
"?client_id="+APP_API_KEY+
"&client_secret="+APP_SECRET_KEY+
"&redirect_uri=http://skan.com/sbms/social/facebookAccessToken.do" +
"&code="+code;
HttpGet get = new HttpGet(url);
DefaultHttpClient http = new DefaultHttpClient();
result = http.execute(get, new BasicResponseHandler());
accesstoken = result.split("&")[0].replaceFirst("access_token=", "");
// accesstoken = result.split("&")[0].substring(result.split("&")[0].indexOf("=")+1);
// System.out.println("accesstoken1 : " + accesstoken1);
// System.out.println("accesstoken2 : " + accesstoken2);
// 저장
this.storeAccessToken(request , accesstoken);
// 페이스북 템플릿을 사용하기 위한 인스턴스 생성 Spring Social
// this.getFaceBookClientInstance(accesstoken);
// 글등록
this.ischoolAppfirstPosting(accesstoken , response);
// return "redirect"+url;
}
@Override
public void storeAccessToken(HttpServletRequest request,String accessToken) throws Exception {
// TODO Auto-generated method stub
request.getSession().setAttribute("SOCIAL_FACEBOOK_ACCESS_TOKEN", accessToken);
System.out.println("storeAccessToken :: " + accessToken);
}
@Override
@RequestMapping(value = "/social/facebook/posting")
public void posting(String message , String accessToken, HttpServletRequest request, HttpServletResponse response) throws Exception {
if(accessToken == null){
accessToken = (String) request.getSession().getAttribute("SOCIAL_FACEBOOK_ACCESS_TOKEN");
if (accessToken == null){
//throw new Exception("");
this.facebookSignin(response);
log.info("movement this.facebookSignin method....");
}
}
log.info("accessToken :: " + accessToken);
Facebook facebook = new FacebookTemplate(accessToken);
FacebookLink link = new FacebookLink("http://www.springsource.org/spring-social",
"Spring Social",
"The Spring Social Project",
"Spring Social is an extension to Spring to enable applications to connect with service providers.");
//facebook.feedOperations().updateStatus("Spring Social is an extension to Spring to enable applications to connect with service providers");
//facebook.feedOperations().updateStatus("App delete Test, API문서랑 달라요, 포스팅 메소드에 인자하나가 비어 있는데요. 어떻게 된거죠 http://static.springsource.org/spring-social-facebook/docs/1.0.x/reference/html/apis.html#facebook-status");
//facebook.feedOperations().postLink("post link", link);
facebook.feedOperations().postLink("I'm trying out Spring Social!", link);
}
@Override
public void ischoolAppfirstPosting(String accessToken, HttpServletResponse response) throws Exception {
Facebook facebook = new FacebookTemplate(accessToken);
FacebookProfile profile = facebook.userOperations().getUserProfile();
String myid = profile.getId();
String myname = profile.getName();
FacebookLink link = new FacebookLink("http://ischooldev.sigongmedia.com/sbms/user/editor/EditorPage.do",
"Spring Social",
"The Spring Social Project",
"Spring Social is an extension to Spring to enable applications to connect with service providers.");
facebook.feedOperations().postLink(myname + "님께서 ischool App을 사용 중입니다.", link);
//TODO :: resonse 에 javascript 삽입하여 창 닫기 .
}
@Override
public void posting(String message, FacebookLink link) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void posting(String message) throws Exception {
// TODO Auto-generated method stub
}
}
여기서 살펴보하야할 중요 메소드만 보자면
1. getFaceBookClientInstance : client 호출시 Facebook Class를 사용할 수 있는 FacebookTemplate 을 초기화 시켜준다
2. facebookSignin : 인증 과정
3. getFacebookClientAccessToken : 실제 접근시 사용할수 있는 티켓 번호, 앱에 접근하여 사용할수 있는 권한 등등
4. storeAccessToken : 인증 완료 후 접근할수 있는 토큰, 즉 인증 토큰을 저장해 두어 (DB 나 세션에 ) 꺼내서 사용한다. - 재로그인 필요 하지 않고 자동 로그인을 선택하여 상요할 경우 요긴하게 사용가능?
"/social/facebookSignin.do" 호출!!
나머지 매소드들은....포스용...
twitter 연동은 다음 포스트에서.. twitter 정리할땐 이거보다 간결하게 적어야겠네요..