ننصحك بمصادقة اللاعبين وتمرير هوية المشغل بشكل آمن إلى خادم الخلفية. وهذا يمكّن لعبتك لاسترداد هوية اللاعب وبياناته الأخرى بأمان بدون إمكانية التلاعب بالجهاز أثناء المرور
في هذا السيناريو، بعد تسجيل اللاعب الدخول بنجاح، يمكنك طلب رمز خاص يُستخدم لمرة واحدة (يُسمى رمز مصادقة الخادم) من "ألعاب Play" حزمة SDK للإصدار 2 من الخدمات، والتي يمررها العميل إلى الخادم. ثم، على الخادم، تبادل رمز مصادقة الخادم برمز OAuth 2.0 المميز الذي يمكن للخادم استخدامه إجراء اتصالات بواجهة برمجة التطبيقات لخدمات ألعاب Google Play.
للحصول على إرشادات إضافية حول إضافة تسجيل الدخول في ألعابك، يمكنك الاطّلاع على تسجيل الدخول إلى "ألعاب Android"
الخطوات التالية مطلوبة للوصول إلى المحتوى بلا إنترنت:
- في Google Play Console: أنشِئ بيانات اعتماد لخادم لعبتك. سيكون نوع عميل OAuth الخاص ببيانات الاعتماد هو "الويب".
- في تطبيق Android: كجزء من تسجيل الدخول، اطلب رمز مصادقة الخادم بيانات اعتماد الخادم، وتمريرها إلى الخادم.
- على خادم اللعبة: استبدال رمز مصادقة الخادم للدخول عبر بروتوكول OAuth باستخدام خدمات المصادقة من Google، ثم استخدم هذا الرقم لطلب خدمات ألعاب Play واجهات برمجة تطبيقات RST
قبل البدء
عليك أولاً إضافة لعبتك إلى Google Play Console كما هو موضّح في إعداد "خدمات ألعاب Google Play" يمكنك دمج ميزة تسجيل الدخول إلى "خدمات ألعاب Play" مع لعبتك.
إنشاء تطبيق ويب من جهة الخادم
لا توفّر "خدمات ألعاب Google Play" خلفية لألعاب الويب. ومع ذلك، فهي تتيح دعم خادم الخلفية لخادم ألعاب Android.
إذا كنت تريد استخدام صفحة واجهات برمجة تطبيقات REST الخاصة بـ "خدمات ألعاب Google Play" في التطبيق من جهة الخادم، اتّبِع الخطوات التالية:
- من لعبتك في Google Play Console، انتقِل إلى خدمات ألعاب Play >. الإعداد والإدارة > الإعدادات:
- اختَر إضافة بيانات اعتماد ليتم نقلك إلى صفحة إضافة بيانات اعتماد. اختَر خادم الألعاب كنوع بيانات الاعتماد وانتقِل إلى قسم التفويض.
- إذا كان خادم لعبتك يتضمّن معرّف عميل OAuth، اختَره من القائمة المنسدلة. بعد حفظ التغييرات، انتقِل إلى القسم التالي.
- إذا لم يكن لديك معرِّف عميل OAuth حالي لخادم الألعاب، يمكنك إنشاء معرِّف.
- انقر على إنشاء عميل OAuth واتّبِع الرابط إنشاء معرّف عميل OAuth.
- سيؤدي ذلك إلى نقلك إلى صفحة إنشاء معرّف عميل OAuth في Google Cloud Platform لمشروع Cloud Platform المرتبط بلعبتك.
- املأ نموذج الصفحة وانقر على "إنشاء". تأكَّد من ضبط نوع التطبيق على "تطبيق الويب".
- ارجع إلى قسم إضافة تفويض في صفحة بيانات الاعتماد، واختَر عميل OAuth الذي تم إنشاؤه حديثًا واحفظ التغييرات.
الحصول على رمز مصادقة الخادم
لاسترداد رمز مصادقة الخادم الذي يمكن للعبتك استخدامه لرموز الدخول على خادم الخلفية:
يمكنك الاتصال بالرقم
requestServerSideAccess
من العميل.- تأكَّد من استخدام معرّف عميل OAuth المسجَّل لخادم الألعاب وليس معرّف عميل OAuth لتطبيق Android.
- (اختياري) إذا كان خادم لعبتك يتطلب الوصول إلى "خدمات ألعاب Play" بلا اتصال بالإنترنت (إمكانية الوصول لفترة طويلة باستخدام رمز مميّز للتحديث) إلى "خدمات ألعاب Play"، يمكنك ضبط مَعلمة 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. } });
أرسِل الرمز المميز لرمز مصادقة OAuth إلى خادم الخلفية حتى يتم تبادله، والتحقق من معرّف اللاعب مقابل واجهات برمجة تطبيقات REST في "خدمات ألعاب Play"، ثم المصادقة على اللعبة.
إرسال رمز مصادقة الخادم
أرسل رمز مصادقة الخادم إلى خادم الخلفية للحصول على إمكانية الوصول الرموز المميزة للتحديث. استخدام رمز الدخول لطلب واجهة برمجة تطبيقات "خدمات ألعاب Play" على بالنيابة عن اللاعب، وتخزين الرمز المميز للتحديث اختياريًا للحصول على رمز مميز جديد رمز الدخول عند انتهاء صلاحية رمز الدخول.
يوضح مقتطف الرمز التالي كيفية تنفيذ الرمز من جهة الخادم في لغة برمجة 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 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 من الخادم
يُرجى الاطّلاع على واجهات برمجة تطبيقات REST لخدمات "ألعاب Google Play". للحصول على وصف كامل لطلبات البيانات من واجهة برمجة التطبيقات المتاحة.
في ما يلي أمثلة على طلبات واجهة برمجة التطبيقات REST API التي قد تكون مفيدة:
اللاعب
هل تريد الحصول على رقم تعريف اللاعب الذي سجّل الدخول وبيانات الملف الشخصي؟ الاتصال بـ [Players.get][]
مع 'me'
كرقم التعريف.
الأصدقاء
راجِع دليل الأصدقاء لمزيد من التفاصيل.
لاسترداد قائمة أصدقاء اللاعب، اتصل Players.list (قائمة اللاعبين) مع
friends_all
باعتبارهcollection
.للتحقق من إمكانية وصولك إلى قائمة الأصدقاء، اتصل Players.get مع
me
باعتبارهاplayerID
، عرضprofileSettings.friendsListVisibility
الحقل في الرد.
الإنجازات
ويمكنك الاطّلاع على دليل الإنجازات لمعرفة التفاصيل.
للحصول على قائمة بالإنجازات الحالية، اتصل مصدر الإنجازات.
اجمع بين ذلك وبين مكالمة قائمة الإنجازات لمعرفة الألعاب التي ألغاها اللاعب.
اتصل الإنجازات.فتح القفل للكشف عن إنجاز لاعب.
اتصل الإنجازات.تزايد للإبلاغ عن التقدم المحرز في أحد الإنجازات ومعرفة ما إذا كان اللاعب قد فتح قفله.
إذا كنت بصدد تصحيح أخطاء لعبة لم تصل إلى مرحلة الإصدار العلني، يمكنك طلب Achievements.reset أو الإنجازات.إعادة ضبط الكل من واجهات برمجة تطبيقات الإدارة لإعادة ضبط الإنجازات إلى حالتها الأصلية.
لوحات الصدارة
راجِع دليل لوحات الصدارة للحصول على التفاصيل.
هل تريد الحصول على قائمة بجميع لوحات النتائج في اللعبة؟ إجراء مكالمة مع Leaderboards.list
إذا أنهى لاعب إحدى الألعاب، يمكنك إرسال نتيجته إلى Scores.submit ومعرفة ما إذا كانت هذه نتيجة عالية جديدة.
لعرض لوحة صدارة، احصل على البيانات من Scores.list وإظهاره للمستخدم.
استخدام Scores.listWindow للعثور على مجموعة متنوعة من الدرجات القريبة من أعلى نتيجة للمستخدم.
للحصول على مزيد من المعلومات حول نتيجة اللاعب في لوحة صدارة معينة (على سبيل المثال، إذا كان اللاعب ضمن أعلى 12% من جميع اللاعبين)، فاطلب Scores.get:
في حال تصحيح أخطاء لعبة، يمكنك استدعاء Scores.reset من "واجهات برمجة تطبيقات الإدارة" لإعادة ضبط كل النتائج لهذا اللاعب من قائمة الصدارة