Google Play গেম পরিষেবাগুলিতে সার্ভার-সাইড অ্যাক্সেস সক্ষম করা৷

আমরা সুপারিশ করি যে আপনি খেলোয়াড়দের প্রমাণীকরণ করুন এবং নিরাপদে ব্যাকএন্ড সার্ভারে প্লেয়ারের পরিচয় পাস করুন। এটি ডিভাইসের মধ্য দিয়ে যাওয়ার সময় সম্ভাব্য টেম্পারিংয়ের সংস্পর্শে না গিয়ে আপনার গেমটিকে প্লেয়ারের পরিচয় এবং অন্যান্য ডেটা নিরাপদে পুনরুদ্ধার করতে সক্ষম করে।

এই পরিস্থিতিতে, একবার প্লেয়ার সফলভাবে সাইন ইন করলে, আপনি Play Games Services v2 SDK থেকে একটি বিশেষ একক-ব্যবহারের কোড (যাকে সার্ভার প্রমাণীকরণ কোড বলা হয়) অনুরোধ করতে পারেন, যা ক্লায়েন্ট সার্ভারে পাস করে। তারপরে, সার্ভারে, একটি OAuth 2.0 টোকেনের জন্য সার্ভার প্রমাণীকরণ কোডটি বিনিময় করুন যা সার্ভার Google Play Games Services API এ কল করতে ব্যবহার করতে পারে৷

আপনার গেমগুলিতে সাইন-ইন যোগ করার বিষয়ে অতিরিক্ত নির্দেশনার জন্য, Android গেমগুলিতে সাইন-ইন দেখুন।

অফলাইন অ্যাক্সেসের জন্য নিম্নলিখিত পদক্ষেপগুলি প্রয়োজন:

  1. Google Play Console-এ: আপনার গেম সার্ভারের জন্য একটি শংসাপত্র তৈরি করুন। শংসাপত্রের OAuth ক্লায়েন্ট প্রকার হবে "ওয়েব"।
  2. অ্যান্ড্রয়েড অ্যাপে: সাইন-ইন করার অংশ হিসেবে, আপনার সার্ভারের শংসাপত্রের জন্য একটি সার্ভার প্রমাণীকরণ কোডের অনুরোধ করুন এবং সেটি আপনার সার্ভারে পাঠান।
  3. আপনার গেম সার্ভারে: Google প্রমাণীকরণ পরিষেবাগুলি ব্যবহার করে একটি OAuth অ্যাক্সেস টোকেনের জন্য সার্ভার প্রমাণীকরণ কোডটি বিনিময় করুন এবং তারপরে প্লে গেম পরিষেবা REST API গুলিতে কল করতে এটি ব্যবহার করুন৷

তুমি শুরু করার আগে

আপনাকে প্রথমে Google Play Console- এ আপনার গেম যোগ করতে হবে, যেমনটি Google Play Games পরিষেবা সেট আপ করুন এবং আপনার গেমের সাথে Play Games পরিষেবাগুলিকে একীভূত করতে হবে।

আপনার গেমের জন্য একটি সংশ্লিষ্ট সার্ভার-সাইড ওয়েব অ্যাপ্লিকেশন তৈরি করুন

Google Play গেম পরিষেবাগুলি ওয়েব গেমগুলির জন্য ব্যাক-এন্ড সমর্থন প্রদান করে না৷ যাইহোক, এটি আপনার অ্যান্ড্রয়েড গেমের সার্ভারের জন্য ব্যাক-এন্ড সার্ভার সমর্থন প্রদান করে।

