Kullanıcı Kimlik Doğrulaması

Web kimlik doğrulama protokolleri HTTP özelliklerini kullanır ancak Chrome Uygulamaları uygulama kapsayıcısının içinde çalışır; HTTP üzerinden yüklenmezler, yönlendirme gerçekleştiremez veya çerez ayarlayamazlar.

Kullanıcıların kimliklerini doğrulamak için Chrome Identity API'yi kullanın: Google Hesaplarına giriş yapmış kullanıcılar için getAuthToken ve Google dışı bir hesaba giriş yapan kullanıcılar için launchWebAuthFlow. Uygulamanız kullanıcıların kimliğini doğrulamak için kendi sunucusunu kullanıyorsa sunucuyu kullanmanız gerekir.

İşleyiş şekli

Chrome Uygulamaları kullanıcılarının, profilleriyle ilişkilendirilmiş bir Google hesabı vardır. Uygulamalar, getAuthToken API'yi kullanarak bu kullanıcılar için OAuth2 jetonları alabilir.

Google dışı kimlik sağlayıcılarla kimlik doğrulama yapmak isteyen uygulamalar launchWebAuthFlow yöntemini çağırmalıdır. Bu yöntem, sağlayıcı sayfalarını göstermek için bir tarayıcı pop-up'ı kullanır ve belirli URL kalıplarına yapılan yönlendirmeleri yakalar. Yönlendirme URL'leri uygulamaya iletilir ve uygulama, jetonu URL'den çıkarır.

Google hesabı kimlik doğrulaması

Tamamlamanız gereken beş adım şunlardır:

  1. Manifest dosyanıza izinler ekleyin ve uygulamanızı yükleyin.
  2. Yüklenen manifest.json içindeki anahtarı kaynak manifest dosyanıza kopyalayın. Böylece uygulama kimliğiniz geliştirme sırasında sabit kalır.
  3. Chrome Uygulamanız için bir OAuth2 istemci kimliği alın.
  4. Manifest dosyanızı, istemci kimliğini ve kapsamları içerecek şekilde güncelleyin.
  5. Kimlik doğrulama jetonunu alın.

İzin ekle ve uygulama yükle

Kimlik izninin manifest dosyanızda olduğundan emin olmanız gerekir. Daha sonra, uygulamanızı uygulama ve uzantı yönetimi sayfasına yükleyebilirsiniz (bkz. Yayınlama).

"permissions": [
  "identity"
]

Anahtarı manifest'inize kopyalayın

Uygulamanızı Google OAuth konsoluna kaydederken jeton istekleri sırasında kontrol edilecek olan uygulama kimliğinizi sağlarsınız. Bu nedenle, geliştirme sırasında tutarlı bir uygulama kimliğine sahip olmak önemlidir.

Uygulama kimliğinizi sabit tutmak için yüklü manifest.json dosyasındaki anahtarı kaynak manifest'inize kopyalamanız gerekir. Çok nazik bir görev olmasa da süreç şu şekilde devam eder:

  1. Kullanıcı verileri dizininize gidin. MacO'larda örnek: ~/Library/Application\ Support/Google/Chrome/Default/Extensions
  2. Yüklü uygulamaları ve uzantıları listeleyin ve uygulama ve uzantı yönetimi sayfasındaki uygulama kimliğinizi, buradaki aynı kimlikle eşleştirin.
  3. Yüklü uygulama dizinine gidin (bu, uygulama kimliği içindeki bir sürüm olacaktır). Yüklü manifest.json dosyasını açın (pico, dosyayı açmanın hızlı bir yoludur).
  4. Yüklü manifest.json içindeki "anahtarı" kopyalayıp uygulamanızın kaynak manifest dosyasına yapıştırın.

OAuth2 istemci kimliğinizi alın

