2012-03-05 16 views
39

का उपयोग करके जीएई पर फेसबुक अकाउंट के साथ लॉगिन कैसे करें, मैंने बहुत सारे ब्लॉग, लेख, ट्यूटोरियल पढ़े, लेकिन अब तक एक कामकाजी उदाहरण नहीं मिला है कि मैं अपने आवेदन में लॉग इन करने के लिए फेस बुक अकाउंट का उपयोग कर सकता हूं।जावा उदाहरण ओएथ

मैं जानता हूँ कि मैं OAuth का उपयोग करने के लिए है कि, हो टोकन, autorizations, आदि ...

कोई भी एक उदाहरण साझा कर सकते हैं? (GAE/JAVA पर)

उत्तर

52

यहाँ कैसे मैं अनुप्रयोग इंजन पर यह करना है:

चरण 1) फेसबुक पर एक "एप्लिकेशन" रजिस्टर (सीएफ https://developers.facebook.com/) । आप फेसबुक को ऐप और यूआरएल के लिए एक नाम देते हैं। आपके द्वारा पंजीकृत यूआरएल पृष्ठ (jsp या servlet) का यूआरएल है जिसे आप लॉगिन को संभालना चाहते हैं। पंजीकरण से आपको दो तार मिलते हैं, एक "ऐप आईडी" और "ऐप गुप्त" (बाद वाला आपका पासवर्ड होता है, इसे न दें या इसे HTML में लिखें)।

इस उदाहरण के लिए, मान लें कि मैं पंजीकृत यूआरएल "http://myappengineappid.appspot.com/signin_fb.do" है।

2) किसी वेबपृष्ठ से, बटन के साथ कहें, आप उपयोगकर्ता को नीचे दिए गए उदाहरण में "myfacebookappid" के लिए अपनी ऐप आईडी को प्रतिस्थापित करने के लिए फेसबुक पर निम्नलिखित यूआरएल पर रीडायरेक्ट करते हैं। आपको यह भी चुनना होगा कि कौन सी अनुमतियां (या "स्कॉप्स") आप उपयोगकर्ता से पूछना चाहते हैं (सीएफ https://developers.facebook.com/docs/reference/api/permissions/)। उदाहरण में मैं केवल उपयोगकर्ता के ईमेल तक पहुंच के लिए पूछता हूं।

(यह जानने के लिए एक उपयोगी बात यह है कि आप एक वैकल्पिक स्ट्रिंग के साथ भी पास कर सकते हैं जिसे "राज्य" पैरामीटर में अपरिवर्तित किया जाएगा। उदाहरण के लिए, मैं उपयोगकर्ता की डेटास्टोर कुंजी पास करता हूं, इसलिए मैं उपयोगकर्ता को पुनर्प्राप्त कर सकता हूं । कुंजी मेरे पास वापस गुजरता मैं उदाहरण में ऐसा नहीं करते हैं)

यहाँ है एक jsp टुकड़ा:।

<%@page import="java.net.URLEncoder" %> 
<% 
    String fbURL = "http://www.facebook.com/dialog/oauth?client_id=myfacebookappid&redirect_uri=" + URLEncoder.encode("http://myappengineappid.appspot.com/signin_fb.do") + "&scope=email"; 
%> 

<a href="<%= fbURL %>"><img src="/img/facebook.png" border="0" /></a> 

3) आपका उपयोगकर्ता फेसबुक को भेजा जाएगा, और अनुमतियों को स्वीकार करने के लिए कहा आप मांगते हैं। फिर, उपयोगकर्ता को आपके द्वारा पंजीकृत यूआरएल पर रीडायरेक्ट कर दिया जाएगा। इस उदाहरण में, इस "http://myappengineappid.appspot.com/signin_fb.do" है मेरी web.xml में निम्नलिखित सर्वलेट को नक्शे जो:

import org.json.JSONObject; 
import org.json.JSONException; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.IOException; 

