JavaScript Web Uygulamaları için OAuth 2.0'ı Kullanma

Bu belgede, JavaScript web uygulamasından YouTube Analytics API veya YouTube Reporting API'ye erişmek için OAuth 2.0 yetkilendirmesinin nasıl uygulanacağı açıklanmaktadır. OAuth 2.0 sayesinde kullanıcılar, bir uygulamayla belirli verileri paylaşırken kullanıcı adlarını, şifrelerini ve diğer bilgilerini gizli tutabilir. Örneğin, bir uygulama OAuth 2.0'ı kullanarak bir kanalın YouTube Analytics verilerini almak için izin isteyebilir.

Bu OAuth 2.0 akışına örtülü izin akışı denir. Yalnızca kullanıcı uygulamadayken API'lere erişen uygulamalar için tasarlanmıştır. Bu uygulamalar gizli bilgileri depolayamaz.

Bu akışta uygulamanız, uygulamanızı ve uygulamanın gerektirdiği API erişim türünü tanımlamak için sorgu parametrelerini kullanan bir Google URL'si açar. URL'yi geçerli tarayıcı penceresinde veya bir pop-up'ta açabilirsiniz. Kullanıcı, Google ile kimliğini doğrulayabilir ve istenen izinleri verebilir. Ardından Google, kullanıcıyı uygulamanıza geri yönlendirir. Yönlendirme, uygulamanızın doğruladığı ve ardından API istekleri göndermek için kullandığı bir erişim jetonu içerir.

Google API'leri İstemci Kitaplığı ve Google Kimlik Hizmetleri

Google'a yetkilendirilmiş çağrılar yapmak için JavaScript için Google API'leri istemci kitaplığını kullanıyorsanız OAuth 2.0 akışını işlemek üzere Google Kimlik Hizmetleri JavaScript kitaplığını kullanmanız gerekir. Lütfen Google Kimlik Hizmetleri'nin OAuth 2.0 örtülü izin akışına dayalı jeton modeline bakın.

Ön koşullar

Projeniz için API'leri etkinleştirme

Google API'lerini çağıran tüm uygulamaların bu API'leri API Console'de etkinleştirmesi gerekir.

Projenizde bir API'yi etkinleştirmek için:

  1. Open the API Library in the Google API Console.
  2. If prompted, select a project, or create a new one.
  3. YouTube Analytics API ve YouTube Reporting API'yi bulup etkinleştirmek için Kitaplık sayfasını kullanın. YouTube Analytics verilerini alan birçok uygulama, YouTube Data API ile de arayüz oluşturur. Uygulamanızın kullanacağı diğer API'leri bulun ve bunları da etkinleştirin.

Yetkilendirme kimlik bilgileri oluşturma

Google API'lerine erişmek için OAuth 2.0'ı kullanan tüm uygulamaların, uygulamayı Google'ın OAuth 2.0 sunucusuna tanıtan yetkilendirme kimlik bilgilerine sahip olması gerekir. Aşağıdaki adımlarda, projeniz için nasıl kimlik bilgisi oluşturacağınız açıklanmaktadır. Uygulamalarınız daha sonra bu kimlik bilgilerini kullanarak söz konusu proje için etkinleştirdiğiniz API'lere erişebilir.

  1. Go to the Credentials page.
  2. Create Client'ı (İstemci Oluştur) tıklayın.
  3. Web uygulaması uygulama türünü seçin.
  4. Formu doldurun. Yetkili Google API istekleri yapmak için JavaScript kullanan uygulamalar, yetkili JavaScript kaynaklarını belirtmelidir. Kaynaklar, uygulamanızın OAuth 2.0 sunucusuna istek gönderebileceği alanları tanımlar. Bu kaynaklar Google'ın doğrulama kurallarına uymalıdır.

Erişim kapsamlarını belirleme

Kapsamlar, uygulamanızın yalnızca ihtiyaç duyduğu kaynaklara erişim isteğinde bulunmasını sağlar. Ayrıca, kullanıcıların uygulamanıza verdiği erişim miktarını kontrol etmesine de olanak tanır. Bu nedenle, istenen kapsam sayısı ile kullanıcı izni alma olasılığı arasında ters bir ilişki olabilir.

OAuth 2.0 yetkilendirmesini uygulamaya başlamadan önce, uygulamanızın erişim izni gerektireceği kapsamları belirlemenizi öneririz.

YouTube Analytics API aşağıdaki kapsamları kullanır:

Kapsam Açıklama
https://www.googleapis.com/auth/youtube YouTube hesabınızı yönetin
https://www.googleapis.com/auth/youtube.readonly YouTube hesabınızı görüntüleyin
https://www.googleapis.com/auth/youtubepartner YouTube'daki varlıklarınızı ve ilişkili içeriği görüntüleyin ve yönetin
https://www.googleapis.com/auth/yt-analytics-monetary.readonly YouTube içeriğiniz için finansal ve finansal olmayan YouTube Analytics raporlarını görüntüleyin
https://www.googleapis.com/auth/yt-analytics.readonly YouTube içeriğiniz için YouTube Analytics raporlarını görüntüleyin

YouTube Reporting API aşağıdaki kapsamları kullanır:

Kapsam Açıklama
https://www.googleapis.com/auth/yt-analytics-monetary.readonly YouTube içeriğiniz için finansal ve finansal olmayan YouTube Analytics raporlarını görüntüleyin
https://www.googleapis.com/auth/yt-analytics.readonly YouTube içeriğiniz için YouTube Analytics raporlarını görüntüleyin

OAuth 2.0 API Kapsamları dokümanında, Google API'lerine erişmek için kullanabileceğiniz kapsamların tam listesi yer alır.

OAuth 2.0 erişim jetonlarını edinme

Aşağıdaki adımlarda, uygulamanızın Google'ın OAuth 2.0 sunucusuyla nasıl etkileşimde bulunarak kullanıcı adına bir API isteği gerçekleştirmek için kullanıcının iznini aldığı gösterilmektedir. Uygulamanızın, kullanıcı yetkilendirmesi gerektiren bir Google API isteğini yürütebilmesi için bu izne sahip olması gerekir.

