2017-01-11 7 views
12

मुझे लगता है कि मेरे अपने REST API सर्वर से डेटा की खपत एक Android ऐप्लिकेशन के विकास कर रहा हूँ। मैं फायरबेस प्रमाणीकरण का उपयोग करना चाहता हूं क्योंकि यह उपयोगकर्ता को Google, फेसबुक, ट्विटर ... का उपयोग करके बहुत ही सरल तरीके से लॉगिन करने की अनुमति देता है।Android ऐप्लिकेशन पर आईडी टोकन प्राप्त करें और बैकएंड सर्वर पर सत्यापित करें (आईडी टोकन का उपयोग कैसे करें?)

लेकिन मैं कैसे आईडी टोकन का उपयोग करने के लिए यकीन नहीं है:

  • क्योंकि आईडी टोकन समाप्ति तिथि होती है, मैं ग्राहक अनुप्रयोग में हर अनुरोध पर getToken विधि कॉल करना चाहिए, ताकि मुझे यकीन है कि मैं कर रहा हूँ कर रहा हूँ हर बार वैध टोकन भेजना?
  • क्या मुझे क्लाइंट ऐप से अनुरोध प्राप्त होने पर सर्वर में IDToken सत्यापित करना चाहिए?

मुझे नहीं पता कि इन विधियों (getToken और सत्यापितIdToken) हुड के नीचे क्या करते हैं, और क्योंकि वे असीमित हैं, मुझे डर है कि वे प्रत्येक कॉल पर फायरबेस सर्वर के लिए अनुरोध कर रहे हैं। तो मुझे लगता है कि मेरे अनुरोध में से प्रत्येक में सर्वर firebase करने के लिए 2 अनुरोध कर जाने का रास्ता नहीं है ... आपके आवेदन वर्ग और Regid में कोड नीचे

उत्तर

10

दोनों getToken() और VerifyIdToken() तैयार कर रहे हैं कि हर निवर्तमान/आने वाली अनुरोध के लिए कहा जा करने के लिए इस एपीआई की जाँच करें।

1) हालांकि GetToken() असीमित है, फ़ायरबेस एंड्रॉइड एसडीके वास्तव में स्थानीय स्टोरेज में वर्तमान फायरबेस उपयोगकर्ता टोकन को कैश करता है। जब तक कैश किए गए टोकन अभी भी वैध हैं (यानी जारी होने के बाद एक घंटे के भीतर), getToken() तुरंत टोकन देता है। केवल जब कैश किए गए टोकन की समयसीमा समाप्त हो जाती है तो एसडीके रिमोट फायरबेस सर्वर से एक नया टोकन लाता है।

2) VerifyIdToken() प्रदर्शन के लिए भी अनुकूलित किया गया है। यह फायरबेस फोकन सार्वजनिक प्रमाण (6 घंटे के लिए मान्य) को कैश करता है जिसका उपयोग स्थानीय मशीन पर टोकन हस्ताक्षर को सत्यापित करने के लिए किया जाता है। सार्वजनिक प्रमाणपत्र डाउनलोड करने के अलावा कोई आरपीसी शामिल नहीं है।

+0

बस एक नोट जो getToken() को अब हटा दिया गया है और आपको getIdToken() – TheeBen

+1

का उपयोग करना चाहिए 'OKHttp.Intercept' में यह कोड वास्तव में बदसूरत दिखता है। –

-1

उपयोग अपने डिवाइस टोकन के लिए मूल्य धारक है।

private void checkPlayService() { 
    // Check device for Play Services APK. If check succeeds, proceed with 
    // GCM registration. 
    if (checkPlayServices()) { 
    GoogleCloudMessaging googleCloudMessaging = GoogleCloudMessaging.getInstance(activity); 
     regId = getRegistrationId(); 

     if (TextUtils.isEmpty(regId)) { 
      registerInBackground(); 
     } 
    } else { 
     Log.i(TAG, "No valid Google Play Services APK found."); 
    } 
} 

private String getRegistrationId() { 
    String registrationId = sp.getString(Consts.PROPERTY_REG_ID, ""); 
    if (TextUtils.isEmpty(registrationId)) { 
     Log.i(TAG, "Registration not found."); 
     return ""; 
    } 
    // Check if app was updated; if so, it must clear the registration ID 
    // since the existing regID is not guaranteed to work with the new 
    // app version. 
    int registeredVersion = sp.getInt(PROPERTY_APP_VERSION,0); 
    int currentVersion = getAppVersion(); 
    if (registeredVersion != currentVersion) { 
     Log.i(TAG, "App version changed."); 
     return ""; 
    } 
    return registrationId; 
} 

