游戏服务返回的玩家ID是否可以被破解
Can Player ID returned by Game service be hacked
我在我的游戏中实现了Google游戏服务,我想知道游戏服务返回的玩家ID是否可以被破解?
我将使用该 ID 从数据库中检索玩家数据。我知道我可以请求 ID 令牌并使用它来验证玩家身份,方法是将它发送到服务器并在那里进行验证。但是,请求 ID 令牌会要求用户允许该应用 "Know who you are on Google",而我不想显示该权限。
您真正想要使用的是服务器授权码。流量为:
用户在设备上正常登录您的游戏。当你
建立客户端连接,请求 ServerAuthCode。成为
产生。
String webclientId = getString(R.string.webclient_id);
// Request authCode so we can send the code to the server.
GoogleSignInOptions options = new GoogleSignInOptions
.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
.requestServerAuthCode(webclientId)
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Games.API)
.addApi(Auth.GOOGLE_SIGN_IN_API, options)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
登录完成后获取授权码并将授权码发送到服务器。
@Override
protected void onActivityResult(int requestCode, int responseCode,
Intent intent) {
if (requestCode == RC_SIGN_IN) {
Log.d(TAG, "onActivityResult RC_SIGN_IN, responseCode="
+ responseCode + ", intent=" + intent);
GoogleSignInResult result =
Auth.GoogleSignInApi.getSignInResultFromIntent(intent);
if (result.isSuccess()) {
sendToServer(result.getSignInAccount().getServerAuthCode(););
} else {
showSignInError(result.getStatus().getStatusCode());
}
在服务器上交换该用户的访问令牌的授权码。
GoogleTokenResponse tokenResponse =
new GoogleAuthorizationCodeTokenRequest(
HTTPTransport,
JacksonFactory.getDefaultInstance(),
"https://www.googleapis.com/oauth2/v4/token",
clientSecrets.getDetails().getClientId(),
clientSecrets.getDetails().getClientSecret(),
authCode,
"")
.execute();
服务器然后可以验证访问令牌以获取用户的 ID
安全地。
ApplicationVerifyResponse resp = gamesAPI.applications().verify
(applicationId).execute();
Log.d(TAG, "The player id is " + resp.getPlayerId());
在 GitHub 中有一个演示如何执行此操作的示例:https://github.com/playgameservices/clientserverskeleton
我在我的游戏中实现了Google游戏服务,我想知道游戏服务返回的玩家ID是否可以被破解?
我将使用该 ID 从数据库中检索玩家数据。我知道我可以请求 ID 令牌并使用它来验证玩家身份,方法是将它发送到服务器并在那里进行验证。但是,请求 ID 令牌会要求用户允许该应用 "Know who you are on Google",而我不想显示该权限。
您真正想要使用的是服务器授权码。流量为:
用户在设备上正常登录您的游戏。当你 建立客户端连接,请求 ServerAuthCode。成为 产生。
String webclientId = getString(R.string.webclient_id); // Request authCode so we can send the code to the server. GoogleSignInOptions options = new GoogleSignInOptions .Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) .requestServerAuthCode(webclientId) .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Games.API) .addApi(Auth.GOOGLE_SIGN_IN_API, options) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build();
登录完成后获取授权码并将授权码发送到服务器。
@Override protected void onActivityResult(int requestCode, int responseCode, Intent intent) { if (requestCode == RC_SIGN_IN) { Log.d(TAG, "onActivityResult RC_SIGN_IN, responseCode=" + responseCode + ", intent=" + intent); GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(intent); if (result.isSuccess()) { sendToServer(result.getSignInAccount().getServerAuthCode();); } else { showSignInError(result.getStatus().getStatusCode()); }
在服务器上交换该用户的访问令牌的授权码。
GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest( HTTPTransport, JacksonFactory.getDefaultInstance(), "https://www.googleapis.com/oauth2/v4/token", clientSecrets.getDetails().getClientId(), clientSecrets.getDetails().getClientSecret(), authCode, "") .execute();
服务器然后可以验证访问令牌以获取用户的 ID 安全地。
ApplicationVerifyResponse resp = gamesAPI.applications().verify (applicationId).execute(); Log.d(TAG, "The player id is " + resp.getPlayerId());
在 GitHub 中有一个演示如何执行此操作的示例:https://github.com/playgameservices/clientserverskeleton