GoogleAuthUtil ve Plus.API'den taşıma

Geçmişte GoogleAuthUtil.getToken veya Plus.API'ü kullanarak Google ile oturum açma özelliğini entegre ettiyseniz daha fazla güvenlik ve daha iyi bir kullanıcı deneyimi için en yeni oturum açma API'sine geçmeniz gerekir.

Erişim jetonu anti-pattern'inden taşıma

GoogleAuthUtil.getToken ile elde edilen erişim jetonlarını, kimlik beyanı olarak arka uç sunucunuza göndermemelisiniz. Çünkü jetonun arka ucunuza verildiğini kolayca doğrulayamazsınız. Bu da saldırgan tarafından erişim jetonu eklenmesine karşı savunmasız olmanıza neden olur.

Örneğin, Android kodunuz aşağıdaki örneğe benziyorsa uygulamanızı mevcut en iyi uygulamalara taşımanız gerekir.

Android kodu

Örnekte, erişim jetonu isteklerinde oauth2: ve GoogleAuthUtil.getToken çağrısı (oauth2:https://www.googleapis.com/auth/plus.login) için scope parametresi olarak bir kapsam dizesi kullanılır.

GoogleAuthUtil.getToken ile edinilen erişim jetonuyla kimlik doğrulaması yapmak yerine kimlik jetonu akışını veya yetkilendirme kodu akışını kullanın.

Kimlik jetonu akışına geçiş

Yalnızca kullanıcının kimliği, e-posta adresi, adı veya profil resmi URL'si gerekiyorsa kimlik jetonu akışını kullanın.

Kimlik jetonu akışına geçmek için aşağıdaki değişiklikleri yapın:

Android istemci tarafı

  • İstekte bulunursanız GET_ACCOUNTS (Kişiler) iznini kaldırın
  • GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() veya AccountManager.newChooseAccountIntent() kullanan tüm kodları GoogleSignInOptions.Builder.requestIdToken(...) yapılandırmasıyla Auth.GOOGLE_SIGN_IN_API olarak değiştirin.

Sunucu tarafı

Sunucu kimlik doğrulama kodu akışına geçiş

Sunucunuzun Google Drive, YouTube veya Kişiler gibi diğer Google API'lerine erişmesi gerekiyorsa sunucu kimlik doğrulama kodu akışını kullanın.

Sunucu kimlik doğrulama kodu akışına geçmek için aşağıdaki değişiklikleri yapın:

Android istemci tarafı

  • İsterseniz GET_ACCOUNTS (Kişiler) iznini kaldırabilirsiniz
  • GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() veya AccountManager.newChooseAccountIntent() kullanan tüm kodları GoogleSignInOptions.Builder.requestServerAuthCode(...) yapılandırmasıyla Auth.GOOGLE_SIGN_IN_API olarak değiştirin.

Sunucu tarafı

API erişim mantığını eski ve yeni uç noktalarınız arasında paylaşmaya devam edebilirsiniz. Örneğin:

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(...);
String accessToken = tokenResponse.getAccessToken();
String refreshToken = tokenResponse.getRefreshToken();
Long expiresInSeconds = tokenResponse.getExpiresInSeconds();

// Shared by your old and new implementation, old endpoint can pass null for refreshToken
private void driveAccess(String refreshToken, String accessToken, Long expiresInSeconds) {
   GoogleCredential credential = new GoogleCredential.Builder()
           .setTransPort(...)
           ...
           .build();
   credential.setAccessToken(accessToken);
   credential.setExpiresInSeconds(expiresInSeconds);
   credential.setRefreshToken(refreshToken);
}

GoogleAuthUtil kimlik jetonu akışından geçiş yapma

Kimlik jetonları almak için GoogleAuthUtil kullanıyorsanız yeni Sign-In API kimlik jetonu akışına geçmeniz gerekir.

Örneğin, Android kodunuz aşağıdaki örnek gibiyse taşıma işlemini yapmanız gerekir:

Android kodu

Örnekte, kimlik jetonu isteklerinde audience:server:client_id ve web sunucunuzun istemci kimliği, GoogleAuthUtil.getToken çağrısının (audience:server:client_id:9414861317621.apps.googleusercontent.com) "scope" parametresi olarak kullanılır.

Yeni Oturum Açma API'si kimliği jeton akışı aşağıdaki avantajları sağlar:

  • Tek dokunuşla daha kolay oturum açma deneyimi
  • Sunucunuz, ek bir ağ çağrısı yapmadan kullanıcı profili bilgilerini alabilir

Kimlik jetonu akışına geçiş yapmak için aşağıdaki değişiklikleri yapın:

Android istemci tarafı

  • İstekte bulunursanız GET_ACCOUNTS (Kişiler) iznini kaldırın
  • GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() veya AccountManager.newChooseAccountIntent() kullanan tüm kodları GoogleSignInOptions.Builder.requestIdToken(...) yapılandırmasıyla Auth.GOOGLE_SIGN_IN_API olarak değiştirin.

Sunucu tarafı

Kullanımdan kaldırılmış bir biçim kullanan GoogleAuthUtil.getToken'nin aksine, yeni Oturum Açma API'si, COPPA Connect spesifikasyonuna uygun kimlik jetonları yayınlar. Özellikle, https://accounts.google.com kimlikli ve https şemasına sahip bir banka var.

Taşıma işleminiz sırasında sunucunuzun hem eski hem de yeni Android istemcilerinizden gelen kimlik jetonunu doğrulaması gerekir. Jetonun her iki biçimini de doğrulamak için kullandığınız istemci kitaplığına (kullanıyorsanız) karşılık gelen değişikliği yapın:

  • Java (Google API'leri İstemci Kitaplıkları): 1.21.0 veya sonraki bir sürüme yükseltin
  • PHP (Google API'leri İstemci Kitaplıkları): 1. sürümü kullanıyorsanız 1.1.6 veya daha yeni bir sürüme, 2. sürümü kullanıyorsanız 2.0.0-RC1 veya daha yeni bir sürüme geçin
  • Node.js: 0.9.7 veya daha yeni bir sürüme yükseltme
  • Python veya kendi uygulamalarınız: Şu veren verenlerin ikisini de kabul edin: https://accounts.google.com ve accounts.google.com

GoogleAuthUtil sunucu kimlik doğrulama kodu akışından geçiş yapma

Sunucu kimlik doğrulama kodu almak için GoogleAuthUtil kullanıyorsanız yeni Oturum Açma API'si kimlik doğrulama kodu akışına geçmeniz gerekir.

Örneğin, Android kodunuz aşağıdaki örneğe benziyorsa taşıma işlemi yapmanız gerekir:

Android kodu

Örnekte, sunucu kimlik doğrulama kodu istekleri GoogleAuthUtil.getToken çağrısı (oauth2:server:client_id:9414861317621.apps.googleusercontent.com) için scope parametresi olarak oauth2:server:client_id ve web sunucunuzun istemci kimliğini kullanmaktadır.

Yeni Sign-In API kimlik doğrulama kodu akışı aşağıdaki avantajlara sahiptir:

  • Basitleştirilmiş tek dokunuşla oturum açma deneyimi
  • Aşağıdaki taşıma kılavuzunu uygularsanız sunucunuz, kimlik doğrulama kodu değişimi yaptığınızda kullanıcının profil bilgilerini içeren bir kimlik jetonu alabilir.

Yeni kimlik doğrulama kodu akışına geçmek için aşağıdaki değişiklikleri yapın:

Android istemci tarafı

  • İsterseniz GET_ACCOUNTS (Kişiler) iznini kaldırabilirsiniz
  • GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() veya AccountManager.newChooseAccountIntent() kullanan tüm kodları GoogleSignInOptions.Builder.requestServerAuthCode(...) yapılandırmasıyla Auth.GOOGLE_SIGN_IN_API olarak değiştirin.

Sunucu tarafı

Mevcut kodunuzu koruyun ancak GoogleAuthorizationCodeTokenRequest nesnesini oluştururken jeton sunucusu uç noktası olarak https://oauth2.googleapis.com/token değerini belirtin. Böylece başka bir ağ çağrısına gerek kalmadan kullanıcının e-postası, kullanıcı kimliği ve profil bilgileriyle bir kimlik jetonu alabilirsiniz. Bu uç nokta tamamen geriye dönük uyumludur ve aşağıdaki kod, hem eski hem de yeni Android istemci uygulamalarınızdan alınan sunucu kimlik doğrulama kodları için çalışır.

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
                transport,
                jsonFactory,
                // Use below for tokenServerEncodedUrl parameter
                "https://oauth2.googleapis.com/token",
                clientSecrets.getDetails().getClientId(),
                clientSecrets.getDetails().getClientSecret(),
                authCode,
                REDIRECT_URI)
               .execute();

...

// You can also get an ID token from auth code exchange.
GoogleIdToken googleIdToken = tokenResponse.parseIdToken();
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(SERVER_CLIENT_ID))
        .setIssuer("https://accounts.google.com")
        .build();
// Refer to ID token documentation to see how to get data from idToken object.
GoogleIdToken idToken = verifier.verify(idTokenString);
...