관리 메뉴

IT.FARMER

facebook platform login/ 정보 연동 (java/jsp) 본문

Spring

facebook platform login/ 정보 연동 (java/jsp)

아이티.파머 2013. 12. 10. 16:48
반응형

최근 웹 어플리케이션을 사용하다보면, 새로운 앱들에 로그인 해야할때가 있는데 

그때마다 정보를 입력하고 가입을 해야하니 불편할때가 꽤 있었다.


간혹 페이스북 플랫폼안에 연동된 정보를 바탕으로 회원가입을 간편하게 해주는 웹앱들이 있어

언젠간 우리도 이렇게 사용(?)하지 않을까


준비사항

재료가 필요하다. 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 정리할땐 이거보다 간결하게 적어야겠네요..



반응형