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

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

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

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

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

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

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

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

सर्वर-साइड वेब ऐप्लिकेशन बनाना

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

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

  1. Google Play Console में, कोई गेम चुनें.
  2. Play Games Services > सेटअप और मैनेजमेंट > कॉन्फ़िगरेशन पर जाएं.
  3. क्रेडेंशियल जोड़ें को चुनें, ताकि आपको क्रेडेंशियल जोड़ने का पेज दिखे. क्रेडेंशियल के टाइप के तौर पर गेम सर्वर चुनें और अनुमति सेक्शन पर जाएं.
    1. अगर आपके गेम सर्वर में पहले से ही OAuth क्लाइंट आईडी है, तो ड्रॉप-डाउन मेन्यू से उसे चुनें. बदलावों को सेव करने के बाद, अगले सेक्शन पर जाएं.
    2. अगर आपके पास अपने गेम सर्वर के लिए कोई मौजूदा OAuth क्लाइंट आईडी नहीं है, तो आपके पास एक नया क्लाइंट आईडी बनाने का विकल्प है.
      1. OAuth क्लाइंट बनाएं पर क्लिक करें और OAuth क्लाइंट आईडी बनाएं लिंक पर जाएं.
      2. ऐसा करने पर, आपको अपने गेम से जुड़े प्रोजेक्ट के लिए, Google Cloud Platform के OAuth क्लाइंट आईडी बनाएं पेज पर ले जाया जाएगा.
      3. पेज पर दिया गया फ़ॉर्म भरें और 'बनाएं' पर क्लिक करें. ऐप्लिकेशन टाइप को वेब ऐप्लिकेशन पर सेट करना न भूलें.
      4. क्रेडेंशियल जोड़ने वाले पेज के 'अनुमति' सेक्शन पर वापस जाएं. इसके बाद, हाल ही में बनाया गया OAuth क्लाइंट चुनें और अपने बदलावों को सेव करें.

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

सर्वर का ऑथराइज़ेशन कोड पाने के लिए, जिसका इस्तेमाल आपका गेम आपके बैकएंड सर्वर पर ऐक्सेस टोकन के लिए कर सकता है:

  1. क्लाइंट से requestServerSideAccess को कॉल करें.

    1. पक्का करें कि आपने अपने गेम सर्वर के लिए रजिस्टर किए गए OAuth क्लाइंट आईडी का इस्तेमाल किया हो, न कि अपने Android ऐप्लिकेशन के OAuth क्लाइंट आईडी का.
    2. (ज़रूरी नहीं) अगर आपके गेम सर्वर को Play Games Services का ऑफ़लाइन ऐक्सेस (रिफ़्रेश टोकन का इस्तेमाल करके लंबे समय तक ऐक्सेस) चाहिए, तो आपके पास forceRefreshToken पैरामीटर को 'सही' पर सेट करने का विकल्प है.
    GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(this);
    gamesSignInClient
      .requestServerSideAccess(OAUTH_2_WEB_CLIENT_ID, /* forceRefreshToken= */ false)
      .addOnCompleteListener( task -> {
        if (task.isSuccessful()) {
          String serverAuthToken = task.getResult();
          // Send authentication code to the backend game server to be
          // exchanged for an access token and used to verify the player
          // via the Play Games Services REST APIs.
        } else {
          // Failed to retrieve authentication code.
        }
    });
    
  2. OAuth ऑथराइज़ेशन कोड टोकन को अपने बैकएंड सर्वर पर भेजें, ताकि उसे एक्सचेंज किया जा सके. इसके बाद, Play Games Services REST API की मदद से खिलाड़ी आईडी की पुष्टि की जा सके और फिर आपके गेम की मदद से पुष्टि की जा सके.

सर्वर की पुष्टि करने वाला कोड भेजना

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

नीचे दिए गए कोड स्निपेट में बताया गया है कि ऐक्सेस टोकन के लिए, सर्वर की पुष्टि करने वाले कोड को बदलने के लिए, 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 shouldn't 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;
}

सर्वर से REST API को कॉल करना

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

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

खिलाड़ी

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

दोस्त

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

  • खिलाड़ी के दोस्तों की सूची देखने के लिए, collection के तौर पर friends_all का इस्तेमाल करके, Players.list को कॉल करें.

  • यह पुष्टि करने के लिए कि आपके पास दोस्तों की सूची का ऐक्सेस है या नहीं, playerID के तौर पर 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 का इस्तेमाल करें.

  • किसी लीडरबोर्ड में खिलाड़ी के स्कोर के बारे में ज़्यादा जानकारी पाने के लिए (उदाहरण के लिए, अगर खिलाड़ी सभी खिलाड़ियों में से टॉप 12% में है), Scores.get को कॉल करें.

  • अगर किसी गेम को डीबग किया जा रहा है, तो किसी खास लीडरबोर्ड से उस प्लेयर के सभी स्कोर रीसेट करने के लिए, मैनेजमेंट एपीआई से Scores.reset को कॉल किया जा सकता है.