OAuth 2.0 sunucusu uygulama

Her smart home İşlemi, kullanıcıların kimliğini doğrulamak için kullanılır.

Kimlik doğrulama, kullanıcılarınızın hesaplarına veya Google hesapları kimlik doğrulama sisteminizdeki kullanıcı hesaplarıyla oturum açın. Bu sayede, kullanıcılarınızın hangi işlemleri sipariş karşılama sürecinin akıllı ev niyetiyle örtüştüğünü gösterir. Google akıllı ev yalnızca yetkilendirme kodu akışı.

Bu sayfada, OAuth 2.0 sunucunuzu OAuth 2.0 sunucusuyla çalışacak şekilde nasıl smart home İşleminiz.

OAuth ile Google Hesabı Bağlama

Yetkilendirme kodu akışında iki uç noktaya ihtiyacınız vardır:

  • Henüz oturum açmamış kullanıcılarınıza oturum açma kullanıcı arayüzünü sunan Yetkilendirme uç noktası. Yetkilendirme uç noktası, kullanıcıların istenen erişim için verdiği izni kaydetmek amacıyla kısa ömürlü bir yetkilendirme kodu da oluşturur.

  • İki tür exchange'den sorumlu olan jeton değişimi uç noktası:

    1. Uzun ömürlü yenileme jetonu ve kısa ömürlü bir erişim jetonu için yetkilendirme kodu değiştirir. Bu değişim, kullanıcı hesap bağlama akışını gerçekleştirdiğinde gerçekleşir.
    2. Kısa ömürlü bir erişim jetonu için uzun ömürlü bir yenileme jetonu değiştirir. Bu exchange, süresi dolduğu için Google yeni bir erişim jetonuna ihtiyaç duyduğunda gerçekleşir.

Tasarım yönergeleri

Bu bölümde, OAuth bağlantı akışları için barındırdığınız kullanıcı ekranına yönelik tasarım gereksinimleri ve önerileri açıklanmaktadır. Google'ın uygulaması tarafından çağrıldıktan sonra platformunuz, Google sayfasında oturum açma işlemini ve hesap bağlama izin ekranını kullanıcıya gösterir. Kullanıcı, hesapları bağlamasına izin verdikten sonra tekrar Google'ın uygulamasına yönlendirilir.

Bu şekilde, bir kullanıcının Google hesabını kimlik doğrulama sisteminize bağlama adımları gösterilmektedir. İlk ekran görüntüsünde, platformunuzdan kullanıcı tarafından başlatılan bağlantı oluşturma işlemi gösterilmektedir. İkinci resimde kullanıcının Google'da oturum açması, üçüncü resimde ise Google hesabını uygulamanıza bağlama konusunda kullanıcı rızası ve onayı gösteriliyor. Son ekran görüntüsünde, Google uygulamasında başarıyla bağlanmış bir kullanıcı hesabı gösteriliyor.
Şekil 1. Hesabı bağlayan kullanıcının Google'da oturum açması ve izin ekranlarında

Koşullar

  1. Kullanıcının hesabının Google Home veya Google Asistan gibi belirli bir Google ürününe değil, Google'a bağlanacağını bildirmeniz gerekir.
  2. "Oturum açarak, Google'a cihazlarınızı kontrol etme yetkisi veriyorsunuz" gibi bir Google yetkilendirme beyanınızın olması gerekir. Google Home Geliştirici Politikaları'nın Google Cihaz Kontrolü Yetkilendirmesi bölümüne bakın.
  3. Kullanıcıların bağlantı oluşturmak istemedikleri takdirde geri dönebilecekleri veya iptal edebilecekleri bir yöntem sunmanız gerekir.
  4. Web OAuth bağlantı sayfasını açmalı ve kullanıcıların, Google Hesaplarında oturum açmak için kullanıcı adı ve şifre alanları gibi net bir yönteme sahip olduğundan emin olmalısınız. Kullanıcıların Web OAuth Bağlantısı sayfasına yönlendirilmeden bağlantı kurmasını sağlayan Google ile Oturum Açma (GSI) yöntemini kullanmayın. Bu durum, Google politikasını ihlal etmektedir.

