Google Play की गेम सेवाओं का सर्वर साइड ऐक्सेस चालू करें

अगर आपका गेम बैकएंड सर्वर का इस्तेमाल करता है, तो हमारा सुझाव है कि आप खिलाड़ियों की पहचान की पुष्टि करने के लिए Google साइन इन का इस्तेमाल करें. साथ ही, खिलाड़ी की पहचान बैकएंड सर्वर पर सुरक्षित तरीके से भेजें. इससे आपके गेम को खिलाड़ी की पहचान और अन्य डेटा को सुरक्षित तरीके से हासिल करने में भी मदद मिलती है. ऐसा करने पर, डिवाइस से डेटा भेजने के दौरान, डेटा में छेड़छाड़ होने की संभावना कम हो जाती है.

इस स्थिति में, आपका गेम खिलाड़ी को Google Play Games Services में हमेशा की तरह साइन इन करने के लिए कहता है. जब खिलाड़ी साइन इन करता है, तो GoogleSignInAccount ऑब्जेक्ट में एक बार इस्तेमाल होने वाला एक खास कोड होता है. इसे सर्वर ऑथराइज़ेशन कोड कहा जाता है. क्लाइंट, यह कोड सर्वर को भेजता है. इसके बाद, सर्वर पर, सर्वर ऑथराइज़ेशन कोड को OAuth 2.0 टोकन से बदलें. इस टोकन का इस्तेमाल, सर्वर Google Play Games Services API को कॉल करने के लिए कर सकता है.

अपने गेम में साइन इन करने की सुविधा जोड़ने के बारे में ज़्यादा जानकारी पाने के लिए, Android गेम में साइन इन करना लेख पढ़ें.

खिलाड़ियों की पुष्टि करने के लिए, Google Sign-In का इस्तेमाल करने का तरीका बताने वाला ज़्यादा जानकारी वाला कोड सैंपल देखने के लिए, GitHub पर clientserverskeleton सैंपल देखें.

ऑफ़लाइन ऐक्सेस के लिए, यह तरीका अपनाएं:

  1. Google Play Console में: अपने गेम सर्वर के लिए क्रेडेंशियल बनाएं. क्रेडेंशियल का OAuth क्लाइंट टाइप "वेब" होगा.
  2. Android ऐप्लिकेशन में: साइन इन करने के दौरान, अपने सर्वर के क्रेडेंशियल के लिए सर्वर ऑथराइज़ेशन कोड का अनुरोध करें और उसे अपने सर्वर को भेजें.
  3. अपने गेम सर्वर पर: Google पुष्टि सेवाओं का इस्तेमाल करके, OAuth ऐक्सेस टोकन के लिए सर्वर के ऑथराइज़ेशन कोड को एक्सचेंज करें. इसके बाद, Play की गेम सेवाओं के REST API को कॉल करने के लिए, इसका इस्तेमाल करें.

शुरू करने से पहले

अपने गेम में Google Sign-In को इंटिग्रेट करने से पहले, आपको पहले अपने गेम को Google Play Console में जोड़ना होगा. इसके बारे में Google Play की गेम सेवाओं को सेट अप करना में बताया गया है.

अपने गेम के लिए, इससे जुड़ा सर्वर-साइड वेब ऐप्लिकेशन बनाएं

Google Play की गेम सेवाएं, वेब गेम के लिए बैक-एंड की सुविधा नहीं देती हैं. हालांकि, यह आपके Android गेम के सर्वर के लिए, बैक-एंड सर्वर की सहायता उपलब्ध कराता है.

अगर आपको अपने सर्वर-साइड ऐप्लिकेशन में, Google Play Games services के लिए REST API का इस्तेमाल करना है, तो यह तरीका अपनाएं:

  1. Google Play Console के लिंक किए गए ऐप्लिकेशन सेक्शन में, अपने गेम से जुड़ा वेब ऐप्लिकेशन बनाएं. ध्यान दें कि इस फ़्लो के लिए launch_url का इस्तेमाल नहीं किया जाता और इसे खाली छोड़ा जा सकता है.
  2. अपने ऐप्लिकेशन के क्रेडेंशियल की जानकारी पाने के लिए, यह तरीका अपनाएं:
    1. Google Play Console में अपने गेम से, गेम की जानकारी पर क्लिक करें.
    2. नीचे की ओर स्क्रोल करके, एपीआई कंसोल प्रोजेक्ट सेक्शन पर जाएं और एपीआई कंसोल प्रोजेक्ट के लिंक पर क्लिक करें.
    3. Google API Console में एपीआई और सेवाएं > क्रेडेंशियल स्क्रीन पर, अपने वेब ऐप्लिकेशन के लिए client_secret.json फ़ाइल डाउनलोड करें और उसे ऐसी जगह सेव करें जिसे आपका सर्वर ऐक्सेस कर सके. बाद में इस्तेमाल करने के लिए, क्रेडेंशियल का क्लाइंट आईडी रिकॉर्ड करें.
  3. अपने सर्वर-साइड ऐप्लिकेशन को रीस्टार्ट करें, ताकि वह आपके गेम के क्लाइंट ऐप्लिकेशन से अनुरोध स्वीकार करने के लिए तैयार हो जाए.

