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

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

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

আপনার গেমগুলিতে প্রমাণীকরণ যোগ করার বিষয়ে অতিরিক্ত নির্দেশিকা জানতে, Android গেমগুলির জন্য প্ল্যাটফর্ম প্রমাণীকরণ দেখুন।

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

  1. গুগল প্লে কনসোলে: আপনার গেম সার্ভারের জন্য একটি শংসাপত্র তৈরি করুন। শংসাপত্রের OAuth ক্লায়েন্ট ধরণটি হবে "ওয়েব"।
  2. অ্যান্ড্রয়েড অ্যাপে: প্ল্যাটফর্ম প্রমাণীকরণের অংশ হিসেবে, আপনার সার্ভারের শংসাপত্রের জন্য একটি সার্ভার প্রমাণীকরণ কোড অনুরোধ করুন এবং এটি আপনার সার্ভারে প্রেরণ করুন। Play Games Services ওয়েব API-তে সার্ভার-সাইড অ্যাক্সেসের অনুরোধ করার সময় GamesSigninClient তিনটি OAuth 2.0 স্কোপ অনুরোধ করতে পারে। ঐচ্ছিক স্কোপগুলি হল EMAIL , PROFILE , এবং OPEN_ID । দুটি ডিফল্ট স্কোপ হল DRIVE_APPFOLDER এবং GAMES_LITE
  3. আপনার গেম সার্ভারে: Google auth পরিষেবা ব্যবহার করে সার্ভার auth কোডটি OAuth অ্যাক্সেস টোকেনের সাথে বিনিময় করুন, এবং তারপর Play Games Services REST API গুলিতে কল করতে এটি ব্যবহার করুন।

শুরু করার আগে

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

একটি সার্ভার-সাইড ওয়েব অ্যাপ তৈরি করুন