Öneriler

Aşağıdakileri yapmanızı öneririz:

  1. Google'ın Gizlilik Politikası'nı görüntüleyin. İzin ekranına Google'ın Gizlilik Politikası'nın bağlantısını ekleyin.

  2. Paylaşılacak veriler. Kullanıcıya Google'ın hangi verileri neden istediğini açıklamak için açık ve net bir dil kullanın.

  3. Harekete geçirici mesajın net olması. İzin ekranınızda "Kabul et ve bağla" gibi net bir harekete geçirici mesaj belirtin. Bunun nedeni, kullanıcıların hesaplarını bağlamak için Google ile hangi verileri paylaşmaları gerektiğini anlamalarıdır.

  4. Bağlantıyı kaldırma olanağı. Kullanıcılara, bağlantıyı kaldırmaları için platformunuzdaki hesap ayarlarına yönlendiren bir URL gibi bir mekanizma sunun. Alternatif olarak, kullanıcıların bağlı hesaplarını yönetebileceği bir Google Hesabı bağlantısı ekleyebilirsiniz.

  5. Kullanıcı hesabı değiştirme olanağı. Kullanıcılara hesaplarını değiştirmeleri için bir yöntem önerin. Bu, özellikle kullanıcılar genellikle birden fazla hesaba sahipse yararlıdır.

    • Bir kullanıcının hesaplar arasında geçiş yapmak için izin ekranını kapatması gerekiyorsa kullanıcının OAuth bağlantısı oluşturma ile istediği hesapta oturum açabilmesi için Google'a kurtarılabilir bir hata gönderin.
  6. Logonuzu ekleyin. İzin ekranında şirket logonuzu gösterin. Logonuzu yerleştirmek için stil kurallarınızı kullanın. Google'ın logosunu da görüntülemek istiyorsanız Logolar ve ticari markalar konusuna bakın.

Yetkilendirme kodu akışı

Yetkilendirme kodu akışının OAuth 2.0 sunucu uygulaması şunlardan oluşur: iki uç noktanız vardır. İlk uç nokta kimlik doğrulama uç noktasıdır. Bu, kullanıcılara veri erişimi için kullanıcılardan izin almalarını Yetkilendirme uç noktası, oturum açmamış kullanıcılar için oturum açma kullanıcı arayüzünü sunar ve istenen erişim. İkinci uç nokta ise üçüncü uç noktadır. Jeton adı verilen ve kullanıcıya aşağıdakileri yapma yetkisi veren şifrelenmiş dizeleri elde etmek için kullanılır. hizmetinize erişin.

Bir Google uygulamasının, hizmetinizin API'lerinden birini çağırması gerektiğinde Google, kullanıcılarınızdan bu API'leri çağırmak için izin almak üzere bu uç noktaları bir araya getirin. oluşturabilirsiniz.

Google tarafından başlatılan bir OAuth 2.0 yetkilendirme kodu akışı oturumunda, takip eden akış:

  1. Google, yetkilendirme uç noktanızı kullanıcının tarayıcısında açar. Akış bir işlem için yalnızca ses içeren bir cihazda başlatıldığında Google yürütme sürecidir.
  2. Kullanıcı oturum açmış değilse oturum açar ve Google'a şunu yapması için izin verir: Henüz izin vermediyse verilerine API'nizle erişme.
  3. Hizmetiniz bir yetkilendirme kodu oluşturur ve Google'a geri gönderir. Yapılacaklar Bu nedenle, kullanıcının tarayıcısını, yetkilendirme koduyla birlikte tekrar Google'a yönlendirin. ekleyebilirsiniz.
  4. Google, yetkilendirme kodunu jeton değişimi uç noktanıza gönderir. Bu işlem kodun orijinalliğini doğrular ve bir erişim jetonu ve yenileme jetonu. Erişim jetonu, hizmetinizin Google tarafından API'lere erişmek için kimlik bilgisi olarak kabul eder. Yenileme jetonu uzun ömürlü yeni erişim jetonları almak üzere saklayabileceği ve kullanabileceği bir jeton olarak sona erecektir.
  5. Kullanıcı hesap bağlama akışını tamamladıktan sonra, isteği bir erişim jetonu içeriyor.