import java.net.URL; 
import java.net.URLConnection; 
import java.net.URLEncoder; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class SignInFB extends HttpServlet { 

    public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {    
     String code = req.getParameter("code"); 
     if (code == null || code.equals("")) { 
      // an error occurred, handle this 
     } 

     String token = null; 
     try { 
      String g = "https://graph.facebook.com/oauth/access_token?client_id=myfacebookappid&redirect_uri=" + URLEncoder.encode("http://myappengineappid.appspot.com/signin_fb.do", "UTF-8") + "&client_secret=myfacebookappsecret&code=" + code; 
      URL u = new URL(g); 
      URLConnection c = u.openConnection(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream())); 
      String inputLine; 
      StringBuffer b = new StringBuffer(); 
      while ((inputLine = in.readLine()) != null) 
       b.append(inputLine + "\n");    
      in.close(); 
      token = b.toString(); 
      if (token.startsWith("{")) 
       throw new Exception("error on requesting token: " + token + " with code: " + code); 
     } catch (Exception e) { 
       // an error occurred, handle this 
     } 

     String graph = null; 
     try { 
      String g = "https://graph.facebook.com/me?" + token; 
      URL u = new URL(g); 
      URLConnection c = u.openConnection(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream())); 
      String inputLine; 
      StringBuffer b = new StringBuffer(); 
      while ((inputLine = in.readLine()) != null) 
       b.append(inputLine + "\n");    
      in.close(); 
      graph = b.toString(); 
     } catch (Exception e) { 
       // an error occurred, handle this 
     } 

     String facebookId; 
     String firstName; 
     String middleNames; 
     String lastName; 
     String email; 
     Gender gender; 
     try { 
      JSONObject json = new JSONObject(graph); 
      facebookId = json.getString("id"); 
      firstName = json.getString("first_name"); 
      if (json.has("middle_name")) 
       middleNames = json.getString("middle_name"); 
      else 
       middleNames = null; 
      if (middleNames != null && middleNames.equals("")) 
       middleNames = null; 
      lastName = json.getString("last_name"); 
      email = json.getString("email"); 
      if (json.has("gender")) { 
       String g = json.getString("gender"); 
       if (g.equalsIgnoreCase("female")) 
        gender = Gender.FEMALE; 
       else if (g.equalsIgnoreCase("male")) 
        gender = Gender.MALE; 
       else 
        gender = Gender.UNKNOWN; 
      } else { 
       gender = Gender.UNKNOWN; 
      } 
     } catch (JSONException e) { 
      // an error occurred, handle this 
     } 

     ... 

मैं त्रुटि हैंडलिंग कोड को हटा दिया है, जैसा कि आप इसे दूसरे तरीके से संभालने के लिए की तुलना में मुझे क्या करना चाहते हो सकता है। (इसके अलावा, "लिंग" निश्चित रूप से एक वर्ग है जिसे मैंने परिभाषित किया है।) इस बिंदु पर, आप जो कुछ भी चाहते हैं, उसके लिए डेटा का उपयोग कर सकते हैं, जैसे कोई नया उपयोगकर्ता पंजीकृत करना या मौजूदा उपयोगकर्ता को लॉग इन करना चाहते हैं। ध्यान दें कि " myfacebookappsecret "स्ट्रिंग निश्चित रूप से फेसबुक से आपका ऐप रहस्य होना चाहिए।

आपको "संगठन" की आवश्यकता होगी।जेसन "पैकेज को इस कोड का उपयोग करने के लिए, जिसे आप यहां देख सकते हैं: http://json.org/java/ (बस .java फाइलें लें और उन्हें अपने कोड में एक ऑर्ग/जेसन फ़ोल्डर संरचना में जोड़ें)

मुझे उम्मीद है कि इससे मदद मिलती है। अगर कुछ अस्पष्ट है , कृपया, टिप्पणी करते हैं, और मैं जवाब अपडेट करेगा

पूर्व animo -।। अलेक्जेंडर

**** अद्यतन ****

मैं जानकारी के कुछ छोटी-मोटी बातें जोड़ना चाहते हैं, मेरी क्षमा करें अगर इनमें से कुछ थोड़ा अधिक लगता है।

किसी उपयोगकर्ता को अपने फेसबुक खाते से लॉग इन करने में सक्षम होने के लिए, आपको यह जानना होगा कि डेटास्टोर में कौन सा उपयोगकर्ता हम बात कर रहे हैं। यदि यह एक नया उपयोगकर्ता है, तो आसान है, एक नया उपयोगकर्ता ऑब्जेक्ट बनाएं ("facebookId" नामक फ़ील्ड के साथ, या जिसे आप इसे कॉल करना चाहते हैं, जिसका मूल्य आपको फेसबुक से मिलता है), इसे डेटास्टोर में जारी रखें और उपयोगकर्ता को लॉग इन करें।

यदि उपयोगकर्ता मौजूद है, तो आपको फेसबुक आईडी के साथ फ़ील्ड होना चाहिए। जब उपयोगकर्ता को फेसबुक से रीडायरेक्ट किया जाता है, तो आप facebookId को पकड़ सकते हैं, और उस उपयोगकर्ता को ढूंढने के लिए डेटास्टोर में देख सकते हैं, जिसमें आप लॉग इन करना चाहते हैं।

यदि आपके पास पहले से उपयोगकर्ता हैं, तो आपको उन्हें अपने तरीके से लॉग इन करने की आवश्यकता होगी आम तौर पर करते हैं, इसलिए आप जानते हैं कि वे कौन हैं, फिर उन्हें फेसबुक पर भेजें, फेसबुक प्राप्त करें और अपने उपयोगकर्ता ऑब्जेक्ट को अपडेट करें। इस तरह, वे अगली बार फेसबुक का उपयोग कर लॉग इन कर सकते हैं।