İstemci kimliğini almak için uygulamanızı Google API'ları Konsolu'na kaydetmeniz gerekir:

  1. Uygulamanızı Chrome Web Mağazası'na yüklemek için kullandığınız Google hesabıyla Google API Konsolu'na giriş yapın.
  2. Sol üst köşedeki açılır menüyü genişleterek ve Oluştur... menü öğesini seçerek yeni bir proje oluşturun.
  3. Ad oluşturulduktan ve adlandırıldıktan sonra "Hizmetler" gezinme menü öğesine gidin ve uygulamanızın ihtiyaç duyduğu tüm Google hizmetlerini açın.
  4. "API Erişimi" gezinme menü öğesine gidin ve OAuth 2.0 istemci kimliği oluştur... mavi düğmesini tıklayın.
  5. İstenen marka bilgilerini girin ve Yüklü uygulama türünü seçin.
  6. Chrome Uygulaması'nı seçin ve uygulama kimliğinizi (uygulamalar ve uzantı yönetimi sayfasında görüntülenen kimlikle aynı) girin.

Manifest dosyanızı OAuth2 istemci kimliği ve kapsamlarıyla güncelleyin

Manifest'inizi, istemci kimliğini ve kapsamları içerecek şekilde güncellemeniz gerekir. gdrive örneği için "oauth2" örneğini burada bulabilirsiniz:

"oauth2": {
    "client_id": "665859454684.apps.googleusercontent.com",
    "scopes": [
      "https://www.googleapis.com/auth/drive"
    ]
  }

Erişim jetonları alma

Artık identity.getAuthToken yöntemini çağırarak yetkilendirme jetonunu almaya hazırsınız.

chrome.identity.getAuthToken({ 'interactive': true }, function(token) {
  // Use the token.
});

Kullanıcı etkileşimi

getAuthToken çağırırken API'nin etkileşimli modda mı yoksa sessiz modda mı çağrılmasını istediğinizi belirten bir işaret (yukarıdaki örnekte 'interactive': true) iletebilirsiniz. API'yi etkileşimli modda çağırırsanız, gerektiğinde kullanıcıya aşağıdaki ekran görüntüsünde gösterildiği gibi oturum açma ve/veya onay kullanıcı arayüzü gösterilir:

Bir uygulama, Google Hesabı'nın kimliğini doğrulamak için Identity API'yi kullandığında kullanıcı arayüzünü gösteren ekran görüntüsü

API'yi sessiz modda çağırırsanız API, yalnızca herhangi bir kullanıcı arayüzü göstermeden jeton oluşturulabiliyorsa bir jeton döndürür. Bu, örneğin bir uygulamanın uygulama başlatılırken akış yaptığı durumlarda veya genel olarak herhangi bir kullanıcı hareketinin olmadığı durumlarda yararlıdır.

Önerdiğimiz en iyi uygulama, kullanıcı hareketi olmadığında sessiz modu, kullanıcı hareketi varsa (örneğin, kullanıcı, uygulamanızda Oturum Aç düğmesini tıklamışsa) etkileşimli modu kullanmaktır. Herhangi bir hareket şartını zorunlu kılmadığımızı unutmayın.

Önbelleğe alma

Chrome'un bellek içinde erişim jetonları içeren bir önbelleği vardır. Bu nedenle, jeton kullanmanız gerektiğinde getAuthToken çağırabilirsiniz. Jetonun son kullanma tarihi önbellek tarafından otomatik olarak gerçekleştirilir.

Jeton önbelleğinin mevcut durumunu chrome://identity-internals üzerinde görebilirsiniz.

Kullanıcının şifresini değiştirmesi veya süresi dolmamış erişim jetonlarının çalışmaması gibi bazı durumlar söz konusudur. Jetonu kullanan API çağrıları, 401 HTTP durum koduyla dönmeye başlayacaktır. Bunun olduğunu tespit ederseniz identity.removeCachedAuthToken kodunu çağırarak geçersiz jetonu Chrome önbelleğinden kaldırabilirsiniz.

removeCachedAuthToken kullanımına örnek:

// callback = function (error, httpStatus, responseText);
function authenticatedXhr(method, url, callback) {
  var retry = true;
  function getTokenAndXhr() {
    chrome.identity.getAuthToken({/* details */},
                                 function (access_token) {
      if (chrome.runtime.lastError) {
        callback(chrome.runtime.lastError);
        return;
      }

      var xhr = new XMLHttpRequest();
      xhr.open(method, url);
      xhr.setRequestHeader('Authorization',
                           'Bearer ' + access_token);

      xhr.onload = function () {
        if (this.status === 401 && retry) {
          // This status may indicate that the cached
          // access token was invalid. Retry once with
          // a fresh token.
          retry = false;
          chrome.identity.removeCachedAuthToken(
              { 'token': access_token },
              getTokenAndXhr);
          return;
        }

        callback(null, this.status, this.responseText);
      }
    });
  }
}