Yetkilendirme isteklerini işleme

OAuth 2.0 yetkilendirme kodunu kullanarak hesap bağlama işlemi gerçekleştirmeniz gerektiğinde akışında, Google, kullanıcıyı yetkilendirme uç noktanıza bir istek göndererek aşağıdaki parametreleri içerir:

Yetkilendirme uç noktası parametreleri
client_id Google'a atadığınız İstemci Kimliği.
redirect_uri Bu isteğe yanıt gönderdiğiniz URL.
state yönlendirme URI'si.
scope İsteğe bağlı: Google'ın yetkilendirme istediği veriler.
response_type Yanıtta döndürülecek değerin türü. OAuth 2.0 için yetkilendirme kodu akışı, yanıt türü her zaman code olur.
user_locale Google Hesabı dil ayarı RFC5646 biçimi, içeriğinizi kullanıcının tercih ettiği dilde yerelleştirmek için kullanılır.

Örneğin, yetkilendirme uç noktanız https://myservice.example.com/auth, talep aşağıdaki gibi görünebilir:

GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code&user_locale=LOCALE

Yetkilendirme uç noktanızın oturum açma isteklerini işlemesi için aşağıdakileri yapın için şu adımları izleyin:

  1. client_id bilgisinin, Google'a atadığınız İstemci Kimliği ile eşleştiğini ve redirect_uri bilgisinin, Google tarafından hizmetiniz için sağladığı yönlendirme URL'si ile eşleştiğini doğrulayın. Bu kontroller, onay alınmasının önlenmesi açısından önemlidir. istenmeyen veya yanlış yapılandırılmış istemci uygulamalarına erişim. Birden fazla OAuth 2.0 akışları, response_type öğesinin code olduğunu da onaylayın.
  2. Kullanıcının hizmetinizde oturum açıp açmadığını kontrol edin. Kullanıcı oturum açmamışsa hizmetinizin oturum açma veya kayıt akışını tamamlayın.
  3. Google'ın API'nize erişmek için kullanması için bir yetkilendirme kodu oluşturun. Yetkilendirme kodu herhangi bir dize değeri olabilir, ancak benzersiz bir şekilde kullanıcıyı, jetonun ait olduğu istemciyi ve kodun geçerlilik bitiş tarihini ve tahmin edilebilir olmamalıdır. Genellikle, her ay web sitesinde sonra süresi dolan kodları kullanır.
  4. redirect_uri parametresiyle belirtilen URL'nin şu formu kullanın:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
      
  5. Kullanıcının tarayıcısını redirect_uri parametresinden yararlanın. Alacağınız yetkilendirme kodunu URL'nin otomatik olarak oluşturulmuş ve orijinal, değiştirilmemiş durum değerini code ve state parametrelerini ekleyerek. Bu, sonuç URL'sinin örneği:
    https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING
    .

Jeton değişimi isteklerini işleme

Hizmetinizin jeton değişimi uç noktası iki tür jetondan sorumludur takaslar:

  • Erişim jetonları ve yenileme jetonları için yetkilendirme kodlarını gönderip alın
  • Erişim jetonları için yenileme jetonları değişimi

Jeton değişimi istekleri aşağıdaki parametreleri içerir:

Jeton değişimi uç nokta parametreleri
client_id İstek kaynağını Google olarak tanımlayan bir dize. Bu dize sisteminizde Google'ın benzersiz tanımlayıcısı olarak kayıtlı olmalıdır.
client_secret Hizmetiniz için Google'a kaydettiğiniz gizli dize.
grant_type Değişen jetonun türü. Ya da authorization_code veya refresh_token.
code grant_type=authorization_code olduğunda bu parametre Google'ın oturum açma işleminizden veya jeton değişiminizden aldığı kod uç nokta.
redirect_uri grant_type=authorization_code olduğunda bu parametre İlk yetkilendirme isteğinde kullanılan URL.
refresh_token grant_type=refresh_token olduğunda bu parametre Google'ın jeton değişimi uç noktanızdan aldığı yenileme jetonu.

