فعال کردن دسترسی سمت سرور به خدمات بازی های Google Play

اگر بازی شما از سرور بک‌اند استفاده می‌کند، توصیه می‌کنیم از Google Sign-In برای احراز هویت بازیکنان استفاده کنید و هویت بازیکن را به‌طور ایمن به سرور پشتیبان منتقل کنید. این همچنین به بازی شما امکان می‌دهد تا هویت بازیکن و سایر داده‌ها را بدون قرار گرفتن در معرض دستکاری احتمالی هنگام عبور از دستگاه، به‌طور ایمن بازیابی کند.

در این سناریو، بازی شما از بازیکن می خواهد که طبق معمول وارد سرویس بازی های Google Play شود. هنگامی که پخش کننده با موفقیت وارد سیستم می شود، شی GoogleSignInAccount حاوی یک کد یکبار مصرف خاص (به نام کد تأیید اعتبار سرور ) است که مشتری به سرور ارسال می کند. سپس، در سرور، کد تأیید اعتبار سرور را با یک توکن OAuth 2.0 که سرور می‌تواند برای برقراری تماس با Google Play Games Services API استفاده کند، مبادله کنید.

برای راهنمایی بیشتر در مورد افزودن ورود به سیستم در بازی‌های خود، به ورود به سیستم در بازی‌های Android مراجعه کنید.

برای مشاهده یک نمونه کد دقیق که نحوه استفاده از Google Sign-In برای احراز هویت بازیکنان را نشان می دهد، به نمونه clientserverskeleton در GitHub مراجعه کنید.

برای دسترسی آفلاین مراحل زیر لازم است:

  1. در کنسول Google Play: یک اعتبار برای سرور بازی خود ایجاد کنید. نوع مشتری OAuth اعتبارنامه "وب" خواهد بود.
  2. در برنامه Android: به عنوان بخشی از ورود به سیستم، یک کد تأیید اعتبار سرور برای اعتبار سرور خود درخواست کنید و آن را به سرور خود ارسال کنید.
  3. در سرور بازی خود: کد تأیید اعتبار سرور را با یک نشانه دسترسی OAuth با استفاده از سرویس های تأیید اعتبار Google مبادله کنید و سپس از آن برای فراخوانی API های REST Services Games Play استفاده کنید.

قبل از اینکه شروع کنی

قبل از اینکه بتوانید Google Sign-In را در بازی خود ادغام کنید، ابتدا باید بازی خود را در کنسول Google Play اضافه کنید، همانطور که در راه اندازی خدمات بازی های Google Play توضیح داده شده است.

یک برنامه وب سمت سرور مرتبط برای بازی خود ایجاد کنید

خدمات بازی Google Play از بازی های وب پشتیبانی نمی کند. با این حال، پشتیبانی از سرور پشتیبان را برای سرور بازی اندروید شما فراهم می کند.

اگر می‌خواهید از REST API برای خدمات بازی‌های Google Play در برنامه سمت سرور خود استفاده کنید، این مراحل را دنبال کنید:

  1. یک برنامه وب مرتبط برای بازی خود در بخش برنامه های پیوندی کنسول Google Play ایجاد کنید. توجه داشته باشید که launch_url برای این جریان استفاده نمی شود و می توان آن را خالی گذاشت.
  2. برای دریافت اطلاعات اعتبار برنامه خود، این مراحل را دنبال کنید:
    1. از بازی خود در کنسول Google Play، روی جزئیات بازی کلیک کنید.
    2. به بخش API Console Project بروید و روی پیوند پروژه کنسول API کلیک کنید.
    3. از صفحه APIs & Services > Credentials در 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);
}

کد تایید سرور را دریافت کنید

برای بازیابی کد احراز هویت سرور که بازی شما می‌تواند از آن برای دسترسی به نشانه‌ها در سرور باطن خود استفاده کند، روش getServerAuthCode() را در شیء GoogleSignInAccount که 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();
    }
  }
}

کد احراز هویت سرور را با یک نشانه دسترسی در سرور مبادله کنید

کد احراز هویت سرور را به سرور باطن خود ارسال کنید تا توکن‌های دسترسی و به‌روزرسانی را مبادله کنند. از نماد دسترسی برای فراخوانی API خدمات بازی‌های Google Play از طرف بازیکن استفاده کنید و به صورت اختیاری، رمز بازخوانی را ذخیره کنید تا پس از منقضی شدن نشانه دسترسی، یک نشانه دسترسی جدید به دست آورید.

