2016-03-27 14 views
5

मेरा गेम Google Play गेम्स और फ़ायरबेस (रैंकिंग सिस्टम के लिए) का उपयोग कर रहा है, क्योंकि दुर्भाग्य से कोई Google लीडरबोर्ड में स्कोर को कम नहीं कर सकता है)।Google Play गेम्स, फायरबेस और नया Google साइन-इन

अतीत में मैं Firebase में साइन-इन करने के लिए Plus.AccountApi.getAccountName और दोस्तों के माध्यम से पदावनत तरह से इस्तेमाल किया ...

तो मैं नया गूगल में बदलने के लिए साइन-इन की कोशिश की, लेकिन जाहिरा तौर पर यह conjuction में नहीं किया जा सकता गूगल के साथ खेलते हैं खेल:

Auth.GOOGLE_SIGN_IN_API cannot be used with Games.API 

मेरा पूरा लक्ष्य था/गूगल + निर्भरता से छुटकारा पाने के लिए है (Google Play के रूप में खेल इसे अब और आवश्यकता नहीं है) और GET_ACCOUNTS अनुमति।

मैं Google+ और GET_ACCOUNTS के बिना फ़ायरबेस में साइन इन कैसे कर सकता हूं - और नए Google साइन-इन के बिना? क्या मैं? शायद दो अलग-अलग GoogleApiClients बनाना एक समाधान होगा?

+0