আপনি যদি আপনার সার্ভার-সাইড অ্যাপে Google Play গেম পরিষেবাগুলির জন্য REST API ব্যবহার করতে চান, তাহলে এই পদক্ষেপগুলি অনুসরণ করুন:

  1. Google Play Console- এ আপনার গেম থেকে, Play Games Services > Setup and Management > Configuration- এ যান।
  2. শংসাপত্র যোগ করুন পৃষ্ঠায় আনার জন্য শংসাপত্র যোগ করুন নির্বাচন করুন। শংসাপত্রের ধরন হিসাবে গেম সার্ভার নির্বাচন করুন এবং অনুমোদন বিভাগে চালিয়ে যান।
    1. যদি আপনার গেম সার্ভারে ইতিমধ্যে একটি OAuth ক্লায়েন্ট আইডি থাকে তাহলে ড্রপ ডাউন মেনু থেকে এটি নির্বাচন করুন। আপনার পরিবর্তনগুলি সংরক্ষণ করার পরে, পরবর্তী বিভাগে যান৷
    2. আপনার যদি আপনার গেম সার্ভারের জন্য একটি বিদ্যমান OAuth ক্লায়েন্ট আইডি না থাকে তবে আপনি একটি তৈরি করতে পারেন।
      1. OAuth ক্লায়েন্ট তৈরি করুন ক্লিক করুন এবং OAuth ক্লায়েন্ট আইডি তৈরি করুন লিঙ্কটি অনুসরণ করুন।
      2. এটি আপনাকে আপনার গেমের সংশ্লিষ্ট ক্লাউড প্ল্যাটফর্ম প্রকল্পের জন্য Google ক্লাউড প্ল্যাটফর্মের তৈরি OAuth ক্লায়েন্ট আইডি পৃষ্ঠায় নিয়ে আসবে।
      3. পৃষ্ঠার ফর্মটি পূরণ করুন এবং তৈরি করুন ক্লিক করুন। ওয়েব অ্যাপ্লিকেশনে অ্যাপ্লিকেশনের ধরন সেট করতে ভুলবেন না।
      4. শংসাপত্র যোগ করুন পৃষ্ঠার অনুমোদন বিভাগে ফিরে যান, নতুন তৈরি OAuth ক্লায়েন্ট নির্বাচন করুন এবং আপনার পরিবর্তনগুলি সংরক্ষণ করুন৷

সার্ভার প্রমাণীকরণ কোড পান

আপনার ব্যাকএন্ড সার্ভারে অ্যাক্সেস টোকেনগুলির জন্য আপনার গেম ব্যবহার করতে পারে এমন একটি সার্ভার প্রমাণীকরণ কোড পুনরুদ্ধার করতে:

  1. ক্লায়েন্ট থেকে requestServerSideAccess কল করুন।

    1. নিশ্চিত করুন যে আপনি আপনার গেম সার্ভারের জন্য নিবন্ধিত OAuth ক্লায়েন্ট আইডি ব্যবহার করেছেন এবং আপনার Android অ্যাপ্লিকেশনের OAuth ক্লায়েন্ট আইডি ব্যবহার করবেন না।
    2. (ঐচ্ছিক) যদি আপনার গেম সার্ভারের প্লে গেম পরিষেবাগুলিতে অফলাইন অ্যাক্সেস (রিফ্রেশ টোকেন ব্যবহার করে দীর্ঘস্থায়ী অ্যাক্সেস) প্রয়োজন হয়, আপনি 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 প্রমাণীকরণ কোড টোকেন পাঠান যাতে এটি বিনিময় করা যায়, প্লে গেম পরিষেবা REST API-এর বিরুদ্ধে প্লেয়ার আইডি যাচাই করা হয় এবং তারপর আপনার গেমের সাথে প্রমাণীকৃত হয়।

সার্ভারে একটি অ্যাক্সেস টোকেনের জন্য সার্ভার প্রমাণীকরণ কোড বিনিময় করুন

অ্যাক্সেসের বিনিময় এবং টোকেন রিফ্রেশ করতে আপনার ব্যাকএন্ড সার্ভারে সার্ভার প্রমাণীকরণ কোড পাঠান। প্লেয়ারের তরফে Google Play Games Services API-কে কল করতে অ্যাক্সেস টোকেন ব্যবহার করুন এবং ঐচ্ছিকভাবে, অ্যাক্সেস টোকেনের মেয়াদ শেষ হয়ে গেলে একটি নতুন অ্যাক্সেস টোকেন পেতে রিফ্রেশ টোকেন সংরক্ষণ করুন।

নিম্নলিখিত কোড স্নিপেট দেখায় যে আপনি কীভাবে সার্ভার-সাইড কোডটি জাভা প্রোগ্রামিং ভাষায় প্রয়োগ করতে পারেন অ্যাক্সেস টোকেনের জন্য সার্ভার প্রমাণীকরণ কোড বিনিময় করতে। এটি ক্লায়েন্ট সার্ভার কঙ্কাল নমুনা অ্যাপ্লিকেশন ব্যবহার করছে:

