Bant Dışı (OOB) akışı Taşıma Rehberi

Genel bakış

16 Şubat 2022'de, daha güvenli OAuth akışları kullanarak Google OAuth etkileşimlerini daha güvenli hale getirmeyi planladığımızı duyurmuştuk. Bu kılavuz, OAuth bant dışı (OOB) akışından desteklenen alternatiflere başarıyla geçiş yapmak için gerekli değişiklikleri ve adımları anlamanıza yardımcı olur.

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

OOB nedir?

Manuel kopyalama/yapıştırma seçeneği olarak da bilinen OAuth bant dışı (OOB), kullanıcılar OAuth izin isteğini onayladıktan sonra kimlik bilgilerini kabul edecek yönlendirme URI'si olmayan yerel istemcileri desteklemek için geliştirilen eski bir akıştır. OOB akışı, uzaktan kimlik avı riski oluşturur ve istemcilerin bu güvenlik açığına karşı koruma sağlamak için alternatif bir yönteme geçmesi gerekir.

OOB akışı; web uygulamaları, Android, iOS, Evrensel Windows Platformu (UWP), Chrome uygulamaları, TV'ler ve sınırlı giriş cihazları, Masaüstü uygulamaları gibi tüm istemci türleri için kullanımdan kaldırılıyor.

Önemli uygunluk tarihleri

  • 28 Şubat 2022 - OOB akışı için yeni OAuth kullanımı engellendi
  • 5 Eylül 2022: Uyumlu olmayan OAuth isteklerine kullanıcılara bir uyarı mesajı gösterilebilir
  • 3 Ekim 2022: 28 Şubat 2022'den önce oluşturulan OAuth istemcileri için OOB akışı kullanımdan kaldırıldı
  • 31 Ocak 2023 - Tüm mevcut müşteriler engellendi (muaf tutulan müşteriler dahil)

Uyumlu olmayan istekler için kullanıcıya bir hata mesajı gösterilir. Bu mesaj, Google API Konsolu'ndaki OAuth izin ekranında kaydettiğiniz destek e-postasını gösterirken kullanıcılara uygulamanın engellendiğini bildirir.

Taşıma işlemini tamamlamak için iki ana adım vardır:
  1. Bu durumdan etkilenip etkilenmediğinizi belirleyin.
  2. Bu sorundan etkileniyorsanız daha güvenli bir alternatife geçin.

Etkilenip etkilenmediğinizi belirleme

Bu kullanımdan kaldırma yalnızca üretim uygulamaları (ör.yayınlama durumu Üretimde olarak ayarlanmış uygulamalar) için geçerlidir. Akış, Test yayınlanma durumuna sahip olan uygulamalar için çalışmaya devam eder.

Yayınlama durumunuzu Google API Console OAuth'un Consent Screen pagebölümünde inceleyin ve yayınlama durumu "Üretimde" olan bir projede OOB akışını kullanıyorsanız sonraki adıma geçin.

Uygulamanızın OOB akışını kullanıp kullanmadığını belirleme

Uygulamanızın yaptığı Google OAuth yetkilendirme isteğinin bir OOB yönlendirme URI değeri kullanıp kullanmadığını belirlemek için uygulama kodunuzu veya giden ağ çağrısını (uygulamanız OAuth kitaplığı kullanıyorsa) inceleyin.

Uygulama kodunuzu inceleyin

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=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob
Örnek bir OOB yönlendirme akışı isteği aşağıdaki gibi görünür:
https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
scope=<SCOPES>&
state=<STATE>&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
client_id=<CLIENT_ID>

Giden ağ aramasını denetle

Ağ çağrılarını inceleme yöntemi, uygulama istemcinizin türüne göre değişiklik gösterir.
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 birine sahip olup olmadığını belirleyin:
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob
Örnek bir OOB yönlendirme akışı isteği aşağıdaki gibi görünür:
https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
scope=<SCOPES>&
state=<STATE>&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
client_id=<CLIENT_ID>

Güvenli bir alternatife taşıyın

Mobil İstemciler (Android / iOS)

Uygulamanızın OOB akışını bir Android veya iOS OAuth istemci türünde kullandığını belirlerseniz Google ile Oturum Açma mobil SDK'larımızın (Android, iOS) kullanımına geçiş yapmanız gerekir.

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ı, Google ile Oturum Açma SDK'larının OOB yönlendirme URI'si kullanmadan Google API'lerine erişmek için nasıl kullanılacağı hakkında bilgi sağlar.

Android'de Google API'lerine erişme

