Loopback IP Adresi akışı Taşıma Kılavuzu

Genel Bakış

16 Şubat 2022'de, daha güvenli OAuth akışları kullanarak Google OAuth etkileşimlerini daha güvenli hale getirme planlarımızı duyurmuştuk. Bu kılavuz, geri döngü IP adresi akışından desteklenen alternatiflere başarılı bir şekilde geçiş yapmak için gerekli değişiklikleri ve adımları anlamanıza yardımcı olur.

Bu çalışma, Google'ın OAuth 2.0 yetkilendirme uç noktalarıyla etkileşim sırasında kimlik avı ve uygulama taklidi saldırılarına karşı koruyucu bir önlemdir.

Geri Döngü IP Adresi akışı nedir?

Geri döngü IP adresi akışı, bir geri döngü IP adresinin veya localhost'nin, kimlik bilgilerinin bir kullanıcı OAuth izni isteğini onayladıktan sonra gönderildiği yönlendirme URI'sinin ana makine bileşeni olarak kullanılmasını destekler. Bu akış, bazı işletim sistemlerinde aynı geri döngü arayüzüne erişen kötü amaçlı bir uygulamanın, yetkilendirme sunucusundan verilen yönlendirme URI'sine gelen yanıtı yakalayıp yetkilendirme koduna erişebileceği ortadaki adam saldırılarına karşı savunmasızdır.

Loopback IP adresi akışı, yerel iOS, Android ve Chrome OAuth istemci türleri için kullanımdan kaldırılıyor ancak masaüstü uygulamalarında desteklenmeye devam edecek.

Uygunlukla ilgili önemli tarihler

  • 14 Mart 2022: Yeni OAuth istemcilerinin Loopback IP adresi akışını kullanması engellendi.
  • 1 Ağustos 2022: Uygun olmayan OAuth istekleri için kullanıcıya yönelik bir uyarı mesajı gösterilebilir.
  • 31 Ağustos 2022: 14 Mart 2022'den önce oluşturulan yerel Android, Chrome uygulaması ve iOS OAuth istemcileri için loopback IP adresi akışı engellendi.
  • 21 Ekim 2022: Tüm mevcut müşteriler (muaf tutulan müşteriler dahil) engellendi.

Uygun olmayan istekler için kullanıcıya yönelik bir hata mesajı gösterilir. Mesajda, Google API Konsolu'ndaki OAuth kullanıcı rızası ekranında kaydettiğiniz destek e-posta adresi gösterilirken uygulamanın engellendiği kullanıcıya bildirilir.

Taşıma sürecini tamamlamak için iki temel adım vardır:
  1. Etkilenip etkilenmediğinizi belirleyin.
  2. Etkileniyorsanız desteklenen bir alternatife geçin.

Etkilenip etkilenmediğinizi belirleme

OAuth istemci kimliği türünüzü inceleyin

Clients page bölümüne gidin ve Google Cloud Console bölümünde OAuth 2.0 İstemci Kimlikleri bölümünde OAuth istemci kimliği türünüzü görüntüleyin. Şunlardan biri olabilir: Web uygulaması, Android, iOS, Evrensel Windows Platformu (UWP), Chrome uygulaması, TV'ler ve sınırlı giriş cihazları, Masaüstü uygulaması.

İstemci türünüz Android, Chrome uygulaması veya iOS ise ve loopback IP adresi akışını kullanıyorsanız sonraki adıma geçin.

Masaüstü uygulaması OAuth istemcisinde geri döngü IP adresi akışını kullanıyorsanız bu desteğin sonlandırılmasıyla ilgili herhangi bir işlem yapmanız gerekmez. Bu OAuth istemcisi türüyle kullanım desteklenmeye devam edecektir.

Uygulamanızın geri döngü IP adresi akışını kullanıp kullanmadığını belirleme

Google OAuth yetkilendirme isteğinin uygulamanız tarafından yapılıp yapılmadığını belirlemek için uygulama kodunuzu veya giden ağ çağrısını (uygulamanız bir OAuth kitaplığı kullanıyorsa) inceleyin.

