Oyuncuların kimliğini doğrulamak ve oyuncunun kimliğini arka uç sunucusuna güvenli bir şekilde aktarmak için PgsGamesSignInClient'ı kullanmanızı öneririz. Bu sayede oyununuz, cihazdan geçerken olası kurcalama işlemlerine maruz kalmadan oyuncunun kimliğini ve diğer verilerini güvenli bir şekilde alabilir.
Oyuncu kimlik doğrulama işlemini başarıyla tamamladıktan sonra Play Games Hizmetleri v2 Yerel SDK'sından (beta) istemcinin sunucuya ilettiği özel bir tek kullanımlık kod (sunucu yetkilendirme kodu olarak adlandırılır) isteyebilirsiniz. Ardından, sunucuda sunucu kimlik doğrulama kodunu, sunucunun Google Play Games Hizmetleri API'sine çağrı yapmak için kullanabileceği bir OAuth 2.0 jetonuyla değiştirin.
Oyunlarınıza kimlik doğrulama ekleme hakkında daha fazla bilgi için Platform kimlik doğrulaması başlıklı makaleyi inceleyin.
Çevrimdışı erişim için aşağıdaki adımlar gereklidir:
- Google Play Console'da: Oyun sunucunuz için bir kimlik bilgisi oluşturun. Kimliğin OAuth istemci türü "web" olur.
- Android uygulamasında: Platform kimlik doğrulamasının bir parçası olarak sunucunuzun kimlik bilgisi için bir sunucu kimlik doğrulama kodu isteyin ve bunu sunucunuza iletin.
PgsGamesSignInClient, Play Games Hizmetleri web API'lerine sunucu tarafı erişimi istenirken üç OAuth 2.0 kapsamı isteyebilir. İsteğe bağlı kapsamlarPGS_AUTH_SCOPE_EMAIL,PGS_AUTH_SCOPE_PROFILEvePGS_AUTH_SCOPE_OPENID'dir. İki varsayılan kapsamDRIVE_APPFOLDERveGAMES_LITE'dir. - Oyun sunucunuzda: Google kimlik doğrulama hizmetlerini kullanarak sunucu yetkilendirme kodunu OAuth erişim jetonuyla değiştirin ve ardından Play Games Hizmetleri REST API'lerini çağırmak için bu jetonu kullanın.
Başlamadan önce
Öncelikle oyununuzu Google Play Console'a eklemeniz gerekir. Bu işlem, Google Play Games Hizmetleri'ni oyununuzla birlikte ayarlama başlıklı makalede açıklanmıştır.
Sunucu tarafı web uygulaması oluşturma
Google Play Games Hizmetleri, web oyunları için arka uç desteği sağlamaz. Ancak Android oyununuzun sunucusu için arka uç sunucusu desteği sağlar.
Sunucu tarafı uygulamanızda Google Play Games hizmetleri için REST API'leri'ni kullanmak istiyorsanız aşağıdaki adımları uygulayın:
- Google Play Console'da bir oyun seçin.
- Play Games Hizmetleri > Kurulum ve yönetim > Yapılandırma'ya gidin.
- Kimlik bilgisi ekle'yi seçerek Kimlik bilgisi ekle sayfasına gidin.
Kimlik bilgisi türü olarak Oyun sunucusu'nu seçin ve Yetkilendirme bölümüne geçin.
- Oyun sunucunuzda zaten bir OAuth istemci kimliği varsa açılır menüden bu kimliği seçin. Değişikliklerinizi kaydettikten sonra sonraki bölüme geçin.
- Oyun sunucunuz için mevcut bir OAuth istemci kimliğiniz yoksa oluşturabilirsiniz.
- OAuth istemcisi oluştur'u tıklayın ve OAuth istemci kimliği oluşturma bağlantısını izleyin.
- Bu işlem sizi Google Cloud Platform'un oyununuzla ilişkili projeniz için OAuth istemci kimliği oluşturma sayfasına yönlendirir.
- Sayfadaki formu doldurun ve oluştur'u tıklayın. Uygulama türünü Web uygulaması olarak ayarladığınızdan emin olun.
- Kimlik bilgisi ekleme sayfasının Yetkilendirme bölümüne dönün, yeni oluşturulan OAuth istemcisini seçin ve değişikliklerinizi kaydedin.
Sunucu yetkilendirme kodunu alma
Oyununuzun arka uç sunucunuzdaki erişim jetonları için kullanabileceği bir sunucu yetkilendirme kodunu almak üzere:
- İstemciden
PgsGamesSignInClient_requestServerSideAccessnumaralı telefonu arayın.- Android uygulamanızın OAuth istemci kimliğini değil, oyun sunucunuz için kayıtlı OAuth istemci kimliğini kullandığınızdan emin olun.
- (İsteğe bağlı) Oyun sunucunuzun Play Games Hizmetleri'ne çevrimdışı erişim (yenileme jetonu kullanılarak uzun süreli erişim) gerektirmesi durumunda
force_refresh_tokenparametresini true olarak ayarlayabilirsiniz.
(İsteğe bağlı) Kimlik doğrulama kapsamında, yeni kullanıcılar ek kapsamlar için tek bir izin ekranıyla karşılaşmalıdır. İzni kabul ettiğinizde
PGS_AUTH_SCOPE_EMAIL,PGS_AUTH_SCOPE_PROFILEvePGS_AUTH_SCOPE_OPENIDOAuth kapsamlarıylaPgsAuthScopescopesparametresini ayarlarsınız. Kullanıcılar izin vermeyi reddederse arka uca yalnızca iki varsayılan kapsamDRIVE_APPFOLDERveGAMES_LITEgönderilir.
Ek OAuth kapsamları için izin ekranı. (Büyütmek için tıklayın). // #include "google/games/pgs_games_sign_in_client.h" // 1. Define the Callback // This function is called when the server-side access request completes. // It provides the authorization code (on success) or an error (on failure). void OnServerSideAccessCallback(void* context, PgsError error, const char* serverAuthCode) { if (error == PgsError_Success) { if (serverAuthCode != nullptr) { __android_log_print(ANDROID_LOG_INFO, "Games", "Received Server Auth Code: %s", serverAuthCode); // Send 'serverAuthCode' to your backend server immediately. // Your server will exchange this code for an OAuth access token. } } else { __android_log_print(ANDROID_LOG_ERROR, "Games", "Failed to get server auth code. Error: %d", error); } } // 2. Define the Wrapper Function void RequestServerAccess(PgsGamesSignInClient* signInClient) { if (signInClient == nullptr) { return; } // This must match the "Web client ID" from your Google Cloud Console // (linked to your Play Console Game Server Credential). const char* SERVER_CLIENT_ID = "xxxx"; // Set to 'true' if your server needs a Refresh Token (long-lived access). // Set to 'false' if you only need an Access Token (short-lived). bool forceRefreshToken = false; // Call the API PgsGamesSignInClient_requestServerSideAccess( signInClient, SERVER_CLIENT_ID, forceRefreshToken, OnServerSideAccessCallback, // The callback defined nullptr // User context (optional, passed to callback) ); } // 3. Example Usage void TriggerSignInProcess(PgsGamesClient* gamesClient) { // Obtain the Sign-In Client from the main Games Client PgsGamesSignInClient* signInClient = PgsGamesClient_getSignInClient(gamesClient); RequestServerAccess(signInClient); }
OAuth kimlik doğrulama kodu jetonunu, değiştirilebilmesi, oyuncu kimliğinin Play Games Hizmetleri REST API'lerine karşı doğrulanması ve ardından oyununuzla kimliğinin doğrulanması için arka uç sunucunuza gönderin.
Sunucu yetkilendirme kodunu gönderme
Erişim ve yenileme jetonlarıyla değiştirmek için sunucu yetkilendirme kodunu arka uç sunucunuza gönderin. Erişim jetonunu kullanarak oyuncu adına Play Games Hizmetleri API'sini çağırın ve isteğe bağlı olarak, erişim jetonunun süresi dolduğunda yeni bir erişim jetonu almak için yenileme jetonunu saklayın.
Oyuncu kimliklerinin işleyiş şekli hakkında daha fazla bilgi için Yeni nesil oyuncu kimlikleri başlıklı makaleyi inceleyin.
Aşağıdaki kod snippet'inde, sunucu yetkilendirme kodunu erişim jetonlarıyla değiştirmek için sunucu tarafı kodunun C++ programlama dilinde nasıl uygulanabileceği gösterilmektedir.
Java
/** * 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 Cloud // 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; }
GoogleIdTokenVerifier nesnesini almak için Java veya Python'daki Google API İstemci Kitaplıklarını kullanarak OAuth kapsamlarını alabilirsiniz. Aşağıdaki kod snippet'inde, Java programlama dilindeki uygulama gösterilmektedir.
Java
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."); } }
Sunucudan REST API'lerini çağırma
Kullanılabilir API çağrılarının tam açıklaması için Google Play Games hizmetleri için REST API'ler başlıklı makaleyi inceleyin.
Faydalı bulabileceğiniz REST API çağrılarına örnekler:
Oyuncu
Oyuncunun kimliği ve profil verileriyle kimlik doğrulaması yapmak mı istiyorsunuz? Kimlik olarak 'me' ile Players.get'i çağırın.
Başarılar
Ayrıntılar için Başarılar kılavuzuna bakın.
Mevcut başarıların listesini almak için AchievementDefinitions.list yöntemini çağırın.
Oyuncunun kilidini açtığı başarıları öğrenmek için bunu Achievements.list çağrısıyla birleştirin.
Oyuncu başarısının kilidini açmak için Achievements.unlock'u çağırın.
Bir başarıdaki ilerlemeyi bildirmek ve oyuncunun başarı kilidini açıp açmadığını öğrenmek için Achievements.increment'ı çağırın.
Üretim aşamasına ulaşmamış bir oyunda hata ayıklama yapıyorsanız başarıları orijinal durumlarına sıfırlamak için Management API'lerden Achievements.reset veya Achievements.resetAll'u çağırabilirsiniz.