গুগল প্লে গেম পরিষেবাগুলি ওয়েব গেমগুলির জন্য ব্যাকএন্ড সাপোর্ট প্রদান করে না। তবে, এটি আপনার অ্যান্ড্রয়েড গেমের সার্ভারের জন্য ব্যাকএন্ড সার্ভার সাপোর্ট প্রদান করে।

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

  1. গুগল প্লে কনসোলে , একটি গেম নির্বাচন করুন।
  2. প্লে গেমস সার্ভিসেস > সেটআপ এবং ব্যবস্থাপনা > কনফিগারেশন এ যান।
  3. Add credential পৃষ্ঠায় যেতে Add credential নির্বাচন করুন। Credential টাইপ হিসেবে Game server নির্বাচন করুন এবং Authorization বিভাগে যান।
    1. যদি আপনার গেম সার্ভারে ইতিমধ্যেই একটি OAuth ক্লায়েন্ট আইডি থাকে, তাহলে ড্রপ ডাউন মেনু থেকে এটি নির্বাচন করুন। আপনার পরিবর্তনগুলি সংরক্ষণ করার পরে, পরবর্তী বিভাগে যান।
    2. যদি আপনার গেম সার্ভারের জন্য কোনও বিদ্যমান OAuth ক্লায়েন্ট আইডি না থাকে, তাহলে আপনি একটি তৈরি করতে পারেন।
      1. Create OAuth client-এ ক্লিক করুন এবং Create OAuth Client ID লিঙ্কটি অনুসরণ করুন।
      2. এটি আপনাকে আপনার গেমের সাথে সম্পর্কিত প্রকল্পের জন্য Google Cloud Platform এর Create OAuth ক্লায়েন্ট আইডি পৃষ্ঠায় নিয়ে যাবে।
      3. পৃষ্ঠার ফর্মটি পূরণ করুন এবং তৈরি করুন এ ক্লিক করুন। অ্যাপ্লিকেশন টাইপটি ওয়েব অ্যাপ্লিকেশনে সেট করতে ভুলবেন না।
      4. "শংসাপত্র যোগ করুন" পৃষ্ঠার অনুমোদন বিভাগে ফিরে যান, নতুন তৈরি OAuth ক্লায়েন্টটি নির্বাচন করুন এবং আপনার পরিবর্তনগুলি সংরক্ষণ করুন।

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

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

  1. ক্লায়েন্ট থেকে requestServerSideAccess কল করুন।
    1. আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশনের OAuth ক্লায়েন্ট আইডি ব্যবহার না করে, আপনার গেম সার্ভারের জন্য নিবন্ধিত OAuth ক্লায়েন্ট আইডি ব্যবহার করছেন তা নিশ্চিত করুন।
    2. (ঐচ্ছিক) যদি আপনার গেম সার্ভারের প্লে গেমস সার্ভিসে অফলাইন অ্যাক্সেস (রিফ্রেশ টোকেন ব্যবহার করে দীর্ঘস্থায়ী অ্যাক্সেস) প্রয়োজন হয়, তাহলে আপনি forceRefreshToken প্যারামিটারটিকে true এ সেট করতে পারেন।
  2. (ঐচ্ছিক) প্রমাণীকরণের অংশ হিসেবে, নতুন ব্যবহারকারীদের অতিরিক্ত স্কোপের জন্য একটি একক সম্মতি স্ক্রিনের মুখোমুখি হতে হবে। সম্মতি গ্রহণ করার পরে, আপনি EMAIL , PROFILE এবং OPEN_ID OAuth স্কোপের সাহায্যে scopes প্যারামিটার সেট করেন। ব্যবহারকারীরা সম্মতি প্রত্যাখ্যান করলে, শুধুমাত্র দুটি ডিফল্ট স্কোপ DRIVE_APPFOLDER এবং GAMES_LITE ব্যাকএন্ডে পাঠানো হবে।

    অতিরিক্ত OAuth স্কোপের জন্য সম্মতি স্ক্রিন।
    অতিরিক্ত OAuth স্কোপের জন্য সম্মতি স্ক্রিন। (বড় করতে ক্লিক করুন)।

     GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(this);
     gamesSignInClient.requestServerSideAccess(OAUTH_2_WEB_CLIENT_ID, /* forceRefreshToken= / false,
         / Additional AuthScope */ scopes)
       .addOnCompleteListener( task -> {
         if (task.isSuccessful()) {
           AuthResponse authresp = task.getResult();
           // Send the authorization code as a string and a
           // list of the granted AuthScopes that were granted by the
           // user. Exchange for an access token.
           // Verify the player with Play Games Services REST APIs.
         } else {
           // Failed to retrieve authentication code.
         }
     });
     

  3. আপনার ব্যাকএন্ড সার্ভারে OAuth প্রমাণীকরণ কোড টোকেনটি পাঠান যাতে এটি বিনিময় করা যায়, প্লেয়ার আইডিটি Play Games Services REST API-এর সাথে যাচাই করা যায় এবং তারপর আপনার গেমের সাথে প্রমাণীকরণ করা যায়।

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

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

প্লেয়ার আইডি কীভাবে কাজ করে সে সম্পর্কে আরও তথ্যের জন্য, পরবর্তী প্রজন্মের প্লেয়ার আইডি দেখুন।

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

জাভা

/**
 * Exchanges the authcode for an access token credential. The credential
 * is 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();

    TokenVerifier(tokenResponse);

    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 ক্লায়েন্ট লাইব্রেরি ব্যবহার করে OAuth স্কোপগুলি পুনরুদ্ধার করতে পারেন GoogleIdTokenVerifier অবজেক্ট পেতে। নিম্নলিখিত কোড স্নিপেটটি জাভা প্রোগ্রামিং ভাষায় বাস্তবায়ন দেখায়।

জাভা

import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;

/**
 * Gets the GoogleIdTokenVerifier object and additional OAuth scopes.
 * If additional OAuth scopes are not requested, the idToken will be null.
 *
 * @param tokenResponse - the tokenResponse passed from the exchangeAuthCode
 *                        function.
 *
 **/