1. adım: Google'ın OAuth 2.0 sunucusuna yönlendirin

Bir kullanıcının verilerine erişim izni istemek için kullanıcıyı Google'ın OAuth 2.0 sunucusuna yönlendirin.

OAuth 2.0 uç noktaları

Google'ın OAuth 2.0 uç noktasından erişim isteğinde bulunmak için https://accounts.google.com/o/oauth2/v2/auth adresinde bir URL oluşturun. Bu uç noktaya HTTPS üzerinden erişilebilir. Düz HTTP bağlantıları reddedilir.

Google yetkilendirme sunucusu, web sunucusu uygulamaları için aşağıdaki sorgu dizesi parametrelerini destekler:

Parametreler
client_id Zorunlu

Uygulamanızın istemci kimliği. Bu değeri bölümünde bulabilirsiniz.

redirect_uri Zorunlu

Kullanıcı yetkilendirme akışını tamamladıktan sonra API sunucusunun kullanıcıyı nereye yönlendireceğini belirler. Değer, istemcinizin bölümünde yapılandırdığınız OAuth 2.0 istemcisinin yetkili yönlendirme URI'lerinden biriyle tam olarak eşleşmelidir. Bu değer, sağlanan client_id için yetkili bir yönlendirme URI'siyle eşleşmezse redirect_uri_mismatch hatası alırsınız.

http veya https şemasının, büyük/küçük harf durumunun ve sondaki eğik çizginin ("/") eşleşmesi gerektiğini unutmayın.

response_type Zorunlu

JavaScript uygulamalarının parametre değerini token olarak ayarlaması gerekir. Bu değer, Google yetkilendirme sunucusuna, yetkilendirme işlemi tamamlandıktan sonra kullanıcının yönlendirildiği URI'nin (#) parça tanımlayıcısında erişim jetonunu name=value çifti olarak döndürmesini bildirir.

scope Zorunlu

Uygulamanızın kullanıcı adına erişebileceği kaynakları tanımlayan, boşlukla ayrılmış bir kapsam listesi. Bu değerler, Google'ın kullanıcıya gösterdiği izin ekranını bilgilendirir.

Kapsamlar, uygulamanızın yalnızca ihtiyaç duyduğu kaynaklara erişim isteğinde bulunmasını sağlar. Ayrıca, kullanıcıların uygulamanıza verdikleri erişim miktarını kontrol etmelerine de olanak tanır. Bu nedenle, istenen kapsam sayısı ile kullanıcı izni alma olasılığı arasında ters orantı vardır.

YouTube Analytics API aşağıdaki kapsamları kullanır:

Kapsam Açıklama
https://www.googleapis.com/auth/youtube YouTube hesabınızı yönetin
https://www.googleapis.com/auth/youtube.readonly YouTube hesabınızı görüntüleyin
https://www.googleapis.com/auth/youtubepartner YouTube'daki varlıklarınızı ve ilişkili içeriği görüntüleyin ve yönetin
https://www.googleapis.com/auth/yt-analytics-monetary.readonly YouTube içeriğiniz için finansal ve finansal olmayan YouTube Analytics raporlarını görüntüleyin
https://www.googleapis.com/auth/yt-analytics.readonly YouTube içeriğiniz için YouTube Analytics raporlarını görüntüleyin

YouTube Reporting API aşağıdaki kapsamları kullanır:

Kapsam Açıklama
https://www.googleapis.com/auth/yt-analytics-monetary.readonly YouTube içeriğiniz için finansal ve finansal olmayan YouTube Analytics raporlarını görüntüleyin
https://www.googleapis.com/auth/yt-analytics.readonly YouTube içeriğiniz için YouTube Analytics raporlarını görüntüleyin

OAuth 2.0 API Kapsamları dokümanında, Google API'lerine erişmek için kullanabileceğiniz kapsamların tam listesi yer alır.

Uygulamanızın mümkün olduğunda bağlamdaki yetkilendirme kapsamlarına erişim isteğinde bulunmasını öneririz. Artımlı yetkilendirme aracılığıyla kullanıcı verilerine bağlam içinde erişim isteyerek kullanıcıların, uygulamanızın neden istediği erişime ihtiyacı olduğunu daha kolay anlamasına yardımcı olursunuz.

state Önerilen