Google dışı hesap kimlik doğrulaması

Tamamlamanız gereken üç adım şunlardır:

  1. Sağlayıcıya kaydolun.
  2. Uygulamanızın erişeceği sağlayıcı kaynakları için izinler ekleyin.
  3. Kimlik doğrulama jetonunu alın.

Sağlayıcıya kaydol

Sağlayıcıya bir OAuth2 istemci kimliği kaydetmeniz ve istemci kimliğini web sitesi olarak yapılandırmanız gerekir. Kayıt sırasında girilecek yönlendirme URI'si için formun URL'sini kullanın: https://<extension-id>.chromiumapp.org/<anything-here>

Örneğin, uygulama kimliğiniz abcdefghijklmnopqrstuvwxyzabcdef ise ve provider_cb uygulamasının yol olmasını istiyorsanız bu kimliği diğer sağlayıcıların yönlendirme URI'leriyle ayırt etmek için şunu kullanmanız gerekir: https://abcdefghijklmnopqrstuvwxyzabcdef.chromiumapp.org/provider_cb

Sağlayıcı için izinler ekle

Kaynaklar arası XHR'leri sağlayıcı API uç noktalarına yapmak için izinlerdeki uygun kalıpları izin verilenler listesine eklemeniz gerekir:

"permissions": [
  ...
  "https://www.website-of-provider-with-user-photos.com/photos/*"
]

Jetonu alın

Jetonu almak için:

chrome.identity.launchWebAuthFlow(
  {'url': '<url-to-do-auth>', 'interactive': true},
  function(redirect_url) { /* Extract token from redirect_url */ });

<url-to-do-auth>, bir web sitesinden sağlayıcıya yetkilendirme yapmak için kullanılan URL'dir. Örneğin, bir sağlayıcıyla OAuth2 akışı gerçekleştirdiğinizi, uygulamanızı 123456789012345 istemci kimliğiyle kaydettiğinizi ve sağlayıcının web sitesindeki kullanıcının fotoğraflarına erişmek istediğinizi varsayalım: https://www.website-of-provider-with-user-photos.com/dialog/oauth?client_id=123456789012345& redirect_uri=https://abcdefghijklmnopqrstuvwxyzabcdef.chromiumapp.org/provider_cb&response_type=token&scope=user_photos

Sağlayıcı, kimlik doğrulama işlemi gerçekleştirir ve uygunsa kullanıcıya giriş ve/veya onay kullanıcı arayüzünü gösterir. Ardından https://abcdefghijklmnopqrstuvwxyzabcdef.chromiumapp.org/provider_cb#authToken=<auth-token> adresine yönlendirilir

Chrome bunu yakalar ve tam yönlendirme URL'si ile uygulamanın geri çağırmasını başlatır. Uygulama, jetonu URL'den çıkarmalıdır.

Etkileşimli ve sessiz mod karşılaştırması

launchWebAuthFlow çağırırken API'nin etkileşimli modda (sessiz mod) çağrılmasını isteyip istemediğinizi belirten bir işaret (yukarıdaki örnekte 'interactive': true) iletebilirsiniz. API'yi etkileşimli modda çağırırsanız, gerekiyorsa jetonu (oturum açma kullanıcı arayüzü ve/veya onay kullanıcı arayüzü ya da bu durumda sağlayıcıya özel kullanıcı arayüzü) alması için kullanıcıya kullanıcı arayüzü gösterilir.

API'yi sessiz modda çağırırsanız API, yalnızca sağlayıcının herhangi bir kullanıcı arayüzü göstermeden bir jeton sağlayabilmesi durumunda bir jeton döndürür. Bu, örneğin bir uygulamanın akışı uygulama başlangıcında yaptığı durumlarda veya herhangi bir kullanıcı hareketinin olmadığı durumlarda yararlıdır.

Önerdiğimiz en iyi uygulama, kullanıcı hareketi olmadığında sessiz modu, kullanıcı hareketi varsa (örneğin, kullanıcı, uygulamanızda Oturum Aç düğmesini tıklamışsa) etkileşimli modu kullanmaktır. Hareket zorunluluğunu zorunlu kılmadığımızı unutmayın.