void TokenVerifier(GoogleTokenResponse tokenResponse) {

    string idTokenString = tokenResponse.getIdToken();

    GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        // Specify the WEB_CLIENT_ID of the app that accesses the backend:
        .setAudience(Collections.singletonList(WEB_CLIENT_ID))
        // Or, if multiple clients access the backend:
        //.setAudience(Arrays.asList(WEB_CLIENT_ID_1, WEB_CLIENT_ID_2, WEB_CLIENT_ID_3))
        .build();

    GoogleIdToken idToken = verifier.verify(idTokenString);

    // The idToken can be null if additional OAuth scopes are not requested.
    if (idToken != null) {
        Payload payload = idToken.getPayload();

    // Print user identifier
    String userId = payload.getSubject();
    System.out.println("User ID: " + userId);

    // Get profile information from payload
    String email = payload.getEmail();
    boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
    String name = (String) payload.get("name");
    String pictureUrl = (String) payload.get("picture");
    String locale = (String) payload.get("locale");
    String familyName = (String) payload.get("family_name");
    String givenName = (String) payload.get("given_name");

    // This ID is unique to each Google Account, making it suitable for use as
    // a primary key during account lookup. Email is not a good choice because
    // it can be changed by the user.
    String sub = payload.getSubject();

    // Use or store profile information
    // ...

    } else {
      System.out.println("Invalid ID token.");
    }
}

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

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

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

খেলোয়াড়

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

বন্ধুরা

বিস্তারিত জানার জন্য বন্ধুদের নির্দেশিকা দেখুন।

  • খেলোয়াড়ের বন্ধুদের তালিকা পুনরুদ্ধার করতে, Players.list with friends_all collection হিসেবে কল করুন।

  • আপনার বন্ধু তালিকায় অ্যাক্সেস আছে কিনা তা যাচাই করতে, Players.get with meplayerID হিসেবে কল করুন এবং প্রতিক্রিয়ায় profileSettings.friendsListVisibility ক্ষেত্রটি দেখুন।

অর্জনসমূহ

বিস্তারিত জানার জন্য অ্যাচিভমেন্টস গাইড দেখুন।

  • বর্তমান কৃতিত্বের তালিকা পেতে, AchievementDefinitions.list এ কল করুন।

  • প্লেয়ারটি কোনটি আনলক করেছে তা জানতে Achievements.list- এ কল করার সাথে এটি একত্রিত করুন।

  • খেলোয়াড়ের কৃতিত্ব আনলক করতে Achievements.unlock এ কল করুন।

  • কোনও অর্জনের অগ্রগতি জানাতে Achievements.increment- এ কল করুন এবং প্লেয়ারটি আনলক করেছে কিনা তা খুঁজে বের করুন।

  • যদি আপনি এমন কোনও গেম ডিবাগ করছেন যা এখনও প্রোডাকশনে পৌঁছায়নি, তাহলে আপনি ম্যানেজমেন্ট API থেকে Achievements.reset অথবা Achievements.resetAll কল করে কৃতিত্বগুলিকে তাদের আসল অবস্থায় রিসেট করতে পারেন।

লিডারবোর্ড

বিস্তারিত জানার জন্য লিডারবোর্ড নির্দেশিকা দেখুন।

  • খেলার সকল স্কোরবোর্ডের তালিকা পেতে, Leaderboards.list এ কল করুন।

  • যদি কোন খেলোয়াড় খেলা শেষ করে ফেলে, তাহলে আপনি Scores.submit- এ তাদের স্কোর জমা দিতে পারেন এবং জানতে পারেন যে এটি একটি নতুন উচ্চ স্কোর কিনা।

  • লিডারবোর্ড প্রদর্শনের জন্য, Scores.list থেকে ডেটা সংগ্রহ করুন এবং ব্যবহারকারীকে দেখান।

  • ব্যবহারকারীর সর্বোচ্চ স্কোরের কাছাকাছি বিভিন্ন ধরণের স্কোরের সন্ধান করতে Scores.listWindow ব্যবহার করুন।

  • একটি নির্দিষ্ট লিডারবোর্ডে খেলোয়াড়ের স্কোর সম্পর্কে আরও তথ্য পেতে (উদাহরণস্বরূপ, যদি খেলোয়াড়টি সমস্ত খেলোয়াড়ের শীর্ষ ১২%-এর মধ্যে থাকে), Scores.get এ কল করুন।

  • যদি আপনি কোন গেম ডিবাগ করেন, তাহলে আপনি Management API থেকে Scores.reset কল করে একটি নির্দিষ্ট লিডারবোর্ড থেকে সেই প্লেয়ারের জন্য সমস্ত স্কোর রিসেট করতে পারেন।