क्लाइंट खाते में साइन इन करें

साइन-इन किए हुए मौजूदा प्लेयर का खाता वापस पाने के लिए, GoogleSignInClient क्लास मुख्य एंट्री पॉइंट है. इसमें, अगर खिलाड़ी ने डिवाइस में आपके ऐप्लिकेशन पर पहले साइन-इन नहीं किया है, तो साइन-इन करने का मुख्य एंट्री पॉइंट है.

साइन-इन क्लाइंट बनाने के लिए, यह तरीका अपनाएं:

  1. GoogleSignInOptions ऑब्जेक्ट की मदद से, साइन-इन क्लाइंट बनाएं. साइन-इन की प्रोसेस को कॉन्फ़िगर करने के लिए, आपको GoogleSignInOptions.Builder में GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN की जानकारी देनी होगी.
  2. आपको यह भी बताना होगा कि आपके गेम को बैकएंड सर्वर के लिए पुष्टि करने वाला कोड चाहिए. इसके लिए, आपको GoogleSignInOptions.Builder.requestServerAuthCode() तरीके को कॉल करना होगा. साथ ही, पैरामीटर के तौर पर सर्वर के क्लाइंट आईडी का इस्तेमाल करना होगा. आपको अपने बैकएंड सर्वर पर ऐक्सेस टोकन के लिए, बाद में पुष्टि करने वाला कोड मिलेगा. इसके बारे में सर्वर का ऑथराइज़ेशन कोड पाना सेक्शन में बताया गया है.
  3. GoogleSignIn.getClient() तरीके को कॉल करें और पहले से कॉन्फ़िगर किए गए विकल्पों को पास करें. अगर कॉल कामयाब होता है, तो Google Sign-In API, GoogleSignInClient का एक इंस्टेंस दिखाता है.
  4. GoogleSignInClient इंस्टेंस मिलने के बाद, आपको गतिविधि के onResume() से प्लेयर को चुपचाप साइन इन करना चाहिए, जैसा कि चुपचाप साइन इन करने का तरीका में बताया गया है.

यहां एक उदाहरण दिया गया है:

private static final int RC_SIGN_IN = 9001;
private GoogleSignInClient mGoogleSignInClient;

private void startSignInForAuthCode() {

  // Client ID for your backend server.
  String webClientId = getString(R.string.webclient_id);

  GoogleSignInOptions signInOption = new
      GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
      .requestServerAuthCode(webClientId)
      .build();

  GoogleSignInClient signInClient = GoogleSignIn.getClient(this, signInOption);
  Intent intent = signInClient.getSignInIntent();
  startActivityForResult(intent, RC_SIGN_IN);
}

सर्वर का ऑथराइज़ेशन कोड पाएं

सर्वर का वह ऑथराइज़ेशन कोड वापस पाने के लिए जिसका इस्तेमाल आपका गेम, बैकएंड सर्वर पर ऐक्सेस टोकन के लिए कर सकता है, उस GoogleSignInAccount ऑब्जेक्ट पर getServerAuthCode() तरीका कॉल करें जो खिलाड़ी के साइन इन करने पर, Google Sign-In दिखाता है.

यहां एक उदाहरण दिया गया है:

// Auth code to send to backend server.
private String mServerAuthCode;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == RC_SIGN_IN) {
    GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
    if (result.isSuccess()) {
      mServerAuthCode = result.getSignInAccount().getServerAuthCode();
    } else {
      String message = result.getStatus().getStatusMessage();
      if (message == null || message.isEmpty()) {
        message = getString(R.string.signin_other_error);
      }
      new AlertDialog.Builder(this).setMessage(message)
          .setNeutralButton(android.R.string.ok, null).show();
    }
  }
}

