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

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

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

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

প্লেয়ারদের প্রমাণীকরণের জন্য কীভাবে Google সাইন-ইন ব্যবহার করবেন তা দেখানো একটি বিশদ কোড নমুনা দেখতে, GitHub-এ clientserverskeleton নমুনা দেখুন।

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

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

আপনি শুরু করার আগে

আপনার গেমে Google সাইন-ইন সংহত করার আগে, আপনাকে প্রথমে Google Play Console- এ আপনার গেমটি যোগ করতে হবে, যেমনটি Google Play Games পরিষেবা সেট আপ করা হয়েছে।

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

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

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

  1. Google Play Console- এর Linked Apps বিভাগে আপনার গেমের জন্য একটি সংশ্লিষ্ট ওয়েব অ্যাপ তৈরি করুন। উল্লেখ্য যে launch_url এই প্রবাহের জন্য ব্যবহার করা হয় না এবং খালি রাখা যেতে পারে।
  2. আপনার অ্যাপের জন্য শংসাপত্রের তথ্য পেতে, এই পদক্ষেপগুলি অনুসরণ করুন:
    1. Google Play Console-এ আপনার গেম থেকে, গেমের বিবরণে ক্লিক করুন।
    2. API কনসোল প্রকল্প বিভাগে স্ক্রোল করুন এবং API কনসোল প্রকল্পের লিঙ্কে ক্লিক করুন।
    3. Google API কনসোলে APIs & Services > Credentials স্ক্রীন থেকে, আপনার ওয়েব অ্যাপের জন্য client_secret.json ফাইলটি ডাউনলোড করুন এবং আপনার সার্ভার অ্যাক্সেস করতে পারে এমন একটি অবস্থানে সংরক্ষণ করুন। পরবর্তী রেফারেন্সের জন্য শংসাপত্রের ক্লায়েন্ট আইডি রেকর্ড করুন।
  3. আপনার সার্ভার-সাইড অ্যাপটি পুনরায় চালু করুন যাতে এটি আপনার গেমের ক্লায়েন্ট অ্যাপ থেকে অনুরোধ গ্রহণ করতে প্রস্তুত।

ক্লায়েন্টে সাইন-ইন করা হচ্ছে

GoogleSignInClient ক্লাস হল বর্তমানে সাইন-ইন করা প্লেয়ারের অ্যাকাউন্ট পুনরুদ্ধার করার জন্য এবং প্লেয়ারে সাইন-ইন করার মূল এন্ট্রি পয়েন্ট যদি তারা ডিভাইসে আপনার অ্যাপে আগে না করে থাকে।

একটি সাইন-ইন ক্লায়েন্ট তৈরি করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. GoogleSignInOptions অবজেক্টের মাধ্যমে একটি সাইন-ইন ক্লায়েন্ট তৈরি করুন। GoogleSignInOptions.Builder এ আপনার সাইন-ইন কনফিগার করতে, আপনাকে অবশ্যই GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN নির্দিষ্ট করতে হবে৷DEFAULT_GAMES_SIGN_IN৷
  2. আপনাকে অবশ্যই নির্দিষ্ট করতে হবে যে আপনার ব্যাকএন্ড সার্ভারের জন্য GoogleSignInOptions.Builder.requestServerAuthCode() পদ্ধতিকে প্যারামিটার হিসাবে সার্ভারের ক্লায়েন্ট আইডিতে কল করার মাধ্যমে আপনার গেমটির জন্য একটি প্রমাণীকরণ কোড প্রয়োজন৷ আপনার ব্যাকএন্ড সার্ভারে অ্যাক্সেস টোকেনগুলির জন্য আপনি পরে প্রমাণীকরণ কোডটি পুনরুদ্ধার করবেন, যেমন সার্ভার প্রমাণীকরণ কোড পান
  3. GoogleSignIn.getClient() পদ্ধতিতে কল করুন এবং আপনার পূর্বে কনফিগার করা বিকল্পগুলি পাস করুন৷ কলটি সফল হলে, Google সাইন-ইন 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 সাইন-ইন সফল প্লেয়ার সাইন-ইন করার সময় ফেরত দেয়৷

এখানে একটি উদাহরণ:

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

একটি সাইন-ইন করা প্লেয়ারের পক্ষে একটি ব্যাকএন্ড সার্ভার থেকে Google API অ্যাক্সেস করার বিষয়ে আরও জানতে, সার্ভার-সাইড অ্যাক্সেস সক্ষম করা দেখুন।

প্লেয়ার সাইন-আউট পরিচালনা করুন

আপনার গেম থেকে খেলোয়াড়দের সাইন আউট করতে, GoogleSignInClientsignOut() পদ্ধতিতে কল করুন। একটি উদাহরণ কোড স্নিপেটের জন্য, প্লেয়ারকে সাইন আউট করা দেখুন।

সার্ভার থেকে 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 কল করার চেষ্টা করুন