private void registerInBackground() { 
    new AsyncTask<Void, Void, String>() { 
     @Override 
     protected String doInBackground(Void... params) { 
      String msg = ""; 
      try { 
       if (googleCloudMessaging == null) { 
        googleCloudMessaging = GoogleCloudMessaging.getInstance(activity); 
       } 

       regId = googleCloudMessaging.register(Consts.PROJECT_NUMBER); 
       msg = "Device registered, registration ID=" + regId; 
       Log.e("GCMID",msg); 
       storeRegistrationId(regId); 

      } catch (IOException ex) { 
       msg = "Error :" + ex.getMessage(); 
      } 
      return msg; 
     } 

     @Override 
     protected void onPostExecute(String msg) { 
      Log.i(TAG, msg + "\n"); 
     } 
    }.execute(null, null, null); 
} 



private void storeRegistrationId(String regId) { 
    int appVersion = getAppVersion(); 
    Log.i(TAG, "Saving regId on app version " + appVersion); 
    sp.edit().putString(Consts.PROPERTY_REG_ID, regId).commit(); 
    sp.edit().putInt(PROPERTY_APP_VERSION, appVersion).commit(); 
} 
+0

धन्यवाद। लेकिन यह वह नहीं है जिसे मैं पूछ रहा हूं। आप जीसीएम सर्वर के साथ एक डिवाइस पंजीकृत करने के बारे में बात कर रहे हैं। मैं फायरबेस एथ आईडी टोकन का उपयोग करने के बारे में पूछ रहा हूं। –

+0

ओह मुझे यह गलत मिला ... मेरे जवाब के लिए खेद है। –

7

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

+0

आपके उत्तर के लिए धन्यवाद। आपने मेरे संदेहों को मंजूरी दे दी है। –

1

प्रश्न में जो आपने समझाया है, मुझे लगता है कि आप क्रॉस क्लाइंट के बारे में बात कर रहे हैं Google साइन इन का उपयोग करके संसाधन पहुंच। और विशेष रूप से आप एक बार आईडी टोकन प्राप्त करने में रुचि रखते हैं और प्रत्येक आगामी API कॉल पर प्राप्त किए बिना इसका उपयोग करते हैं।

यह कम या ज्यादा ऑफ़लाइन पहुँच तंत्र का पर्याय है। ऑफ़लाइन पहुंच में, क्लाइंट Ie. एंड्रॉइड ऐप अनुरोधित क्षेत्रों के लिए उपयोगकर्ता प्राधिकरण के लिए पूछता है। प्रमाणीकरण पर, एक्सेस टोकन जारी करने के बजाय, ऑथ सर्वर एक अल्पकालिक प्राधिकरण कोड देता है जिसका उपयोग टोकन एक्सेस और टोकन रीफ्रेश करने के लिए किया जा सकता है।

क्लाइंट फिर सुरक्षित कनेक्शन पर बैकएंड को प्राधिकरण कोड पास कर सकता है। बैकएंड सर्वर लेखक टोकन पुनर्प्राप्त कर सकता है और टोकन रीफ्रेश कर सकता है और उन्हें एक सुरक्षित स्थान पर संग्रहीत कर सकता है। एक्सेस टोकन कम रहता है और इसका उपयोग थोड़े समय के लिए स्कोप्ड संसाधनों तक पहुंचने के लिए किया जा सकता है और रीफ्रेश टोकन का उपयोग करके समय-समय पर ताज़ा किया जा सकता है। रीफ्रेश टोकन की समयसीमा समाप्त नहीं होती है लेकिन इसे निरस्त किया जा सकता है। अगर निरस्त किया गया है, तो सर्वर ऐप को क्लाइंट ऐप से लेखक कोड को फिर से लाने के लिए पूछना चाहिए।

कृपया इस लिंक जो चरणों के साथ पूरा बुनियादी सुविधाओं के विवरण के माध्यम से जाना दोनों क्लाइंट और सर्वर अनुप्रयोग द्वारा अपनाई जाने वाली - https://developers.google.com/identity/protocols/CrossClientAuth

अब आप अपने प्रश्न के लिए आ रहा है, तो आप प्राप्त करने के लिए एक अलग एपीआई का उपयोग करना चाहिए प्रमाणीकरण कोड। पर https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInOptions.Builder.html#requestServerAuthCode(java.lang.String)

नमूना कोड - - https://developers.google.com/identity/sign-in/android/offline-access

2
POST https://YOUR_AUTH0_DOMAIN/delegation 
Content-Type: 'application/json' 
{ 
    "client_id":  "YOUR_CLIENT_ID", 
    "grant_type":  "urn:ietf:params:oauth:grant-type:jwt-bearer", 
    "refresh_token": "your_refresh_token", 
    "api_type":  "app" 
} 
संबंधित मुद्दे