Uygulama kodunuzu inceleme

Uygulama kodunuzun Google OAuth yetkilendirme uç noktalarına çağrı yaptığınız bölümünü inceleyin ve redirect_uri parametresinin aşağıdaki değerlerden herhangi birine sahip olup olmadığını belirleyin:
  • redirect_uri=http://127.0.0.1:<port> ör. redirect_uri=http://127.0.0.1:3000
  • redirect_uri=http://[::1]:<port> ör. redirect_uri=http://[::1]:3000
  • redirect_uri=http://localhost:<port> ör. redirect_uri=http://localhost:3000
Örnek bir geri döngü IP adresi yönlendirme isteği aşağıdaki gibi görünür:
https://accounts.google.com/o/oauth2/v2/auth?
redirect_uri=http://localhost:3000&
response_type=code&
scope=<SCOPES>&
state=<STATE>&
client_id=<CLIENT_ID>

Giden ağ çağrısını inceleme

Ağ çağrılarını inceleme yöntemi, uygulama istemci türünüze bağlı olarak değişir.
Ağ çağrılarını incelerken Google OAuth yetkilendirme uç noktalarına gönderilen istekleri arayın ve redirect_uri parametresinin aşağıdaki değerlerden herhangi birine sahip olup olmadığını belirleyin:
  • redirect_uri=http://127.0.0.1:<port> ör. redirect_uri=http://127.0.0.1:3000
  • redirect_uri=http://[::1]:<port> ör. redirect_uri=http://[::1]:3000
  • redirect_uri=http://localhost:<port> ör. redirect_uri=http://localhost:3000
Örnek bir geri döngü IP adresi yönlendirme akışı isteği aşağıdaki gibi görünür:
https://accounts.google.com/o/oauth2/v2/auth?
redirect_uri=http://localhost:3000&
response_type=code&
scope=<SCOPES>&
state=<STATE>&
client_id=<CLIENT_ID>

Desteklenen bir alternatife geçiş yapma

Mobil istemciler (Android / iOS)

Uygulamanızın Android veya iOS OAuth istemci türüyle geri döngü IP adresi akışını kullandığını belirlerseniz önerilen SDK'ları (Android, iOS) kullanmaya geçmelisiniz.

SDK, Google API'lerine erişimi kolaylaştırır ve Google'ın OAuth 2.0 yetkilendirme uç noktalarına yapılan tüm çağrıları işler.

Aşağıdaki doküman bağlantılarında, Google API'lerine geri döngü IP adresi yönlendirme URI'si kullanmadan erişmek için önerilen SDK'ların nasıl kullanılacağı hakkında bilgi verilmektedir.

Android'de Google API'lerine erişme

İstemci tarafı erişimi

Aşağıdaki örnekte, önerilen Google Identity Services Android Kitaplığı kullanılarak Android'de istemci tarafında Google API'lerine nasıl erişileceği gösterilmektedir.

  List requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
    AuthorizationRequest authorizationRequest = AuthorizationRequest.builder().setRequestedScopes(requestedScopes).build();
    Identity.getAuthorizationClient(activity)
            .authorize(authorizationRequest)
            .addOnSuccessListener(
                authorizationResult -> {
                  if (authorizationResult.hasResolution()) {
                    // Access needs to be granted by the user
                    PendingIntent pendingIntent = authorizationResult.getPendingIntent();
                    try {
    startIntentSenderForResult(pendingIntent.getIntentSender(),
    REQUEST_AUTHORIZE, null, 0, 0, 0, null);
                    } catch (IntentSender.SendIntentException e) {
                    Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage());
                    }
                  } else {
                    // Access already granted, continue with user action
                    saveToDriveAppFolder(authorizationResult);
                  }
                })
            .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));

İçeriği kullanıcının Drive klasörüne kaydetmek için tanımladığınız yönteme authorizationResult değerini iletin. authorizationResult, erişim jetonunu döndüren getAccessToken() yöntemine sahiptir.