आपकी समस्या को पुन: उत्पन्न करने के लिए न्यूनतम कोड को देखे बिना, यह कहना असंभव होगा कि यह क्यों काम नहीं कर रहा है। [एमसीवीई] देखें (http://stackoverflow.com/help/mcve)। –

उत्तर

2

ठीक है, मैं बस दो अलग GoogleApiClients बनाने के लिए समाप्त हुआ: एक Google Play गेम्स के लिए, और दूसरा फ़ायरबेस के लिए (नया Google साइन-इन का उपयोग करके)। मुझे इस दृष्टिकोण के साथ कोई समस्या नहीं दिख रही है, और मैंने Google+ निर्भरता & GET_ACCOUNTS अनुमति से छुटकारा पा लिया।

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है। मैं आपके उपयोग के मामले से अधिक जानकारी जानना चाहता हूं। आप दो कनेक्ट() कॉल का अनुक्रम कैसे करते हैं? (मुझे लगता है कि आपको दो अलग कनेक्ट कॉल करना है) – dlmt

+0

2 अलग-अलग एपीआई क्लाइंट्स के साथ, यदि उपयोगकर्ता के डिवाइस पर एकाधिक खाते हैं तो आप एक अलग Google खाता या playgames खाते चुनने की समस्या को कैसे रोकते हैं? मैं आसानी से एक परिदृश्य देख सकता हूं जहां दोनों मेल नहीं खाते हैं। – Moritz

1

गूगल Firebase साथ खेलते हैं खेल एपीआई का उपयोग करने के लिए निम्न चरणों का पालन करें:

*** नोट: getGamesServerAuthCode गूगल से सुझाया गया तरीका है, हालांकि यह अवमूल्यन है। आम जनता को रिहा करते समय वे बहिष्करण एनोटेशन को हटाना भूल गए हैं।

चरण 1: जब आपने सफलतापूर्वक साइन इन किया है; प्रमाणीकरण कोड प्राप्त करें। उदाहरण के लिए आप साइनइन सफल() पर उपयोग कर सकते हैं। बस सुनिश्चित करें कि एपीआई क्लाइंट कनेक्ट है।

Games.getGamesServerAuthCode(gameHelper.getApiClient(), [web_client_id]).setResultCallback(new ResultCallback<Games.GetServerAuthCodeResult>() { 
      @Override 
      public void onResult(@NonNull Games.GetServerAuthCodeResult result) { 
       if (result.getStatus().isSuccess()) { 
        String authCode = result.getCode(); 
        exchangeAuthCodeForToken(authCode); 
       } 
      } 
     }); 

चरण 2: एक टोकन के लिए प्राधिकरण कोड एक्सचेंज करें।

class AuthToken { 
    String access_token; 
    String token_type; 
    int expires_in; 
    String id_token; 
} 

void exchangeAuthCodeForToken(final String authCode) { 
    AsyncTask<Void, Void, AuthToken> task = new AsyncTask<Void, Void, AuthToken>() { 
     @Override 
     protected AuthToken doInBackground(Void... voids) { 
      try { 
       URL url = new URL("https://www.googleapis.com/oauth2/v4/token"); 
       Map<String, Object> params = new LinkedHashMap<>(); 
       params.put("code", authCode); 
       params.put("client_id", "[web_client_id]"); 
       params.put("client_secret", "[secret]"); 
       params.put("redirect_uri", "[redirect_uri]"); 
       params.put("grant_type", "authorization_code"); 

       StringBuilder postData = new StringBuilder(); 
       for (Map.Entry<String, Object> param : params.entrySet()) { 
        if (postData.length() != 0) postData.append('&'); 
        postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); 
        postData.append('='); 
        postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); 
       } 
       byte[] postDataBytes = postData.toString().getBytes("UTF-8"); 

       HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
       conn.setRequestMethod("POST"); 
       conn.setRequestProperty("Host", "www.googleapis.com"); 
       conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
       conn.setDoOutput(true); 
       conn.getOutputStream().write(postDataBytes); 

       int responseCode = conn.getResponseCode(); 
       if (responseCode == HttpsURLConnection.HTTP_OK) { 
        Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); 

        // Build the string 
        StringBuilder sb = new StringBuilder(); 
        for (int c; (c = in.read()) >= 0;) { 
         sb.append((char) c); 
        } 

        // Convert JSON to a Java Object 
        GsonBuilder builder = new GsonBuilder(); 
        Gson gson = builder.create(); 
        AuthToken token = gson.fromJson(sb.toString(), AuthToken.class); 

        // Disconnect 
        conn.disconnect(); 

        return token; 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(AuthToken token) { 
      // Authorize Firebase with Games API 
      firebaseAuthWithGamesApi(token.id_token); 
     } 

    }.execute(); 
} 

चरण 3: फ़ायरबेस के साथ साइन-इन करने के लिए प्राधिकरण कोड का उपयोग करें।

private void firebaseAuthWithGamesApi(String authToken) { 
     AuthCredential credential = GoogleAuthProvider.getCredential(authToken, null); 
     mAuth.signInWithCredential(credential) 
       .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful()); 

         // If sign in fails, display a message to the user. If sign in succeeds 
         // the auth state listener will be notified and logic to handle the 
         // signed in user can be handled in the listener. 
         if (!task.isSuccessful()) { 
          Log.w(TAG, "signInWithCredential", task.getException()); 
         } 
        } 
       }); 
    } 
+0

यह एक समाधान हो सकता है, लेकिन 'Games.getGamesServerAuthCode' को बहिष्कृत किया गया है और अगला नेटवर्क अनुरोध 'id_token' के बिना टोकन जानकारी देता है जिसे' AuthCredential 'प्राप्त करने की आवश्यकता है जिसे हमें फ़ायरबेस – mohax

+0

में लॉगिन करने की आवश्यकता है, मैंने कुछ लेखों से सुना है कि यह था अवमूल्यन के रूप में चिह्नित किया गया है और वे इसे हटाने के लिए भूल गए हैं। हालांकि यकीन नहीं है। मुझे यकीन है कि वे इसके प्रतिस्थापन पर काम कर रहे हैं। लेकिन, मुझे अभी तक यह देखना नहीं है। –

+0

और 'id_token' गुम होने के बारे में कैसे? मैं यहां से कुछ जवाब आज़माता हूं लेकिन इस क्षेत्र को responce में नहीं मिल सकता है (ओनी 'acces_token' वापस आ गया है और जब मैं इसे GoogleAuthProvider.getCredential में पास करने का प्रयास करता हूं तो यह संदेश के साथ विफल रहता है कि यह' id_token' को – mohax

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