/**
 * 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;
}

সার্ভার থেকে REST API কল করুন

উপলব্ধ API কলগুলির সম্পূর্ণ বিবরণের জন্য Google Play গেম পরিষেবাগুলির জন্য REST APIগুলি দেখুন৷

REST API কলগুলির উদাহরণ যা আপনি দরকারী বলে মনে করতে পারেন সেগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

প্লেয়ার

  • সাইন ইন করা খেলোয়াড়ের আইডি এবং প্রোফাইল ডেটা পেতে চান? ID হিসেবে 'me' দিয়ে Players.get কে কল করুন।

বন্ধুরা

আপনি বন্ধুদের নির্দেশিকা পর্যালোচনা করেছেন তা নিশ্চিত করুন, যা বন্ধুদের আরও বিস্তারিতভাবে ব্যাখ্যা করে।

  • খেলোয়াড়ের বন্ধুদের তালিকা পুনরুদ্ধার করতে চান? collection হিসাবে 'friends_all' সহ Players.list কল করুন।
  • আপনার বন্ধুদের তালিকায় অ্যাক্সেস আছে কিনা দেখুন? me জন্য Players.get কে কল করুন এবং প্রতিক্রিয়াতে profileSettings.friendsListVisibility ক্ষেত্রটি দেখুন।

অর্জন

নিশ্চিত করুন যে আপনি কৃতিত্ব নির্দেশিকা পর্যালোচনা করেছেন, যা অর্জনগুলি আরও বিশদে ব্যাখ্যা করে৷

  • বর্তমান অর্জনের একটি তালিকা পেতে চান? আপনি AchievementDefinitions.list এ কল করতে পারেন।
  • প্লেয়ার কোনটি আনলক করেছে তা খুঁজে বের করতে Achievements.list- এ একটি কলের সাথে এটি একত্রিত করুন।
  • প্লেয়ার একটি কৃতিত্ব অর্জন করেছেন? এটি আনলক করতে Achievements.unlock ব্যবহার করুন!
  • প্লেয়ার কি একটি আংশিক কৃতিত্বের দিকে অগ্রগতি করেছে? অগ্রগতি রিপোর্ট করতে Achievements.increment ব্যবহার করুন (এবং প্লেয়ার এটি আনলক করেছে কিনা তা খুঁজে বের করুন)।
  • আপনি কি এমন একটি গেম ডিবাগ করছেন যা এখনও উৎপাদনে নেই? কৃতিত্বগুলিকে তাদের আসল অবস্থায় পুনরায় সেট করতে পরিচালনা API থেকে Achievements.reset বা Achievements.resetAll কল করার চেষ্টা করুন৷

লিডারবোর্ড

নিশ্চিত করুন যে আপনি লিডারবোর্ড গাইড পর্যালোচনা করেছেন, যা লিডারবোর্ডগুলিকে আরও বিশদে ব্যাখ্যা করে।

  • গেমের সমস্ত স্কোরবোর্ডের একটি তালিকা পেতে চান? Leaderboards.list এ একটি কল করুন।
  • প্লেয়ার একটি খেলা দিয়ে সম্পন্ন হয়? আপনি Scores.submit এ তাদের স্কোর জমা দিতে পারেন এবং এটি একটি নতুন উচ্চ স্কোর কিনা তা খুঁজে বের করতে পারেন।
  • একটি লিডারবোর্ড প্রদর্শন করতে চান? Scores.list থেকে ডেটা পান এবং ব্যবহারকারীকে দেখান।
  • ব্যবহারকারীর উচ্চ স্কোরের কাছাকাছি স্কোরগুলির একটি ভাণ্ডার খুঁজে পেতে Scores.listWindow ব্যবহার করুন।
  • একটি নির্দিষ্ট লিডারবোর্ডে প্লেয়ারের স্কোর সম্পর্কে আরও তথ্য পেতে (উদাহরণস্বরূপ, যদি প্লেয়ারটি সমস্ত খেলোয়াড়ের শীর্ষ 12%-এ থাকে), Scores.get এ কল করুন।
  • আপনি একটি খেলা ডিবাগ করছেন? একটি নির্দিষ্ট লিডারবোর্ড থেকে সেই প্লেয়ারের জন্য সমস্ত স্কোর রিসেট করতে ম্যানেজমেন্ট API থেকে Scores.reset কল করার চেষ্টা করুন