Sunucu tarafı (çevrimdışı) erişim
Aşağıdaki örnekte, Android'de sunucu tarafında Google API'lerine nasıl erişileceği gösterilmektedir.
  List requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
    AuthorizationRequest authorizationRequest = AuthorizationRequest.builder()
    .requestOfflineAccess(webClientId)
            .setRequestedScopes(requestedScopes)
            .build();
    Identity.getAuthorizationClient(activity)
            .authorize(authorizationRequest)
            .addOnSuccessListener(
                authorizationResult -> {
                  if (authorizationResult.hasResolution()) {
                    // Access needs to be granted by the user
                    PendingIntent pendingIntent = authorizationResult.getPendingIntent();
                    try {
    startIntentSenderForResult(pendingIntent.getIntentSender(),
    REQUEST_AUTHORIZE, null, 0, 0, 0, null);
                    } catch (IntentSender.SendIntentException e) {
                    Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage());
                    }
                  } else {
                    String authCode = authorizationResult.getServerAuthCode();
                  }
                })
            .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));

authorizationResult, erişim ve yenileme jetonu almak için arka ucunuza gönderebileceğiniz yetkilendirme kodunu döndüren getServerAuthCode() yöntemine sahiptir.

iOS uygulamasında Google API'lerine erişme

İstemci tarafı erişimi

Aşağıdaki örnekte, iOS'te istemci tarafında Google API'lerine nasıl erişileceği gösterilmektedir.

user.authentication.do { authentication, error in
  guard error == nil else { return }
  guard let authentication = authentication else { return }
  
  // Get the access token to attach it to a REST or gRPC request.
  let accessToken = authentication.accessToken
  
  // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
  // use with GTMAppAuth and the Google APIs client library.
  let authorizer = authentication.fetcherAuthorizer()
}

Erişim jetonunu bir REST veya gRPC isteğinin üstbilgisine ekleyerek (Authorization: Bearer ACCESS_TOKEN) ya da REST için Objective-C için Google API'leri istemci kitaplığı ile fetcher yetkilendiricisini (GTMFetcherAuthorizationProtocol) kullanarak API'yi çağırmak için erişim jetonunu kullanın.

İstemci tarafında Google API'lerine nasıl erişileceği hakkında istemci tarafı erişim kılavuzunu inceleyin. Google API'lerine istemci tarafında nasıl erişileceği hakkında bilgi edinin.

Sunucu tarafı (çevrimdışı) erişim
Aşağıdaki örnekte, bir iOS istemcisini desteklemek için sunucu tarafında Google API'lerine nasıl erişileceği gösterilmektedir.
GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { user, error in
  guard error == nil else { return }
  guard let user = user else { return }
  
  // request a one-time authorization code that your server exchanges for
  // an access token and refresh token
  let authCode = user.serverAuthCode
}

Google API'lerine sunucu tarafından nasıl erişileceği hakkında sunucu tarafı erişim kılavuzunu inceleyin.

Chrome Uygulaması İstemcisi

Uygulamanızın Chrome uygulama istemcisinde loopback IP adresi akışını kullandığını belirlerseniz Chrome Identity API'yi kullanmaya geçmelisiniz.

Aşağıdaki örnekte, geri döngü IP adresi yönlendirme URI'si kullanılmadan tüm kullanıcı kişilerinin nasıl alınacağı gösterilmektedir.

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {

  
  // retrieve access token
  chrome.identity.getAuthToken({interactive: true}, function(token) {
  
  // ..........


  // the example below shows how to use a retrieved access token with an appropriate scope
  // to call the Google People API contactGroups.get endpoint

  fetch(
    'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=API_KEY',
    init)
    .then((response) => response.json())
    .then(function(data) {
      console.log(data)
    });
   });
 });
};

Kullanıcıların kimliğini doğrulama ve Chrome Identity API ile Google uç noktalarını çağırma hakkında daha fazla bilgi edinmek için Chrome Identity API kılavuzunu inceleyin.