2010-07-28 17 views
30

मैं एक webservice बना रहा हूं और उपयोगकर्ता के Google खाता प्रमाण-पत्रों का उपयोग करना चाहता हूं।वेबसाइट सेवा प्रमाण-पत्र - ओपनआईडी/एंड्रॉइड खाता प्रबंधक?

सेवा जीएई पर चलती है और एक वेब क्लाइंट और एक एंड्रॉइड मूल ग्राहक होगा।

यह ऐसा कुछ मेरा पहला प्रयास है और मैं ओपनआईडी और एंड्रॉइड खाता प्रबंधक पुस्तकालय के बारे में पढ़ रहा हूं।

मुझे अभी भी यकीन नहीं है कि मेरे डेटास्टोर में उपयोगकर्ताओं को संग्रहीत करने के मामले में मेरे विकल्प क्या हैं। मुझे किस पहचानकर्ता का उपयोग करना चाहिए? क्या मूल एंड्रॉइड एप्लिकेशन पर ओपनआईडी का उपयोग करना संभव है?

कोई भी मदद और/या पॉइंटर्स की सराहना की जाएगी। धन्यवाद।

उत्तर

30

हम पिछले परियोजना पर एक समान आवश्यकताओं था: GWT दृश्यपटल और Android के साथ GAE बैकएंड/आईफोन क्लाइंट्स। इसके अलावा, हम उपयोगकर्ता प्रमाण-पत्रों को स्टोर नहीं करना चाहते थे।

तो हम ओपनआईडी का उपयोग करना चुनते हैं, जो दुर्भाग्य से एक वेब मानक है और मोबाइल उपकरणों के साथ अच्छा नहीं खेलता है, लेकिन यह करने योग्य है।

जीएई पक्ष पर हमने बस संघीय लॉगिन सक्षम किया जिसने हमें ओपनआईडी दिया।

मोबाइल उपकरणों पर, जब उपयोगकर्ता को लॉगिन करने की आवश्यकता होती है तो हम उन्हें ओपनआईडी प्रमाणीकरणकर्ताओं (Google, याहू, आदि ..) में एक सूची ओप प्रस्तुत करते हैं। फिर हम एक मूल ब्राउज़र (एम्बेडेड ब्राउज़र नहीं) खोलते हैं और सीधे उपयोगकर्ता को ओपनआईडी प्रमाणीकरण साइट चुनने के लिए खोलते हैं। उलझन यह है कि उपयोगकर्ता के ब्राउज़र में आमतौर पर उपयोगकर्ता नाम/पास याद किया जाता है, इसलिए इस चरण के लिए उपयोगकर्ता को एक बटन दबाए जाने की आवश्यकता होती है।

यह सब बहुत सरल है। अब यहां मुश्किल हिस्सा है: उपयोगकर्ता लॉगिन की पुष्टि करने के बाद, ओपनआईडी हमारे जीएई रिटर्न यूआरएल पर रीडायरेक्ट करता है (अनुरोध होने पर आपको यह यूआरएल प्रदान करने की आवश्यकता है)। इस यूआरएल पर हम एक कस्टम URL बना, उदाहरण के लिए:

yourappname://usrname#XXXYYYZZZ 

जहां XXXYYYZZZZ प्रमाणीकरण टोकन है। हमें रिटर्न पेज से यह टोकन मिलता है जहां इसे एसीएसआईडी कुकी के रूप में संग्रहीत किया जाता है: हमने इस कुकी को पढ़ने और इसे ऊपर के कस्टम यूआरएल में लपेटने के लिए कुछ जेएसपी का इस्तेमाल किया।

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

यदि आपके कोई और प्रश्न हैं तो मैं खुशी से इस पोस्ट को अपडेट करूंगा।

अद्यतन:

उत्पादन AppEngine पर उपयोगकर्ता सत्र कुकी ACSID नाम पर है, जबकि विकास AppEngine सर्वर पर dev_appserver_login नामित है।

+0

+1 - बहुत विस्तृत! कस्टम यूआरएल पाठ क्या दिखाता है? "एप्लिकेशन पर वापस जाने के लिए इसे क्लिक करें"? या कुछ इस तरह का? –

+0

यह आपको जो भी पसंद है दिखा सकता है। मैंने "जारी रखें .." लिंक का उपयोग किया जो एक बटन जैसा दिखता है। कुछ जावास्क्रिप्ट के साथ आप संभवतः ऐप को लॉन्च कर सकते हैं, उपयोगकर्ता को लिंक पर क्लिक करने की आवश्यकता के बिना - यह कोशिश नहीं की, इसे परीक्षण करने की आवश्यकता होगी। –

0

http://developer.android.com/search.html#q=AccountManager&t=0

http://developer.android.com/resources/samples/SampleSyncAdapter/index.html इस पृष्ठ के तल पर आप सभी की जरूरत कोड मिलेगा

सादर

+0

लिंक किया गया उदाहरण OpenID या Xauth का उपयोग नहीं करता है, इसलिए इसका उपयोग मौजूदा Google खातों के विरुद्ध प्रमाणित करने के लिए GAE पर नहीं किया जा सकता है। जैसा कि मैं देख सकता हूं कि यह अपनी खुद की प्रमाणीकरण योजना का उपयोग करता है: उपयोगकर्ता नाम/पासवर्ड के साथ हेडर पैरामीटर के रूप में सरल पोस्ट। –

+0

हालांकि @peterKnego की दूसरी सिफारिश के बारे में एक बिंदु है, पहला लिंक वास्तव में काफी उपयोगी है। लेकिन मैं इस बात से सहमत हूं कि एक उचित उत्तर, एफएमओ बनाने में अधिक ध्यान देना चाहिए। लेकिन सावधान रहें कि भविष्य में कमजोर न हो जाएं। –