सर्वर पर, सर्वर के ऑथराइज़ेशन कोड को ऐक्सेस टोकन के साथ बदलना

ऐक्सेस और रीफ़्रेश टोकन के बदले, अपने बैकएंड सर्वर पर सर्वर की पुष्टि करने वाला कोड भेजें. प्लेयर की ओर से Google Play की गेम सेवाओं के एपीआई को कॉल करने के लिए, ऐक्सेस टोकन का इस्तेमाल करें. इसके अलावा, ऐक्सेस टोकन की समयसीमा खत्म होने पर नया ऐक्सेस टोकन पाने के लिए, रीफ़्रेश टोकन को सेव भी किया जा सकता है.

नीचे दिए गए कोड स्निपेट में बताया गया है कि ऐक्सेस टोकन के लिए, सर्वर की पुष्टि करने वाले कोड को बदलने के लिए, Java प्रोग्रामिंग भाषा में सर्वर-साइड कोड को कैसे लागू किया जा सकता है. यह clientserverskeleton सैंपल ऐप्लिकेशन का इस्तेमाल कर रहा है:

/**
 * Exchanges the authcode for an access token credential.  The credential
 * is the associated with the given player.
 *
 * @param authCode - the non-null authcode passed from the client.
 * @param player   - the player object which the given authcode is
 *                 associated with.
 * @return the HTTP response code indicating the outcome of the exchange.
 */
private int exchangeAuthCode(String authCode, Player player) {
try {

    // The client_secret.json file is downloaded from the Google API
    // console.  This is used to identify your web application.  The
    // contents of this file should not be shared.
    //
    File secretFile = new File("client_secret.json");

    // If we don't have the file, we can't access any APIs, so return
    // an error.
    if (!secretFile.exists()) {
        log("Secret file : " + secretFile
                .getAbsolutePath() + "  does not exist!");
        return HttpServletResponse.SC_FORBIDDEN;
    }

    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(
            JacksonFactory.getDefaultInstance(), new
            FileReader(secretFile));

    // Extract the application id of the game from the client id.
    String applicationId = extractApplicationId(clientSecrets
            .getDetails().getClientId());

    GoogleTokenResponse tokenResponse =
            new GoogleAuthorizationCodeTokenRequest(
            HTTPTransport,
            JacksonFactory.getDefaultInstance(),
            "https://oauth2.googleapis.com/token",
            clientSecrets.getDetails().getClientId(),
            clientSecrets.getDetails().getClientSecret(),
            authCode,
            "")
            .execute();

    log("hasRefresh == " + (tokenResponse.getRefreshToken() != null));
    log("Exchanging authCode: " + authCode + " for token");
    Credential credential = new Credential
            .Builder(BearerToken.authorizationHeaderAccessMethod())
            .setJsonFactory(JacksonFactory.getDefaultInstance())
            .setTransport(HTTPTransport)
            .setTokenServerEncodedUrl("https://www.googleapis.com/oauth2/v4/token")
            .setClientAuthentication(new HttpExecuteInterceptor() {
                @Override
                public void intercept(HttpRequest request)
                        throws IOException {
                        }
            })
            .build()
            .setFromTokenResponse(tokenResponse);

    player.setCredential(credential);

    // Now that we have a credential, we can access the Games API.
    PlayGamesAPI api = new PlayGamesAPI(player, applicationId,
            HTTPTransport, JacksonFactory.getDefaultInstance());

    // Call the verify method, which checks that the access token has
    // access to the Games API, and that the player id used by the
    // client matches the playerId associated with the accessToken.
    boolean ok = api.verifyPlayer();

    // Call a Games API on the server.
    if (ok) {
        ok = api.updatePlayerInfo();
        if (ok) {
            // persist the player.
            savePlayer(api.getPlayer());
        }
    }

    return ok ? HttpServletResponse.SC_OK :
            HttpServletResponse.SC_INTERNAL_SERVER_ERROR;

  } catch (IOException e) {
    e.printStackTrace();
  }
  return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
}

साइन-इन किए हुए प्लेयर की ओर से बैकएंड सर्वर से Google API को ऐक्सेस करने के बारे में ज़्यादा जानने के लिए, सर्वर-साइड ऐक्सेस चालू करना देखें.