Uygulamanızın, yetkilendirme isteğiniz ile yetkilendirme sunucusunun yanıtı arasındaki durumu korumak için kullandığı dize değerini belirtir. Kullanıcı, uygulamanızın erişim isteğini onayladıktan veya reddettikten sonra sunucu, URL parça tanımlayıcısında (#) name=value çifti olarak gönderdiğiniz değeri tam olarak döndürür.redirect_uri

Bu parametreyi, kullanıcıyı uygulamanızdaki doğru kaynağa yönlendirme, tek kullanımlık rastgele sayılar gönderme ve siteler arası istek sahteciliğini azaltma gibi çeşitli amaçlarla kullanabilirsiniz. redirect_uri değeri tahmin edilebileceğinden, state değerini kullanmak gelen bağlantının bir kimlik doğrulama isteğinin sonucu olduğuna dair güvencenizi artırabilir. Rastgele bir dize oluşturur veya istemcinin durumunu yakalayan bir çerezin ya da başka bir değerin karmaşasını kodlarsanız isteğin ve yanıtın aynı tarayıcıdan geldiğinden emin olmak için yanıtı doğrulayabilirsiniz. Bu sayede siteler arası istek sahteciliği gibi saldırılara karşı koruma sağlanır. state jetonu oluşturma ve onaylama örneği için OpenID Connect dokümanlarına bakın.

include_granted_scopes İsteğe bağlı

Uygulamaların, bağlamda ek kapsamlara erişim isteğinde bulunmak için artımlı yetkilendirme kullanmasını sağlar. Bu parametrenin değerini true olarak ayarlarsanız ve yetkilendirme isteği verilirse yeni erişim jetonu, kullanıcının daha önce uygulamaya erişim izni verdiği tüm kapsamları da kapsar. Örnekler için kademeli yetkilendirme bölümüne bakın.

login_hint İsteğe bağlı

Uygulamanız, kimliği doğrulamaya çalışan kullanıcının kim olduğunu biliyorsa Google kimlik doğrulama sunucusuna ipucu vermek için bu parametreyi kullanabilir. Sunucu, oturum açma formundaki e-posta alanını önceden doldurarak veya uygun çoklu oturum açma oturumunu seçerek oturum açma akışını basitleştirmek için ipucunu kullanır.

Parametre değerini, kullanıcının Google Kimliği'ne eşdeğer olan bir e-posta adresine veya sub tanımlayıcısına ayarlayın.

prompt İsteğe bağlı

Kullanıcıya sunulacak, boşlukla ayrılmış ve büyük/küçük harfe duyarlı istemler listesi. Bu parametreyi belirtmezseniz kullanıcıdan yalnızca projeniz ilk kez erişim istediğinde izin istenir. Daha fazla bilgi için Yeniden izin isteme başlıklı makaleyi inceleyin.

Olası değerler:

none Herhangi bir kimlik doğrulama veya izin ekranı göstermeyin. Diğer değerlerle birlikte belirtilmemelidir.
consent Kullanıcıdan izin isteyin.
select_account Kullanıcıdan bir hesap seçmesini isteyin.

Google'ın yetkilendirme sunucusuna yönlendirme örneği

Aşağıdaki örnek URL, kullanıcının YouTube Analytics raporlarını almak için erişime izin veren bir kapsamda çevrimdışı erişim (access_type=offline) isteğinde bulunuyor. Yeni erişim jetonunun, kullanıcının daha önce uygulamaya erişim izni verdiği tüm kapsamları kapsadığından emin olmak için artımlı yetkilendirme kullanılır. URL, gerekli redirect_uri, response_type ve client_id parametrelerinin yanı sıra state parametresinin değerlerini de ayarlar. URL, okunabilirlik için satır sonları ve boşluklar içeriyor.

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyt-analytics.readonly&
 include_granted_scopes=true&
 state=state_parameter_passthrough_value&
 redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&
 response_type=token&
 client_id=client_id

İstek URL'sini oluşturduktan sonra kullanıcıyı bu URL'ye yönlendirin.

JavaScript örnek kodu

Aşağıdaki JavaScript snippet'i, JavaScript için Google API'leri İstemci Kitaplığı'nı kullanmadan JavaScript'te yetkilendirme akışının nasıl başlatılacağını gösterir. Bu OAuth 2.0 uç noktası, merkezler arası kaynak paylaşımını (CORS) desteklemediğinden snippet, bu uç noktaya istek açan bir form oluşturur.

/*
 * Create form to request access token from Google's OAuth 2.0 server.
 */
function oauthSignIn() {
  // Google's OAuth 2.0 endpoint for requesting an access token
  var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';

  // Create <form> element to submit parameters to OAuth 2.0 endpoint.
  var form = document.createElement('form');
  form.setAttribute('method', 'GET'); // Send as a GET request.
  form.setAttribute('action', oauth2Endpoint);

  // Parameters to pass to OAuth 2.0 endpoint.
  var params = {'client_id': 'YOUR_CLIENT_ID',
                'redirect_uri': 'YOUR_REDIRECT_URI',
                'response_type': 'token',
                'scope': 'https://www.googleapis.com/auth/yt-analytics.readonly https://www.googleapis.com/auth/calendar.readonly',
                'include_granted_scopes': 'true',
                'state': 'pass-through value'};

  // Add form parameters as hidden input values.
  for (var p in params) {
    var input = document.createElement('input');
    input.setAttribute('type', 'hidden');
    input.setAttribute('name', p);
    input.setAttribute('value', params[p]);
    form.appendChild(input);
  }

  // Add form to page and submit it to open the OAuth 2.0 endpoint.
  document.body.appendChild(form);
  form.submit();
}

2. adım: Google, kullanıcıdan izin ister

Bu adımda kullanıcı, uygulamanıza istenen erişimi verip vermeyeceğine karar verir. Bu aşamada Google, uygulamanızın adını ve kullanıcının yetkilendirme kimlik bilgileriyle erişim izni istediği Google API hizmetlerini gösteren bir izin penceresi ile verilecek erişim kapsamlarının özetini gösterir. Kullanıcı daha sonra uygulamanızın istediği bir veya daha fazla kapsam için erişim izni vermeyi kabul edebilir ya da isteği reddedebilir.

Uygulamanızın, Google'ın OAuth 2.0 sunucusundan erişim izni verilip verilmediğini belirten yanıtı beklerken bu aşamada herhangi bir işlem yapması gerekmez. Bu yanıt, sonraki adımda açıklanmaktadır.

Hatalar

Google'ın OAuth 2.0 yetkilendirme uç noktasına yapılan istekler, beklenen kimlik doğrulama ve yetkilendirme akışları yerine kullanıcıya yönelik hata mesajları gösterebilir. Sık karşılaşılan hata kodları ve önerilen çözümler aşağıda listelenmiştir.

admin_policy_enforced

Google Hesabı, Google Workspace yöneticisinin politikaları nedeniyle istenen bir veya daha fazla kapsamı yetkilendiremiyor. Yöneticinin, OAuth istemci kimliğinize açıkça erişim izni verilene kadar tüm kapsamlar veya hassas ve kısıtlanmış kapsamlar için erişimi nasıl kısıtlayabileceği hakkında daha fazla bilgi edinmek için Google Workspace Yönetici Yardım Merkezi'ndeki Google Workspace verilerine hangi üçüncü taraf uygulamalar ve dahili uygulamaların erişebileceğini yönetme başlıklı makaleyi inceleyin.

disallowed_useragent

Yetkilendirme uç noktası, Google'ın OAuth 2.0 Politikaları tarafından izin verilmeyen yerleştirilmiş bir kullanıcı aracısı içinde gösteriliyor.

Android

Android geliştiricileri, yetkilendirme isteklerini android.webkit.WebView içinde açarken bu hata mesajıyla karşılaşabilir. Geliştiriciler bunun yerine Android için Google ile Oturum Açma veya OpenID Foundation'ın Android için AppAuth gibi Android kitaplıklarını kullanmalıdır.

Web geliştiriciler, bir Android uygulaması genel bir web bağlantısını yerleştirilmiş bir kullanıcı aracısında açtığında ve kullanıcı sitenizden Google'ın OAuth 2.0 yetkilendirme uç noktasına gittiğinde bu hatayla karşılaşabilir. Geliştiriciler, genel bağlantıların işletim sisteminin varsayılan bağlantı işleyicisinde açılmasına izin vermelidir. Bu işleyici, hem Android App Links işleyicilerini hem de varsayılan tarayıcı uygulamasını içerir. Android Özel Sekmeler kitaplığı da desteklenen bir seçenektir.

iOS

iOS ve macOS geliştiricileri, yetkilendirme isteklerini WKWebView içinde açarken bu hatayla karşılaşabilir. Geliştiriciler bunun yerine iOS için Google ile Giriş veya OpenID Foundation'ın iOS için AppAuth gibi iOS kitaplıklarını kullanmalıdır.

Web geliştiriciler, bir iOS veya macOS uygulaması genel bir web bağlantısını yerleştirilmiş bir kullanıcı aracısında açtığında ve kullanıcı sitenizden Google'ın OAuth 2.0 yetkilendirme uç noktasına gittiğinde bu hatayla karşılaşabilir. Geliştiriciler, genel bağlantıların işletim sisteminin varsayılan bağlantı işleyicisinde açılmasına izin vermelidir. Bu işleyici, Evrensel Bağlantı işleyicileri veya varsayılan tarayıcı uygulamasını içerir. SFSafariViewController kitaplığı da desteklenen bir seçenektir.

org_internal

İstekteki OAuth istemci kimliği, belirli bir Google Cloud kuruluşunda Google Hesaplarına erişimi sınırlayan bir projenin parçasıdır. Bu yapılandırma seçeneği hakkında daha fazla bilgi için OAuth izin ekranınızı ayarlama başlıklı yardım makalesindeki Kullanıcı türü bölümüne bakın.

invalid_client

İsteğin yapıldığı kaynak, bu istemci için yetkilendirilmemiş. origin_mismatch sayfasına göz atın.

deleted_client

İsteği göndermek için kullanılan OAuth istemcisi silinmiştir. Silme işlemi manuel olarak veya kullanılmayan istemciler için otomatik olarak yapılabilir. Silinen müşteriler, silme işleminden sonraki 30 gün içinde geri yüklenebilir. Daha fazla bilgi edinin .

invalid_grant

Artımlı yetkilendirme kullanılırken jetonun süresi dolmuş veya jeton geçersiz kılınmış olabilir. Kullanıcının kimliğini tekrar doğrulayın ve yeni jetonlar almak için kullanıcı izni isteyin. Bu hatayı görmeye devam ediyorsanız uygulamanızın doğru şekilde yapılandırıldığından ve isteğinizde doğru jetonları ve parametreleri kullandığınızdan emin olun. Aksi takdirde, kullanıcı hesabı silinmiş veya devre dışı bırakılmış olabilir.

origin_mismatch

Yetkilendirme isteğini başlatan JavaScript'in şeması, alan adı ve/veya bağlantı noktası, OAuth istemci kimliği için kayıtlı yetkili bir JavaScript kaynak URI'siyle eşleşmiyor olabilir. bölümünde yetkilendirilmiş JavaScript kaynaklarını inceleyin.

redirect_uri_mismatch

Yetkilendirme isteğinde iletilen redirect_uri, OAuth istemci kimliği için yetkilendirilmiş bir yönlendirme URI'siyle eşleşmiyor. bölümündeki yetkilendirilmiş yönlendirme URI'lerini inceleyin.

Yetkilendirme isteğini başlatan JavaScript'in şeması, alan adı ve/veya bağlantı noktası, OAuth istemci kimliği için kayıtlı yetkili bir JavaScript kaynak URI'siyle eşleşmiyor olabilir. bölümünde yetkilendirilmiş JavaScript kaynaklarını inceleyin.

redirect_uri parametresi, kullanımdan kaldırılmış ve artık desteklenmeyen bant dışı OAuth (OOB) akışını ifade edebilir. Entegrasyonunuzu güncellemek için taşıma kılavuzuna bakın.

invalid_request

Yaptığınız istekte bir sorun oluştu. Bunun birkaç nedeni olabilir:

  • İstek doğru şekilde biçimlendirilmemiş
  • İstek, gerekli parametreleri içermiyordu
  • İstek, Google'ın desteklemediği bir yetkilendirme yöntemi kullanıyor. OAuth entegrasyonunuzun önerilen bir entegrasyon yöntemi kullandığını doğrulayın.

3. adım: OAuth 2.0 sunucu yanıtını işleyin

OAuth 2.0 uç noktaları

OAuth 2.0 sunucusu, erişim jetonu isteğinizde belirtilen redirect_uri adresine bir yanıt gönderir.

Kullanıcı isteği onaylarsa yanıtta bir erişim jetonu bulunur. Kullanıcı isteği onaylamazsa yanıtta hata mesajı yer alır. Erişim jetonu veya hata mesajı, aşağıdaki örnekte gösterildiği gibi yönlendirme URI'sinin karma bölümünde döndürülür:

  • Erişim jetonu yanıtı:

    https://oauth2.example.com/callback#access_token=4/P7q7W91&token_type=Bearer&expires_in=3600

    Parça dizesi, access_token parametresine ek olarak her zaman Bearer olarak ayarlanan token_type parametresini ve jetonun kullanım ömrünü saniye cinsinden belirten expires_in parametresini de içerir. Erişim jetonu isteğinde state parametresi belirtilmişse değeri de yanıta dahil edilir.

  • Hata yanıtı:
    https://oauth2.example.com/callback#error=access_denied

Örnek OAuth 2.0 sunucu yanıtı

Bu akışı, Google Drive'ınızdaki dosyaların meta verilerini görüntülemek için salt okunur erişim ve Google Takvim etkinliklerinizi görüntülemek için salt okunur erişim isteyen aşağıdaki örnek URL'yi tıklayarak test edebilirsiniz:

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyt-analytics.readonly&
 include_granted_scopes=true&
 state=state_parameter_passthrough_value&
 redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&
 response_type=token&
 client_id=client_id

OAuth 2.0 akışını tamamladıktan sonra http://localhost/oauth2callback adresine yönlendirilirsiniz. Yerel makineniz bu adreste bir dosya sunmadığı sürece bu URL, 404 NOT FOUND hatası verir. Sonraki adımda, kullanıcı uygulamanıza geri yönlendirildiğinde URI'de döndürülen bilgiler hakkında daha ayrıntılı bilgi verilmektedir.

4. adım: Kullanıcıların hangi kapsamları verdiğini kontrol edin

Kullanıcılar, birden fazla izin (kapsam) istediğinizde uygulamanızın hepsine erişmesine izin vermeyebilir. Uygulamanız, hangi kapsamların gerçekten verildiğini doğrulamalı ve bazı izinlerin reddedildiği durumları sorunsuz bir şekilde ele almalıdır. Bu genellikle reddedilen kapsamları kullanan özelliklerin devre dışı bırakılmasıyla yapılır.

Ancak istisnalar bulunmaktadır. Alan genelinde yetki devri olan Google Workspace Enterprise uygulamaları veya Güvenilir olarak işaretlenen uygulamalar, ayrıntılı izinler kullanıcı rızası ekranını atlar. Bu uygulamalarda kullanıcılar ayrıntılı izin onay ekranını görmez. Bunun yerine, uygulamanız istenen tüm kapsamları veya hiçbirini almaz.

Daha ayrıntılı bilgi için Ayrıntılı izinleri yönetme başlıklı makaleyi inceleyin.

OAuth 2.0 uç noktaları

Kullanıcının uygulamanıza belirli bir kapsam için erişim izni verip vermediğini kontrol etmek için erişim jetonu yanıtındaki scope alanını inceleyin. access_token tarafından verilen erişim kapsamları, boşlukla ayrılmış, büyük/küçük harfe duyarlı dizeler listesi olarak ifade edilir.

Örneğin, aşağıdaki örnek erişim jetonu yanıtı, kullanıcının uygulamanıza salt okunur Drive etkinliği ve Takvim etkinlikleri izinlerine erişim yetkisi verdiğini gösterir:

  {
    "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
    "expires_in": 3920,
    "token_type": "Bearer",
    "scope": "https://www.googleapis.com/auth/yt-analytics.readonly https://www.googleapis.com/auth/calendar.readonly",
    "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
  }

Google API'lerini çağırma

OAuth 2.0 uç noktaları

Uygulamanız bir erişim jetonu aldıktan sonra, API'nin gerektirdiği erişim kapsamları verilmişse jetonu kullanarak belirli bir kullanıcı hesabı adına Google API'sine çağrı yapabilirsiniz. Bunu yapmak için API'ye yapılan bir isteğe erişim jetonunu ekleyin. Bunun için access_token sorgu parametresini veya Authorization HTTP üstbilgisi Bearer değerini ekleyebilirsiniz. Sorgu dizeleri sunucu günlüklerinde görünür olduğundan mümkün olduğunda HTTP üstbilgisi tercih edilir. Çoğu durumda, Google API'lerine yönelik çağrılarınızı ayarlamak için bir istemci kitaplığı kullanabilirsiniz (örneğin, YouTube Analytics API'yi çağırırken).

YouTube Analytics API'nin hizmet hesabı akışını desteklemediğini unutmayın. YouTube Reporting API, yalnızca birden fazla YouTube kanalına sahip ve bu kanalları yöneten YouTube içerik sahipleri (ör. plak şirketleri ve film stüdyoları) için hizmet hesaplarını destekler.

Tüm Google API'lerini deneyebilir ve kapsamlarını OAuth 2.0 Playground'da görüntüleyebilirsiniz.

HTTP GET örnekleri

Authorization: Bearer HTTP üstbilgisi kullanılarak reports.query uç noktasına (YouTube Analytics API) yapılan bir çağrı aşağıdaki gibi görünebilir. Kendi erişim jetonunuzu belirtmeniz gerektiğini unutmayın:

GET /youtube/analytics/v1/reports?ids=channel%3D%3DMINE&start-date=2016-05-01&end-date=2016-06-30&metrics=views HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

Aşağıda, access_token sorgu dizesi parametresi kullanılarak kimliği doğrulanmış kullanıcı için aynı API'ye yapılan bir çağrı verilmiştir:

GET https://www.googleapis.com/youtube/analytics/v1/reports?access_token=access_token&ids=channel%3D%3DMINE&start-date=2016-05-01&end-date=2016-06-30&metrics=views

curl örnek

Bu komutları curl komut satırı uygulamasıyla test edebilirsiniz. HTTP üstbilgisi seçeneğinin (tercih edilen) kullanıldığı bir örneği aşağıda bulabilirsiniz:

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/analytics/v1/reports?ids=channel%3D%3DMINE&start-date=2016-05-01&end-date=2016-06-30&metrics=views

Alternatif olarak sorgu dizesi parametresi seçeneğini de kullanabilirsiniz:

curl https://www.googleapis.com/youtube/analytics/v1/reports?access_token=access_token&ids=channel%3D%3DMINE&start-date=2016-05-01&end-date=2016-06-30&metrics=views

JavaScript örnek kodu

Aşağıdaki kod snippet'i, Google API'ye istek göndermek için CORS'un (Merkezler arası kaynak paylaşımı) nasıl kullanılacağını gösterir. Bu örnekte, JavaScript için Google API'leri istemci kitaplığı kullanılmamaktadır. Ancak istemci kitaplığını kullanmıyor olsanız bile bu kitaplığın dokümanlarındaki CORS desteği kılavuzu, bu istekleri daha iyi anlamanıza yardımcı olabilir.

Bu kod snippet'inde access_token değişkeni, yetkili kullanıcı adına API istekleri yapmak için aldığınız jetonu temsil eder. Eksiksiz örnek, bu jetonun tarayıcının yerel depolama alanında nasıl saklanacağını ve bir API isteği gönderirken nasıl alınacağını gösterir.

var xhr = new XMLHttpRequest();
xhr.open('GET',
    'https://www.googleapis.com/youtube/analytics/v1/reports?ids=channel%3D%3DMINE&start-date=2016-05-01&end-date=2016-06-30&metrics=views&' +
    'access_token=' + params['access_token']);
xhr.onreadystatechange = function (e) {
  console.log(xhr.response);
};
xhr.send(null);

Eksiksiz örnek

OAuth 2.0 uç noktaları

Bu kod örneği, JavaScript için Google API'leri İstemci Kitaplığı'nı kullanmadan JavaScript'te OAuth 2.0 akışının nasıl tamamlanacağını gösterir. Kod, bir API isteğini denemek için düğme gösteren bir HTML sayfasına aittir. Düğmeyi tıkladığınızda kod, sayfada tarayıcınızın yerel depolama alanında bir API erişim jetonunun depolanıp depolanmadığını kontrol eder. Bu durumda API isteği yürütülür. Aksi takdirde, OAuth 2.0 akışı başlatılır.

OAuth 2.0 akışında sayfa şu adımları izler:

  1. Kullanıcıyı, https://www.googleapis.com/auth/yt-analytics.readonly ve https://www.googleapis.com/auth/calendar.readonly kapsamlarına erişim isteğinde bulunan Google'ın OAuth 2.0 sunucusuna yönlendirir.
  2. İstenen bir veya daha fazla kapsam için erişim izni verildikten (veya reddedildikten) sonra kullanıcı, parça tanımlayıcı dizesinden erişim jetonunu ayrıştıran orijinal sayfaya yönlendirilir.
  3. Sayfa, kullanıcının uygulamaya hangi kapsamlar için erişim izni verdiğini kontrol eder.
  4. Kullanıcı, istenen kapsamlara erişim izni verdiyse sayfa, örnek API isteğini yapmak için erişim jetonunu kullanır.

    Bu API isteği, yetkili kullanıcının YouTube kanalının görüntüleme sayılarını almak için YouTube Analytics API'nin reports.query yöntemini çağırır.

  5. İstek başarıyla yürütülürse API yanıtı tarayıcının hata ayıklama konsoluna kaydedilir.

Google Hesabınızın İzinler sayfasından uygulamaya erişimi iptal edebilirsiniz. Uygulama, Google API Dokümanları için OAuth 2.0 Demosu olarak listelenir.

Bu kodu yerel olarak çalıştırmak için YOUR_CLIENT_ID ve YOUR_REDIRECT_URI değişkenleri için yetkilendirme kimlik bilgilerinizle eşleşen değerler ayarlamanız gerekir. YOUR_REDIRECT_URI değişkeni, sayfanın yayınlandığı URL ile aynı URL'ye ayarlanmalıdır. Değer, bölümünde yapılandırdığınız OAuth 2.0 istemcisinin yetkili yönlendirme URI'lerinden biriyle tam olarak eşleşmelidir. Bu değer yetkili bir URI ile eşleşmezse redirect_uri_mismatch hatası alırsınız. Projenizde bu istek için uygun API'nin etkinleştirilmiş olması da gerekir.

<html><head></head><body>
<script>
  var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE';
  var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE';

  // Parse query string to see if page request is coming from OAuth 2.0 server.
  var fragmentString = location.hash.substring(1);
  var params = {};
  var regex = /([^&=]+)=([^&]*)/g, m;
  while (m = regex.exec(fragmentString)) {
    params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }
  if (Object.keys(params).length > 0 && params['state']) {
    if (params['state'] == localStorage.getItem('state')) {
      localStorage.setItem('oauth2-test-params', JSON.stringify(params) );

      trySampleRequest();
    } else {
      console.log('State mismatch. Possible CSRF attack');
    }
  }

  // Function to generate a random state value
  function generateCryptoRandomState() {
    const randomValues = new Uint32Array(2);
    window.crypto.getRandomValues(randomValues);

    // Encode as UTF-8
    const utf8Encoder = new TextEncoder();
    const utf8Array = utf8Encoder.encode(
      String.fromCharCode.apply(null, randomValues)
    );

    // Base64 encode the UTF-8 data
    return btoa(String.fromCharCode.apply(null, utf8Array))
      .replace(/\+/g, '-')
      .replace(/\//g, '_')
      .replace(/=+$/, '');
  }

  // If there's an access token, try an API request.
  // Otherwise, start OAuth 2.0 flow.
  function trySampleRequest() {
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    if (params && params['access_token']) { 
      // User authorized the request. Now, check which scopes were granted.
      if (params['scope'].includes('https://www.googleapis.com/auth/drive.metadata.readonly')) {
        // User authorized read-only Drive activity permission.
        // Calling the APIs, etc.
        var xhr = new XMLHttpRequest();
        xhr.open('GET',
          'https://www.googleapis.com/youtube/analytics/v1/reports?ids=channel%3D%3DMINE&start-date=2016-05-01&end-date=2016-06-30&metrics=views&' +
          'access_token=' + params['access_token']);
        xhr.onreadystatechange = function (e) {
          if (xhr.readyState === 4 && xhr.status === 200) {
            console.log(xhr.response);
          } else if (xhr.readyState === 4 && xhr.status === 401) {
            // Token invalid, so prompt for user permission.
            oauth2SignIn();
          }
        };
        xhr.send(null);
      }
      else {
        // User didn't authorize read-only Drive activity permission.
        // Update UX and application accordingly
        console.log('User did not authorize read-only Drive activity permission.');
      }

      // Check if user authorized Calendar read permission.
      if (params['scope'].includes('https://www.googleapis.com/auth/calendar.readonly')) {
        // User authorized Calendar read permission.
        // Calling the APIs, etc.
        console.log('User authorized Calendar read permission.');
      }
      else {
        // User didn't authorize Calendar read permission.
        // Update UX and application accordingly
        console.log('User did not authorize Calendar read permission.');
      } 
    } else {
      oauth2SignIn();
    }
  }

  /*
   * Create form to request access token from Google's OAuth 2.0 server.
   */
  function oauth2SignIn() {
    // create random state value and store in local storage
    var state = generateCryptoRandomState();
    localStorage.setItem('state', state);

    // Google's OAuth 2.0 endpoint for requesting an access token
    var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';

    // Create element to open OAuth 2.0 endpoint in new window.
    var form = document.createElement('form');
    form.setAttribute('method', 'GET'); // Send as a GET request.
    form.setAttribute('action', oauth2Endpoint);

    // Parameters to pass to OAuth 2.0 endpoint.
    var params = {'client_id': YOUR_CLIENT_ID,
                  'redirect_uri': YOUR_REDIRECT_URI,
                  'scope': 'https://www.googleapis.com/auth/yt-analytics.readonly https://www.googleapis.com/auth/calendar.readonly',
                  'state': state,
                  'include_granted_scopes': 'true',
                  'response_type': 'token'};

    // Add form parameters as hidden input values.
    for (var p in params) {
      var input = document.createElement('input');
      input.setAttribute('type', 'hidden');
      input.setAttribute('name', p);
      input.setAttribute('value', params[p]);
      form.appendChild(input);
    }

    // Add form to page and submit it to open the OAuth 2.0 endpoint.
    document.body.appendChild(form);
    form.submit();
  }
</script>

<button onclick="trySampleRequest();">Try sample request</button>
</body></html>

JavaScript kaynak doğrulama kuralları

Google, geliştiricilerin uygulamalarını güvende tutmasına yardımcı olmak için JavaScript kaynaklarına aşağıdaki doğrulama kurallarını uygular. JavaScript kaynaklarınız bu kurallara uymalıdır. Aşağıda bahsedilen alan, ana makine ve şema tanımları için RFC 3986 bölüm 3'e bakın.

Doğrulama kuralları
Şema

JavaScript kaynakları, düz HTTP değil HTTPS şemasını kullanmalıdır. Localhost URI'leri (localhost IP adresi URI'leri dahil) bu kuraldan muaftır.

Düzenleyen

Ana makineler ham IP adresleri olamaz. Localhost IP adresleri bu kuraldan muaftır.

Alan
  • Ana makine TLD'leri (Üst Düzey Alanlar) herkese açık ek listesinde yer almalıdır.
  • Barındırıcı alanlar “googleusercontent.com” olamaz.
  • JavaScript kaynakları, uygulama alana sahip olmadığı sürece URL kısaltma alanları (ör. goo.gl) içeremez.
  • Userinfo

    JavaScript kaynakları, userinfo alt bileşenini içeremez.

    Yol

    JavaScript kaynakları, yol bileşenini içeremez.

    Sorgu

    JavaScript kaynakları sorgu bileşeni içeremez.

    Fragment

    JavaScript kaynakları, parça bileşeni içeremez.

    Karakterler JavaScript kaynakları aşağıdakiler dahil olmak üzere belirli karakterleri içeremez:
    • Joker karakterler ('*')
    • Yazdırılamayan ASCII karakterleri
    • Geçersiz yüzde kodlamaları (URL kodlaması biçiminde olmayan tüm yüzde kodlamaları: yüzde işareti ve ardından iki onaltılık rakam)
    • Null karakterler (kodlanmış bir NULL karakteri, ör. %00, %C0%80)

    Aşamalı yetkilendirme

    OAuth 2.0 protokolünde uygulamanız, kapsamlarla tanımlanan kaynaklara erişmek için yetkilendirme ister. Kaynaklar için yetkilendirme isteğinde bulunmak, kullanıcı deneyimi açısından en iyi uygulamalardan biri olarak kabul edilir. Google'ın yetkilendirme sunucusu, bu uygulamayı etkinleştirmek için artımlı yetkilendirmeyi destekler. Bu özellik, kapsamları gerektiği şekilde istemenize olanak tanır ve kullanıcı yeni kapsam için izin verirse kullanıcının projeye verdiği tüm kapsamları içeren bir jetonla değiştirilebilecek bir yetkilendirme kodu döndürür.

    Örneğin, bir uygulamanın YouTube Analytics raporlarını aldığını varsayalım. Bu raporlardan bazıları, diğer raporlar için gerekli olmayan ek bir kapsam erişimi gerektiren finansal raporlardır. Bu durumda, oturum açma sırasında uygulama yalnızca https://www.googleapis.com/auth/yt-analytics.readonly kapsamına erişim isteyebilir. Ancak kullanıcı, parasal bir rapor almaya çalıştıysa uygulama https://www.googleapis.com/auth/yt-analytics-monetary.readonly kapsamına erişim de isteyebilir.

    Artımlı yetkilendirmeden alınan erişim jetonları için aşağıdaki kurallar geçerlidir:

    • Jeton, yeni ve birleştirilmiş yetkilendirmeye dahil edilen kapsamların herhangi birine karşılık gelen kaynaklara erişmek için kullanılabilir.
    • Erişim jetonu almak için birleşik yetkilendirme için yenileme jetonunu kullandığınızda erişim jetonu, birleşik yetkilendirmeyi temsil eder ve yanıtta yer alan scope değerlerinden herhangi biri için kullanılabilir.
    • Birleştirilmiş yetkilendirme, izinler farklı istemcilerden istenmiş olsa bile kullanıcının API projesine verdiği tüm kapsamları içerir. Örneğin, bir kullanıcı uygulamanın masaüstü istemcisini kullanarak bir kapsama erişim izni verdiyse ve ardından mobil istemci aracılığıyla aynı uygulamaya başka bir kapsam için izin verdiyse birleştirilmiş yetkilendirme her iki kapsamı da içerir.
    • Birleştirilmiş yetkilendirmeyi temsil eden bir jetonu iptal ederseniz ilişkili kullanıcı adına bu yetkilendirmenin tüm kapsamlarına erişim aynı anda iptal edilir.

    Aşağıdaki kod örneklerinde, mevcut bir erişim jetonuna kapsamların nasıl ekleneceği gösterilmektedir. Bu yaklaşım, uygulamanızın birden fazla erişim jetonunu yönetmek zorunda kalmasını önler.

    OAuth 2.0 uç noktaları

    Bu örnekte, çağıran uygulama, kullanıcının uygulamaya daha önce verdiği erişimlere ek olarak kullanıcının YouTube Analytics verilerini almak için erişim isteğinde bulunuyor.

    Mevcut bir erişim jetonuna kapsam eklemek için Google'ın OAuth 2.0 sunucusuna yaptığınız istekte include_granted_scopes parametresini ekleyin.

    Aşağıdaki kod snippet'inde bunun nasıl yapılacağı gösterilmektedir. Snippet, erişim jetonunuzun geçerli olduğu kapsamları tarayıcının yerel depolama alanında depoladığınızı varsayar. (Tam örnek kod, tarayıcının yerel depolama alanında oauth2-test-params.scope özelliği ayarlanarak erişim jetonunun geçerli olduğu kapsamların listesini depolar.)

    Snippet, erişim jetonunun geçerli olduğu kapsamları belirli bir sorgu için kullanmak istediğiniz kapsamla karşılaştırır. Erişim jetonu bu kapsamı kapsamıyorsa OAuth 2.0 akışı başlar. Buradaki oauth2SignIn işlevi, 2. adımda sağlanan işlevle aynıdır (ve daha sonra tam örnekte de sağlanır).

    var SCOPE = 'https://www.googleapis.com/auth/yt-analytics.readonly';
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    
    var current_scope_granted = false;
    if (params.hasOwnProperty('scope')) {
      var scopes = params['scope'].split(' ');
      for (var s = 0; s < scopes.length; s++) {
        if (SCOPE == scopes[s]) {
          current_scope_granted = true;
        }
      }
    }
    
    if (!current_scope_granted) {
      oauth2SignIn(); // This function is defined elsewhere in this document.
    } else {
      // Since you already have access, you can proceed with the API request.
    }

    Jetonu iptal etme

    Bazı durumlarda kullanıcılar, bir uygulamaya verilen erişimi iptal etmek isteyebilir. Kullanıcı, Hesap Ayarları'nı ziyaret ederek erişimi iptal edebilir. Daha fazla bilgi için Hesabınıza erişimi olan üçüncü taraf site ve uygulamalar başlıklı destek belgesinin Site veya uygulama erişimini kaldırma bölümüne bakın.

    Bir uygulamanın, kendisine verilen erişimi programatik olarak iptal etmesi de mümkündür. Kullanıcının e-posta listesinden çıktığı, bir uygulamayı kaldırdığı veya bir uygulamanın ihtiyaç duyduğu API kaynaklarının önemli ölçüde değiştiği durumlarda programatik iptal önemlidir. Diğer bir deyişle, kaldırma işleminin bir parçası olarak, daha önce uygulamaya verilen izinlerin kaldırıldığından emin olmak için bir API isteği gönderilebilir.

    OAuth 2.0 uç noktaları

    Bir jetonu programatik olarak iptal etmek için uygulamanız https://oauth2.googleapis.com/revoke adresine bir istek gönderir ve jetonu parametre olarak ekler:

    curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
            https://oauth2.googleapis.com/revoke?token={token}

    Jeton, erişim jetonu veya yenileme jetonu olabilir. Jeton bir erişim jetonuysa ve karşılık gelen bir yenileme jetonu varsa yenileme jetonu da iptal edilir.

    İptal işlemi başarıyla işlenirse yanıtın HTTP durum kodu 200 olur. Hata durumlarında, hata koduyla birlikte bir HTTP durum kodu 400 döndürülür.

    Aşağıdaki JavaScript snippet'i, JavaScript için Google API'leri İstemci Kitaplığı'nı kullanmadan JavaScript'te jetonun nasıl iptal edileceğini gösterir. Google'ın jeton iptali için OAuth 2.0 uç noktası, kaynaklar arası kaynak paylaşımını (CORS) desteklemediğinden kod, bir form oluşturur ve isteği yayınlamak için XMLHttpRequest() yöntemini kullanmak yerine formu uç noktaya gönderir.

    function revokeAccess(accessToken) {
      // Google's OAuth 2.0 endpoint for revoking access tokens.
      var revokeTokenEndpoint = 'https://oauth2.googleapis.com/revoke';
    
      // Create <form> element to use to POST data to the OAuth 2.0 endpoint.
      var form = document.createElement('form');
      form.setAttribute('method', 'post');
      form.setAttribute('action', revokeTokenEndpoint);
    
      // Add access token to the form so it is set as value of 'token' parameter.
      // This corresponds to the sample curl request, where the URL is:
      //      https://oauth2.googleapis.com/revoke?token={token}
      var tokenField = document.createElement('input');
      tokenField.setAttribute('type', 'hidden');
      tokenField.setAttribute('name', 'token');
      tokenField.setAttribute('value', accessToken);
      form.appendChild(tokenField);
    
      // Add form to page and submit it to actually revoke the token.
      document.body.appendChild(form);
      form.submit();
    }

    Hesaplar Arası Koruma'yı uygulama

    Kullanıcılarınızın hesaplarını korumak için atmanız gereken ek bir adım da Google'ın hesaplar arası koruma hizmetinden yararlanarak hesaplar arası korumayı uygulamaktır. Bu hizmet, kullanıcı hesabında yapılan önemli değişiklikler hakkında uygulamanıza bilgi sağlayan güvenlik etkinliği bildirimlerine abone olmanıza olanak tanır. Ardından, etkinliklere nasıl yanıt vereceğinize bağlı olarak işlem yapmak için bu bilgileri kullanabilirsiniz.

    Google'ın hesaplar arası koruma hizmeti tarafından uygulamanıza gönderilen etkinlik türlerine ilişkin bazı örnekler:

    • https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
    • https://schemas.openid.net/secevent/oauth/event-type/token-revoked
    • https://schemas.openid.net/secevent/risc/event-type/account-disabled

    Hesaplar Arası Koruma'yı uygulama ve kullanılabilir etkinliklerin tam listesi hakkında daha fazla bilgi için Hesaplar Arası Koruma ile kullanıcı hesaplarını koruma sayfasını inceleyin.