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, döngüsel IP adresi 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 ç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.
Loopback IP adresi akışı nedir?
Döngüsel 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 döngüsel IP adresi veyalocalhost
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 belirli yönlendirme URI'sine gelen yanıtı keserek yetkilendirme koduna erişebileceği ortadaki adam saldırılarına karşı savunmasızdır.
Yerel iOS, Android ve Chrome OAuth istemci türleri için loopback IP adresi akışının desteği sonlandırılıyor ancak masaüstü uygulamalarında desteklenmeye devam edecek.
Önemli uygunluk tarihleri
- 14 Mart 2022: Yeni OAuth istemcilerinin Loopback IP adresi akışını kullanması engellendi
- 1 Ağustos 2022: Uyumlu olmayan OAuth isteklerine kullanıcılara 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ışı engellenir
- 21 Ekim 2022: Mevcut tüm müşteriler engellenir (istisna kapsamındaki müşteriler dahil)
Uyumlu olmayan istekler için kullanıcılara yönelik bir hata mesajı gösterilir. Bu mesaj, kullanıcılara uygulamanın engellendiğini bildirir ve Google API Konsolu'ndaki OAuth kullanıcı rızası ekranında kaydettiğiniz destek e-posta adresini gösterir.
- Etkilenip etkilenmediğinizi belirleyin.
- Bu durumdan etkileniyorsanız desteklenen bir alternatife geçin.
Etkilenip etkilenmediğinizi belirleme
OAuth istemci kimliği türünüzü inceleme
bölümüne gidin ve OAuth 2.0 İstemci Kimlikleri bölümünde OAuth istemci kimliğinizin türünü görüntüleyin. Bu, aşağıdakilerden biri olacaktır: Web uygulaması, Android, iOS, Universal Windows Platform (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önen IP adresi akışını kullanıyorsanız bu OAuth istemci türündeki kullanım desteklenmeye devam edeceğinden bu desteğin sonlandırılmasıyla ilgili herhangi bir işlem yapmanız gerekmez.
Uygulamanızın loopback IP adresi akışını kullanıp kullanmadığını belirleme
Uygulamanızın yaptığı Google OAuth yetkilendirme isteğinin loopback 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
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
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
- Web uygulaması: Chrome'da ağ etkinliğini inceleme
- Android - Ağ Denetleyici ile ağ trafiğini inceleme
-
Chrome uygulamaları
- Chrome uzantıları sayfasına gidin
- Uzantı sayfasının sağ üst köşesindeki Geliştirici modu onay kutusunu işaretleyin
- İzlemek istediğiniz uzantıyı seçin
- Uzantının sayfasında, Görüntüleme sayısını incele bölümündeki Arka plan sayfası bağlantısını tıklayın.
- Geliştirici Araçları pop-up'ı açılır. Bu pop-up'ta, ağ trafiğini Ağ sekmesinde izleyebilirsiniz.
- iOS - Instruments ile HTTP trafiğini analiz etme
- Universal Windows Platform (UWP) - Visual Studio'da ağ trafiğini inceleme
- Masaüstü uygulamaları: Uygulamanın geliştirildiği işletim sisteminde kullanılabilen bir ağ yakalama aracı kullanın
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
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 istemciler (Android / iOS)
Uygulamanızın, Android veya iOS OAuth istemci türüyle döngüsel IP adresi akışı kullandığını belirlerseniz önerilen SDK'ları (Android, iOS) kullanmaya geçmeniz gerekir.
SDK, Google API'lerine erişmeyi kolaylaştırır ve Google'ın OAuth 2.0 yetkilendirme uç noktalarına yapılan tüm çağrıları yönetir.
Aşağıdaki doküman bağlantılarında, döngüsel 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ş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.
ListrequestedScopes = 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));
Kullanıcının Drive klasörüne içerik kaydetmek için authorizationResult
değerini, tanımladığınız yönteme iletin. authorizationResult
sınıfında, erişim jetonunu döndüren
getAccessToken()
yöntemi bulunur.
Sunucu tarafı (çevrimdışı) erişim
Aşağıdaki örnekte, Android'de sunucu tarafında Google API'lerine nasıl erişileceği gösterilmektedir.ListrequestedScopes = 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
sınıfında, erişim ve yenileme jetonu almak için arka uç sunucunuza gönderebileceğiniz yetkilendirme kodunu döndüren
getServerAuthCode()
yöntemi bulunur.
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() }
API'yi çağırmak için erişim jetonunu kullanın. Bunun için erişim jetonunu bir REST veya gRPC isteğinin başlığına (Authorization: Bearer ACCESS_TOKEN
) ekleyerek ya da
REST için Objective-C'te Google API'leri istemci kitaplığı ile birlikte alıcı yetkilendiriciyi (GTMFetcherAuthorizationProtocol
) kullanarak çağırabilirsiniz.
İstemci tarafında Google API'lerine erişme hakkındaki istemci tarafı erişim kılavuzunu inceleyin. sayfasını inceleyin.
Sunucu tarafı (çevrimdışı) erişim
Aşağıdaki örnekte, 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şileceğine dair sunucu tarafı erişim kılavuzunu inceleyin.
Chrome Uygulama İstemcisi
Uygulamanızın Chrome uygulama istemcisinde loopback IP adresi akışını kullandığını belirlerseniz Chrome Identity API'ye geçmeniz gerekir.
Aşağıdaki örnekte, döngüsel 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) }); }); }); };
Chrome Identity API ile kullanıcı kimlik doğrulamasına erişme ve Google uç noktalarını çağırma hakkında daha fazla bilgi edinmek için Chrome Identity API kılavuzunu inceleyin.