Erişim jetonları ve yenileme jetonları için yetkilendirme kodlarını gönderip alın

Kullanıcı oturum açtıktan ve yetkilendirme uç noktanız kısa ömürlü bir uyarı döndürdükten yetkilendirme kodu Google'a gönderilirse Google, jeton değişiminize bir istek gönderir uç nokta aracılığıyla yetkilendirme kodunu erişim jetonu ve yenileme için değiştirin jeton.

Bu istekler için grant_type değeri authorization_code ve code değeri, daha önce verdiğiniz yetkilendirme kodunun değeridir Google'a otomatik olarak gönderin. Aşağıda, erişim jetonu ve yenileme jetonu için yetkilendirme kodu:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI

Bir erişim jetonu ve yenileme jetonuyla yetkilendirme kodları değişimi yapmak için jeton değişimi uç noktası, aşağıdaki komutu çalıştırarak POST isteklerine yanıt verir için şu adımları izleyin:

  1. client_id öğesinin, istek kaynağını yetkili bir kaynak olarak tanımladığını doğrulayın ve client_secret değerinin beklenen değerle eşleştiğinden emin olun.
  2. Yetkilendirme kodunun geçerli olduğunu, süresinin dolmadığını ve İstekte belirtilen istemci kimliği, yetkilendirme kodu.
  3. redirect_uri parametresi tarafından belirtilen URL'nin aynı olduğunu onaylayın ilk yetkilendirme isteğinde kullanılan değerle aynıdır.
  4. Yukarıdaki ölçütlerin tümünü doğrulayamazsanız bir HTTP döndürün Gövde olarak {"error": "invalid_grant"} kullanılırken 400 Hatalı İstek hatası.
  5. Aksi takdirde, yenileme oluşturmak için yetkilendirme kodundaki kullanıcı kimliğini kullanın. jetonu ve erişim jetonu bulunur. Bu jetonlar herhangi bir dize değeri olabilir, ancak kullanıcıyı ve jetonun ait olduğu istemciyi benzersiz bir şekilde temsil etmelidir ve tahmin edilebilir olmamalıdır. Erişim jetonları için Jetonu girmeniz gerekir. Bu işlem genellikle siz jetonun verilmesinden bir saat sonradır. Yenileme jetonlarının geçerlilik süresi sona ermez.
  6. HTTPS yanıtının gövdesinde aşağıdaki JSON nesnesini döndürün:
    {
    "token_type": "Bearer",
    "access_token": "ACCESS_TOKEN",
    "refresh_token": "REFRESH_TOKEN",
    "expires_in": SECONDS_TO_EXPIRATION
    }
    
    .

Google, kullanıcı için erişim jetonunu ve yenileme jetonunu depolar ve kayıtlar erişim jetonunun süresinin dolması. Erişim jetonunun süresi dolduğunda Google, yenileme jetonunu kullanın.

Erişim jetonları için yenileme jetonları değişimi

Bir erişim jetonunun süresi dolduğunda Google, jeton değişiminize bir istek gönderir yeni bir erişim jetonuyla yenileme jetonu değişimi yapmasına olanak tanır.

Bu istekler için grant_type değeri refresh_token ve refresh_token değeri, daha önce verdiğiniz yenileme jetonunun değeridir. Google'a dokunun. Aşağıda, bir yenileme jetonu değiş tokuşuna ilişkin bir istek örneği verilmiştir şu adımları izleyin:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