12

मैंने वेब ब्राउज़र के बिना और एंड्रॉइड खाता प्रबंधक का उपयोग करके एक उपयुक्त और आधुनिक दिखने का तरीका खोजने के लिए लगभग एक सप्ताह बिताया।

आप Google खाते और खाता प्रबंधक का उपयोग करने के उपयोगकर्ता आप कर सकते हैं की पहचान करना चाहते हैं:

  1. पृष्ठभूमि धागे पर Google संपर्क (प्रमाणीकरण टोकन प्रकार "cp" है) खाता प्रबंधक के माध्यम से करने के लिए अपने टोकन प्राप्त करें :

    public String getUserToken(Activity activity) 
    { 
        AccountManager accountManager = AccountManager.get(activity); 
        AccountManagerFuture<Bundle> amf = accountManager.getAuthTokenByFeatures("com.google", "cp", null, activity, Bundle.EMPTY, Bundle.EMPTY, null, null); 
    
        Bundle bundle = null; 
        try { 
         bundle = amf.getResult(); 
         String name = (String) bundle.get(AccountManager.KEY_ACCOUNT_NAME); 
         String type = (String) bundle.get(AccountManager.KEY_ACCOUNT_TYPE); 
         String token = bundle.getString(AccountManager.KEY_AUTHTOKEN); 
         return token; 
        } catch (OperationCanceledException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } catch (AuthenticatorException e) { 
         e.printStackTrace(); 
        } 
        return null; 
    } 
    
  2. पास सुरक्षित चैनल पर सर्वर से UserToken प्राप्त किया।

  3. मान्य GData पुस्तकालय (Google Data API library) का उपयोग कर गूगल द्वारा सर्वर पर टोकन:

    public String getUserId(String token) 
    { 
        ContactsService contactsService = new ContactsService("Taxi"); 
        contactsService.setUserToken(token); 
    
        IFeed feed = null; 
        try { 
         feed = contactsService.getFeed(new URL("https://www.google.com/m8/feeds/contacts/default/full?max-results=10000"), ContactFeed.class); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } catch (ServiceException e) { 
         e.printStackTrace(); 
        } catch (NullPointerException e) { 
         e.printStackTrace(); 
        } 
    
        if (feed == null) 
         return null; 
    
        String externalId = feed.getId(); 
        IPerson person = feed.getAuthors().get(0); 
        String email = person.getEmail(); 
        String name = person.getName(); 
        String nameLang = person.getNameLang(); 
    
        return externalId; 
    } 
    
  4. गूगल टोकन की समय सीमा समाप्त कर सकते हैं (आमतौर पर एक घंटे के बाद), इसलिए यदि आप सर्वर पर टोकन सत्यापन में विफल रहा , आपको क्लाइंट को प्रतिक्रिया वापस भेजनी होगी, टोकन को अमान्य कर देना होगा और एक नया प्राप्त करना होगा। टोकन रद्द करने के लिए खाता प्रबंधक का उपयोग करें:

    public void invalidateUserToken(Context context, String token) 
    { 
        AccountManager accountManager = AccountManager.get(context); 
        accountManager.invalidateAuthToken("com.google", token); 
    } 
    
+0

जीमेल पर और फेसबुक के लिए ईमेल संदेशों के लिए ऐसा करना संभव है (उपयोग करने के लिए टोकन प्राप्त करें)? यदि हां, तो क्या आप इसे अगले पोस्ट पर उत्तर दे सकते हैं: http://stackoverflow.com/questions/11532257/use-syncadapter-to-sync-with-local-gmail-and-facebook-app-data –

+0

लेकिन वह नहीं करता समस्या को हल नहीं करते क्योंकि वह उपयोगकर्ता को अपने स्वयं के webservice पर डेटाबेस के साथ प्रमाणीकृत करना चाहता है, इसलिए यदि वह अपने webservice पर प्रमाणित करना चाहता है तो उसे टोकन और उसकी Google आईडी को webservice पर भेजना चाहिए और webservice को टोकन भेजना चाहिए Google सर्वर पर जो Google आईडी के साथ प्रतिक्रिया वापस भेजता है जिसे आप Google आईडी के साथ तुलना कर सकते हैं, क्या यह सही नहीं है? आप कैसे करते हो ? – Karly

+1

मैंने इस समाधान का परीक्षण किया और यह बहुत अच्छा काम करता है अगर आपको अपने उपयोगकर्ता से प्रमाणित ईमेल की आवश्यकता है। उल्टा यह है कि आप बिना किसी वेब ब्राउज़र के अपने ऐप में सबकुछ कर सकते हैं। नकारात्मकता यह है कि आपको उपयोगकर्ता के संपर्कों को संपादित करने की अनुमति मांगनी है, जो कुछ करने में संकोच कर सकते हैं। क्या किसी को _authorization_ के लिए पूछे बिना _just_ प्रमाणीकरण के लिए पूछने का तरीका पता है? – thomas88wp

3

मुझे लगता है कि this ब्लॉग पोस्ट आप अपनी ज़रुरत है। यह मेरे लिए काम किया। यहां पोस्ट किए गए दोनों समाधान व्यवहार्य और चालाक हैं, लेकिन मुझे लगता है कि यह वही करता है जो पूछताछकर्ता पूछ रहा था।

अनिवार्य रूप से, आप केवल "आह" स्कोप का उपयोग करके एक ऑथोकन प्राप्त कर रहे हैं, और एसीएसआईडी कुकी प्राप्त करने के लिए इसे सही वेबपृष्ठ पर पास कर रहे हैं जो आपको किसी भी ऐपइंजिन पेज तक पहुंचने देगा जो प्रमाणीकरण के लिए UserService का उपयोग करता है।

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