قطعه کد زیر نشان می دهد که چگونه می توانید کد سمت سرور را در زبان برنامه نویسی جاوا پیاده سازی کنید تا کد تأیید اعتبار سرور را برای توکن های دسترسی مبادله کنید. از برنامه نمونه کلاینت سرور سرور استفاده می کند:

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

برای کسب اطلاعات بیشتر در مورد دسترسی به APIهای Google از یک سرور پشتیبان از طرف بازیکنی که وارد سیستم شده است، به فعال کردن دسترسی سمت سرور مراجعه کنید.

خروج از سیستم پخش کننده را کنترل کنید

برای خروج بازیکنان از بازی خود، روش signOut() را در GoogleSignInClient فراخوانی کنید. برای نمونه کد، خروج از سیستم پخش کننده را ببینید.

API های REST را از سرور تماس بگیرید

برای توضیح کامل تماس‌های API موجود، به REST API برای خدمات بازی‌های Google Play مراجعه کنید.

نمونه‌هایی از تماس‌های REST API که ممکن است برای شما مفید باشد عبارتند از:

بازیکن

  • آیا می‌خواهید شناسه و اطلاعات نمایه بازیکن واردشده را دریافت کنید؟ با 'me' به عنوان شناسه با Players.get تماس بگیرید.

دوستان

مطمئن شوید که راهنمای دوستان را مرور کرده اید، که دوستان را با جزئیات بیشتری توضیح می دهد.

  • آیا می خواهید لیست دوستان بازیکن را بازیابی کنید؟ Players.list را با 'friends_all' به عنوان collection تماس بگیرید.
  • بررسی کنید که آیا به لیست دوستان دسترسی دارید؟ برای me با Players.get تماس بگیرید و به قسمت profileSettings.friendsListVisibility در پاسخ نگاه کنید.

دستاوردها

مطمئن شوید که راهنمای دستاوردها را مرور کرده اید، که دستاوردها را با جزئیات بیشتری توضیح می دهد.

  • آیا می خواهید لیستی از دستاوردهای فعلی دریافت کنید؟ می توانید با AchievementDefinitions.list تماس بگیرید.
  • آن را با یک تماس به Achievements.list ترکیب کنید تا متوجه شوید بازیکن کدام یک را باز کرده است.
  • آیا بازیکن دستاوردی کسب کرده است؟ از Achievements.unlock برای باز کردن آن استفاده کنید!
  • آیا بازیکن به سمت یک دستاورد جزئی پیشرفت کرده است؟ از Achievements.increment برای گزارش پیشرفت استفاده کنید (و متوجه شوید که آیا بازیکن قفل آن را باز کرده است).
  • آیا در حال رفع اشکال بازی هستید که هنوز تولید نشده است؟ سعی کنید با Achievements.reset یا Achievements.resetAll از APIهای مدیریت تماس بگیرید تا دستاوردها به حالت اولیه بازنشانی شوند.

تابلوهای امتیازات

مطمئن شوید که راهنمای تابلوهای امتیازات را مرور کرده اید، که تابلوهای امتیازات را با جزئیات بیشتری توضیح می دهد.

  • آیا می خواهید لیستی از تمام تابلوهای امتیاز بازی را دریافت کنید؟ با Leaderboards.list تماس بگیرید.
  • آیا بازیکن با بازی تمام شده است؟ شما می توانید امتیاز آنها را به Scores.submit ارسال کنید و متوجه شوید که آیا این یک امتیاز بالا جدید است یا خیر.
  • آیا می خواهید تابلوی امتیازات را نمایش دهید؟ داده ها را از Scores.list دریافت کرده و به کاربر نشان دهید.
  • از Scores.listWindow برای پیدا کردن مجموعه ای از نمرات نزدیک به امتیاز بالای کاربر استفاده کنید.
  • برای دریافت اطلاعات بیشتر در مورد امتیاز بازیکن در یک تابلوی امتیازات خاص (به عنوان مثال، اگر بازیکن در 12٪ برتر همه بازیکنان باشد)، با Scores.get تماس بگیرید.
  • آیا یک بازی را دیباگ می کنید؟ سعی کنید با Scores.reset از APIهای مدیریت تماس بگیرید تا همه امتیازات آن بازیکن از یک تابلوی امتیازات خاص بازنشانی شود.