एक और छोटी ध्यान दें: उपयोगकर्ता फेसबुक जो कुछ भी दायरों में से किसी के लिए पूछने के लिए अपने अनुप्रयोग एक्सेस करने के लिए पूछ पर एक स्क्रीन के साथ प्रस्तुत किया जाएगा, वहाँ इस (कम दायरों में से किसी के लिए पूछने के आसपास कोई रास्ता नहीं है, कम दखल ऐसा लगता है , हालांकि)। हालांकि, यह पहली बार होता है जब उपयोगकर्ता को रीडायरेक्ट किया जाता है (जब तक आप बाद में अधिक स्कॉप्स नहीं मांगते, तब यह फिर से पूछेगा)।

+0

मैं आपको यह सत्यापित करने के लिए 'sign_request' प्रॉपर्टी को सत्यापित नहीं करता हूं कि उपयोगकर्ता/अनुरोध वास्तव में मान्य है या नहीं, लेकिन इसके अलावा, वे वास्तव में किए जाने वाले कदम हैं ... – Marcelo

+0

अलेक्जेंडर, इस कोड के साथ, यदि उपयोगकर्ता फेसबुक में लॉग इन किया गया था, और मेरा जीएई खोलता है, यह फेसबुक अकाउंट को ऑटो-चेक करेगा? या उपयोगकर्ता को हमेशा "प्रमाणीकरण" पर कहीं क्लिक करने की आवश्यकता होगी? – LeandroRezende

+2

आप इस कोड के साथ दो चीजें कर सकते हैं। (1) नए उपयोगकर्ताओं को "फेसबुक के साथ साइन अप करें" पर क्लिक करने की अनुमति दें और (2) मौजूदा उपयोगकर्ताओं को "अपने फेसबुक खाते से लॉग इन करें" पर क्लिक करके लॉग इन करने दें। वे दोनों एक ही लिंक पर क्लिक कर सकते हैं, और जब उपरोक्त सर्वलेट चलाया जाता है, तो आप डेटाबेस की जांच कर सकते हैं और देख सकते हैं कि आपके पास इस फेसबुक आईडी के साथ एक पंजीकृत उपयोगकर्ता है या नहीं। यदि ऐसा है, तो आप उस उपयोगकर्ता को लॉग इन कर सकते हैं। यदि नहीं, तो आप एक नया उपयोगकर्ता बना सकते हैं, और facebookId स्टोर कर सकते हैं। हां, यदि उपयोगकर्ता फेसबुक में लॉग इन है और किसी भी अनुमति को मंजूरी दे दी है, तो यह कोड व्यक्ति को कहीं भी क्लिक किए बिना लॉग इन करेगा। – yngling

0

फेसबुक के जावा एपीआई देखें।

अन्य उदाहरण: http://code.google.com/p/facebook-java-api/wiki/Examples

+0

मैं नहीं करता मान लें कि फेसबुक-जावा-एपीआई 3.0.4 एफबी प्रमाणीकरण के लिए नवीनतम दस्तावेज के साथ चालू है। इसके बजाय, मैंने स्वीकृत उत्तर में चरणों का पालन किया और फिर restfb ढांचे का उपयोग किया। –

+0

@s_t_e_v_e मैं आश्चर्यचकित नहीं हूं; एफबी अक्सर अपने एपीआई को बदलता है कि मॉडल कपड़े बदलते हैं;) आपको एक समाधान मिला है सुनकर खुशी हुई :) – Adrian

+0

यह शपथ नहीं है – NimChimpsky

6

आप face4j https://github.com/nischal/face4j/wiki कोशिश कर सकते हैं। हमने इसे अपने उत्पाद http://grabinbox.com पर उपयोग किया है और इसे किसी भी व्यक्ति के उपयोग के लिए खोल दिया है। यह जीएई पर अच्छा काम करता है।

विकी पर एक उदाहरण है जो आपको कुछ मिनटों में फेसबुक के साथ लॉगिन एकीकृत करने में मदद कर सकता है।

face4j oAuth 2.0 और फेसबुक ग्राफ API का उपयोग करता है।

+0

ट्विटर के साथ face4j काम करता है? – Jus12

+0

@ जुस 12 ने इसे face4j के लिए नहीं कहा twitter4j। तो मुझे नहीं लगता। – NimChimpsky

3

ओएथ साइनिंग को लागू करने की कोशिश करते समय मुझे बहुत कठिनाई हुई। मैंने अपने टोकन के साथ वास्तव में अधिकृत नहीं होने के साथ किसी समस्या को डीबग करने का प्रयास करने में काफी समय बिताया - एक आम समस्या जाहिर है। दुर्भाग्यवश, मेरे लिए कोई भी समाधान काम नहीं करता था, इसलिए मैंने केवल Scribe का उपयोग किया, जो एक निफ्टी जावा ओथ लाइब्रेरी है जिसमें फेसबुक के लिए अन्य प्रदाताओं का समर्थन करने का अतिरिक्त लाभ है (जैसे Google, ट्विटर, आदि)

संबंधित मुद्दे