प्लेयर के साइन आउट करने की सुविधा को मैनेज करना

अपने गेम से खिलाड़ियों को साइन आउट करने के लिए, GoogleSignInClient पर signOut() तरीका कॉल करें. कोड स्निपेट का उदाहरण देखने के लिए, प्लेयर से साइन आउट करना लेख पढ़ें.

सर्वर से REST API को कॉल करें

उपलब्ध एपीआई कॉल की पूरी जानकारी के लिए, Google Play Games services के लिए REST API देखें.

REST API कॉल के ऐसे उदाहरण जो आपको काम के लग सकते हैं:

खिलाड़ी

  • क्या आपको साइन इन किए हुए खिलाड़ी का आईडी और प्रोफ़ाइल डेटा चाहिए? Players.get को कॉल करें और 'me' को आईडी के तौर पर इस्तेमाल करें.

दोस्त

दोस्तों के बारे में ज़्यादा जानने के लिए, 'दोस्तों' की गाइड देखें.

  • क्या आपको खिलाड़ी के दोस्तों की सूची वापस चाहिए? Players.list को कॉल करें और 'friends_all' को collection के तौर पर कॉल करें.
  • देखें कि आपके पास दोस्तों की सूची का ऐक्सेस है या नहीं? me के लिए Players.get को कॉल करें और रिस्पॉन्स में profileSettings.friendsListVisibility फ़ील्ड देखें.

उपलब्धियां

पक्का करें कि आपने उपलब्धियां गाइड को ज़रूर पढ़ लिया हो. इसमें उपलब्धियों के बारे में ज़्यादा जानकारी दी गई है.

  • क्या आपको अपनी मौजूदा उपलब्धियों की सूची चाहिए? AchievementDefinitions.list को कॉल किया जा सकता है.
  • Achievements.list को कॉल करके, यह पता लगाएं कि खिलाड़ी ने कौनसी उपलब्धियां अनलॉक की हैं.
  • क्या इस खिलाड़ी ने कोई उपलब्धि हासिल की है? इसे अनलॉक करने के लिए, Achievements.unlock का इस्तेमाल करें!
  • क्या खिलाड़ी ने किसी उपलब्धि के लिए ज़रूरी शर्तों को पूरा किया है? उपलब्धि हासिल करने की प्रोग्रेस की जानकारी देने के लिए, Achievements.increment का इस्तेमाल करें. साथ ही, यह भी पता लगाएं कि खिलाड़ी ने उपलब्धि को अनलॉक किया है या नहीं.
  • क्या किसी ऐसे गेम को डीबग किया जा रहा है जो अभी प्रोडक्शन में नहीं है? उपलब्धियों को उनकी मूल स्थिति पर रीसेट करने के लिए, मैनेजमेंट एपीआई से Achievements.reset या Achievements.resetAll को कॉल करने की कोशिश करें.

लीडरबोर्ड

पक्का करें कि आपने लीडरबोर्ड गाइड पढ़ ली है. इससे लीडरबोर्ड के बारे में ज़्यादा जानकारी मिलती है.

  • क्या आपको गेम में मौजूद सभी स्कोरबोर्ड की सूची चाहिए? Leaderboards.list को कॉल करें.
  • क्या गेम खत्म हो गया है? Scores.submit पर जाकर, बच्चे का स्कोर सबमिट किया जा सकता है. साथ ही, यह भी पता लगाया जा सकता है कि यह नया सबसे ज़्यादा स्कोर है या नहीं.
  • क्या आपको लीडरबोर्ड दिखाना है? Scores.list से डेटा पाएं और उसे उपयोगकर्ता को दिखाएं.
  • Scores.listWindow का इस्तेमाल करके उपयोगकर्ता के सबसे ज़्यादा स्कोर के आस-पास के अलग-अलग तरह के स्कोर ढूंढें.
  • किसी लीडरबोर्ड में खिलाड़ी के स्कोर के बारे में ज़्यादा जानकारी पाने के लिए, Scores.get को कॉल करें. उदाहरण के लिए, अगर खिलाड़ी सभी खिलाड़ियों में से टॉप 12% में है, तो Scores.get को कॉल करें.
  • क्या आपको किसी गेम को डीबग करना है? किसी खास लीडरबोर्ड से उस खिलाड़ी के सभी स्कोर रीसेट करने के लिए, मैनेजमेंट एपीआई से Scores.reset को कॉल करने की कोशिश करें