Sunucu tarafı (çevrimdışı) erişim
Aşağıdaki örnekte, Android'de sunucu tarafındaki Google API'lerine nasıl erişileceği gösterilmektedir.
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
  GoogleSignInAccount account = task.getResult(ApiException.class);
  
  // request a one-time authorization code that your server exchanges for an
  // access token and sometimes refresh token
  String authCode = account.getServerAuthCode();
  
  // Show signed-in UI
  updateUI(account);

  // TODO(developer): send code to server and exchange for access/refresh/ID tokens
} catch (ApiException e) {
  Log.w(TAG, "Sign-in failed", e);
  updateUI(null);
}

Sunucu tarafından Google API'lerine nasıl erişileceğiyle ilgili sunucu tarafı erişim kılavuzunu inceleyin.

iOS uygulamasında Google API'lerine erişme

İstemci tarafı erişim

Aşağıdaki örnekte, iOS üzerinde 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 REST veya gRPC isteğinin (Authorization: Bearer ACCESS_TOKEN) başlığına ekleyerek veya REST için Objective-C için Google API'leri istemci kitaplığıyla alıcı yetkilendiricisini (GTMFetcherAuthorizationProtocol) kullanarak API'yi çağırmak için erişim jetonunu kullanın.

İstemci tarafındaki Google API'lerine nasıl erişeceğinizi öğrenmek için istemci tarafı erişim kılavuzunu inceleyin. Google API'larına erişme hakkında daha fazla 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
}

Sunucu tarafından Google API'lerine nasıl erişileceğiyle ilgili sunucu tarafı erişim kılavuzunu inceleyin.

Chrome Uygulama İstemcisi

Uygulamanızın Chrome uygulama istemcisinde OOB akışını kullandığını belirlerseniz Chrome Identity API'yi kullanmaya başlamanız gerekir.

Aşağıdaki örnekte, OOB 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)
    });
   });
 });
};

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.

Web Uygulaması

Uygulamanızın bir web uygulaması için OOB akışını kullandığını belirlerseniz Google API istemci kitaplıklarımızdan birini kullanarak geçiş yapmanız gerekir. Farklı programlama dilleri için istemci kitaplıkları burada listelenmiştir.

Kitaplıklar, Google API'lerine erişmeyi ve Google uç noktalarına yapılan tüm çağrıları işlemeyi kolaylaştırır.

Sunucu tarafı (çevrimdışı) erişim
Sunucu tarafı (çevrimdışı) erişim modu aşağıdakileri yapmanızı gerektirir:

Aşağıdaki kod snippet'i, bir kullanıcının Google Drive dosyalarını OOB yönlendirme URI'si kullanmadan sunucu tarafında listelemek için Google Drive API'nin kullanıldığı bir NodeJS örneğini göstermektedir.

async function main() {
  const server = http.createServer(async function (req, res) {

  if (req.url.startsWith('/oauth2callback')) {
    let q = url.parse(req.url, true).query;

    if (q.error) {
      console.log('Error:' + q.error);
    } else {
      
      // Get access and refresh tokens (if access_type is offline)
      let { tokens } = await oauth2Client.getToken(q.code);
      oauth2Client.setCredentials(tokens);

      // Example of using Google Drive API to list filenames in user's Drive.
      const drive = google.drive('v3');
      drive.files.list({
        auth: oauth2Client,
        pageSize: 10,
        fields: 'nextPageToken, files(id, name)',
      }, (err1, res1) => {
        // TODO(developer): Handle response / error.
      });
    }
  }
}

Sunucu tarafından Google API'lerine nasıl erişileceği hakkında bilgi için sunucu tarafı web uygulaması kılavuzunu inceleyin.

İstemci Tarafı erişimi

Aşağıdaki kod snippet'inde, JavaScript'te, istemci tarafında kullanıcının takvim etkinliklerine erişmek için Google API'nin kullanılmasına ilişkin bir örnek gösterilmektedir.


// initTokenClient() initializes a new token client with your
// web app's client ID and the scope you need access to

const client = google.accounts.oauth2.initTokenClient({
  client_id: 'YOUR_GOOGLE_CLIENT_ID',
  scope: 'https://www.googleapis.com/auth/calendar.readonly',
  
  // callback function to handle the token response
  callback: (tokenResponse) => {
    if (tokenResponse && tokenResponse.access_token) { 
      gapi.client.setApiKey('YOUR_API_KEY');
      gapi.client.load('calendar', 'v3', listUpcomingEvents);
    }
  },
});

function listUpcomingEvents() {
  gapi.client.calendar.events.list(...);
}

İstemci tarafında Google API'lerine nasıl erişileceğini öğrenmek için istemci tarafı web uygulaması kılavuzunu inceleyin.

Masaüstü istemcisi

Uygulamanızın bir masaüstü istemcisinde OOB akışını kullandığını belirlerseniz geri döngü IP adresi (localhost veya 127.0.0.1) akışını kullanmaya geçmeniz gerekir.