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, loopback IP adresi akışından desteklenen alternatiflere başarılı bir şekilde taşıma yapmak için gereken değişiklikleri ve adımları anlamanıza yardımcı olur.

Bu çalışma, Google'ın OAuth 2.0 yetkilendirme uç noktalarıyla etkileşimler sırasında kimlik avı ve uygulama kimliğine bürünme saldırılarına karşı koruyucu bir önlemdir.

Geri döngü IP adresi akışı nedir?

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

Loopback IP adresi akışı 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 geri döngü IP adresi akışını kullanması engellenecek.
  • 1 Ağustos 2022: Uyumlu olmayan OAuth istekleri için kullanıcılara yönelik bir uyarı mesajı gösterilebilir.
  • 31 Ağustos 2022: 14 Mart 2022'den önce oluşturulan Android, Chrome uygulaması ve iOS OAuth istemcileri için loopback IP adresi akışı engellenir.
  • 21 Ekim 2022: Mevcut tüm istemciler (muaf tutulan istemciler dahil) engellenir.

Uyumlu olmayan istekler için kullanıcılara yönelik bir hata mesajı gösterilir. Mesaj, kullanıcılara uygulamanın engellendiğini bildirir ve Google Cloud Console'daki OAuth kullanıcı rızası ekranında kaydettiğiniz destek e-posta adresini gösterir.

Geçiş sürecini tamamlamak için iki ana adım vardır:

  1. Bu durumdan etkilenip etkilenmediğinizi belirleyin.
  2. Bu durumdan etkileniyorsanız desteklenen bir alternatife geçin.

Bu durumdan etkilenip etkilenmediğinizi belirleme

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

Google Cloud Console'un İstemciler sayfasına gidin ve OAuth 2.0 istemci kimlikleri bölümünde OAuth istemci kimliği türünüzü görüntüleyin. Şunlardan biri olacaktır: 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 loopback IP adresi akışını kullanıyorsanız bu desteği sonlandırma işlemiyle ilgili herhangi bir işlem yapmanız gerekmez. Bu OAuth istemci türüyle kullanım desteklenmeye devam edecektir.

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

Uygulamanızın yaptığı Google OAuth yetkilendirme isteğinin geri döngü yönlendirme URI değerlerini kullanıp kullanmadığı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 loopback IP adresi yönlendirme akışı isteği aşağıdaki gibidir:

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 göre 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 loopback IP adresi yönlendirme akışı isteği aşağıdaki gibidir:

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çme

Mobil uygulama istemcileri (Android ve 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çmeniz gerekir.

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

Aşağıdaki belge bağlantılarında, loopback IP adresi yönlendirme URI'si kullanmadan Google API'lerine 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şim

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

List<Scopes> 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 authorizationResult değerini tanımladığınız yönteme 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<Scopes> 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şim

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 başlığına ekleyerek (Authorization: Bearer <var>ACCESS_TOKEN</var>) ya da REST için Objective-C Google API'leri istemci kitaplığı ile birlikte getirici yetkilendiriciyi (GTMFetcherAuthorizationProtocol) kullanarak API'yi çağırın.

Google API'lerine istemci tarafında nasıl erişileceğiyle ilgili istemci tarafı erişim kılavuzunu inceleyin.

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ında nasıl erişeceğinizi öğrenmek için sunucu tarafı erişim kılavuzunu inceleyin.

Chrome uygulaması istemcisi

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

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 following example 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)
    });
   });
 });
};

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