Yenileme jetonunu bir erişim jetonuyla değiştirmek için jeton değişimi uç noktanız POST isteklerine aşağıdaki adımları uygulayarak yanıt verir:

  1. client_id öğesinin, istek kaynağını Google olarak tanımladığını ve client_secret değerinin beklenen değerle eşleştiğinden emin olun.
  2. Yenileme jetonunun geçerli olduğunu ve İstek, yenileme jetonuyla ilişkili istemci kimliğiyle eşleşir.
  3. Yukarıdaki ölçütlerin tümünü doğrulayamazsanız HTTP 400 döndürün Gövde olarak {"error": "invalid_grant"} kullanıldığında hatalı İstek hatası oluştu.
  4. Aksi takdirde, erişim oluşturmak için yenileme jetonundaki kullanıcı kimliğini kullanın. jeton. Bu jetonlar herhangi bir dize değeri olabilir, ancak benzersiz olmaları gerekir jetonun ait olduğu kullanıcıyı ve müşteriyi temsil etmeli, tahmin edilebilir. Erişim jetonları için jetonun geçerlilik bitiş zamanını da kaydedin. genellikle jetonu göndermenizden bir saat sonra gönderilir.
  5. HTTPS gövdesinde aşağıdaki JSON nesnesini döndürün yanıt:
    {
    "token_type": "Taşıyıcı",
    "access_token": "ACCESS_TOKEN",
    "expires_in": SECONDS_TO_EXPIRATION
    }
ziyaret edin.

Kullanıcı bilgileri isteklerini işleme

userinfo uç noktası, bağlı kullanıcıyla ilgili hak taleplerini döndüren, OAuth 2.0 korumalı bir kaynaktır. Kullanıcı bilgileri uç noktasını uygulamak ve barındırmak, aşağıdaki kullanım alanları hariç isteğe bağlıdır:

Erişim jetonu, jeton uç noktanızdan başarıyla alındıktan sonra Google, bağlı kullanıcıyla ilgili temel profil bilgilerini almak için kullanıcı bilgileri uç noktanıza bir istek gönderir.

kullanıcı bilgileri uç nokta istek başlıkları
Authorization header Taşıyıcı türündeki erişim jetonu.

Örneğin, kullanıcı bilgileri uç noktanız https://myservice.example.com/userinfo, talep aşağıdaki gibi görünebilir:

GET /userinfo HTTP/1.1
Host: myservice.example.com
Authorization: Bearer ACCESS_TOKEN

Kullanıcı bilgileri uç noktanızın istekleri işlemesi için aşağıdaki adımları uygulayın:

  1. Yetkilendirme başlığından erişim jetonunu çıkarın ve erişim jetonuyla ilişkilendirilmiş kullanıcının bilgilerini döndürün.
  2. Erişim jetonu geçersizse WWW-Authenticate yanıt üstbilgisini kullanarak HTTP 401 Yetkilendirilmemiş hatası döndürün. Aşağıda kullanıcı bilgileri hata yanıtı örneği verilmiştir:
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: error="invalid_token",
    error_description="The Access Token expired"
    
    . Bağlama işlemi sırasında 401 Yetkilendirilmedi veya başka bir başarısız hata yanıtı döndürülürse bu hata düzeltilemez, alınan jeton silinir ve kullanıcının bağlantı oluşturma işlemini yeniden başlatması gerekir.
  3. Erişim jetonu geçerliyse HTTPS gövdesinde aşağıdaki JSON nesnesiyle HTTP 200 yanıtını döndürün ve HTTP 200 yanıtını alın yanıt:

    {
    "sub": "USER_UUID",
    "email": "EMAIL_ADDRESS",
    "given_name": "FIRST_NAME",
    "family_name": "LAST_NAME",
    "name": "FULL_NAME",
    "picture": "PROFILE_PICTURE",
    }
    
    Kullanıcı bilgileri uç noktanız HTTP 200 başarılı yanıtı döndürürse alınan jeton ve hak talepleri kullanıcının Google Hesabı'na kaydedilir.

    userinfo uç nokta yanıtı
    sub Sisteminizdeki kullanıcıyı tanımlayan benzersiz bir kimlik.
    email Kullanıcının e-posta adresi.
    given_name İsteğe bağlı: Kullanıcının adı.
    family_name İsteğe bağlı: Kullanıcının soyadı.
    name İsteğe bağlı: Kullanıcının tam adı.
    picture İsteğe bağlı: Kullanıcının profil resmi.