Her Cloud-to-cloud entegrasyonu, kullanıcıların kimliğini doğrulama mekanizması içermelidir.
Kimlik doğrulama, kullanıcılarınızın Google hesaplarını kimlik doğrulama sisteminizdeki kullanıcı hesaplarına bağlamanıza olanak tanır. Bu sayede, yerine getirme işleminiz akıllı ev isteği aldığında kullanıcılarınızı tanımlayabilirsiniz. Google akıllı ev, yalnızca yetkilendirme kodu akışı olan OAuth'u destekler.
Bu sayfada, OAuth 2.0 sunucunuzu Cloud-to-cloud entegrasyonunuzla çalışacak şekilde nasıl ayarlayacağınız açıklanmaktadır.
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ı:
- 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.
- 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.
Koşullar
- 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.
- "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.
- Kullanıcıların bağlantı oluşturmak istemedikleri takdirde geri dönebilecekleri veya iptal edebilecekleri bir yöntem sunmanız gerekir.
- 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:
Google'ın Gizlilik Politikası'nı görüntüleyin. İzin ekranına Google'ın Gizlilik Politikası'nın bağlantısını ekleyin.
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.
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.
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.
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.
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ı, hizmetinizin HTTPS üzerinden kullanıma sunduğu iki uç noktadan oluşur. İlk uç nokta, veri erişimi için kullanıcılardan izin almaktan veya izinleri bulmadan sorumlu olan yetkilendirme uç noktasıdır. Yetkilendirme uç noktası, oturum açmamış kullanıcılarınıza oturum açma kullanıcı arayüzü sunar ve istenen erişime verilen izni kaydeder. İkinci uç nokta, jeton değişimi uç noktasıdır. Bu uç noktası, kullanıcının hizmetinize erişmesine yetki veren, jeton adı verilen şifrelenmiş dizeleri almak için kullanılır.
Bir Google uygulamasının hizmetinizin API'lerinden birini çağırması gerektiğinde Google, bu API'leri kendi adlarına çağırmaları için kullanıcılarınızdan izin almak üzere bu uç noktaları birlikte kullanır.
Google tarafından başlatılan bir OAuth 2.0 yetkilendirme kodu akışı oturumunda aşağıdaki akış geçerlidir:
- Google, kullanıcının tarayıcısında yetkilendirme uç noktanızı açar. Bir işlem için akış yalnızca sesli cihazda başlatılırsa Google, yürütmeyi bir telefona aktarır.
- Kullanıcı, henüz oturum açmadıysa oturum açar ve Google'a, API'nizle verilerine erişme izni verir (henüz izin vermediyse).
- Hizmetiniz bir yetkilendirme kodu oluşturur ve bu kodu Google'a döndürür. Bunun için kullanıcının tarayıcısını, isteğe yetkilendirme kodu eklenmiş şekilde Google'a yönlendirin.
- Google, yetkilendirme kodunu jeton değişimi uç noktanıza gönderir. Bu uç nokta, kodun özgünlüğünü doğrular ve bir erişim jetonu ile yenileme jetonu döndürür. Erişim jetonu, hizmetinizin API'lere erişmek için kimlik bilgisi olarak kabul ettiği kısa ömürlü bir jetondur. Yenileme jetonu, Google'ın süresi dolan yeni erişim jetonları almak için saklayıp kullanabileceği uzun ömürlü bir jetondur.
- Kullanıcı hesap bağlama akışını tamamladıktan sonra Google'dan gönderilen her istek bir erişim jetonu içerir.
Yetkilendirme isteklerini işleme
OAuth 2.0 yetkilendirme kodu akışını kullanarak hesap bağlamanız gerektiğinde Google, kullanıcıyı aşağıdaki parametreleri içeren bir istekle yetkilendirme uç noktanıza gönderir:
Yetkilendirme uç noktası parametreleri | |
---|---|
client_id |
Google'a atadığınız istemci kimliği. |
redirect_uri |
Bu istek için yanıtı gönderdiğiniz URL. |
state |
Yönlendirme URI'sinde Google'a değiştirilmeden geri gönderilen bir muhasebe değeri. |
scope |
İsteğe bağlı: Google'ın yetkilendirme isteğinde bulunduğu verileri belirten, boşlukla ayrılmış bir dizi kapsam dizesi. |
response_type |
Yanıtta döndürülecek değer türü. OAuth 2.0 yetkilendirme kodu akışında yanıt türü her zaman code olur.
|
user_locale |
İçeriğinizi kullanıcının tercih ettiği dilde yerelleştirmek için kullanılan, RFC5646 biçimindeki Google Hesabı dil ayarı. |
Örneğin, yetkilendirme uç noktanız https://myservice.example.com/auth
adresindeyse bir istek 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şleyebilmesi için aşağıdaki adımları uygulayın:
client_id
değerinin Google'a atadığınız istemci kimliğiyle,redirect_uri
değerinin ise hizmetiniz için Google tarafından sağlanan yönlendirme URL'siyle eşleştiğini doğrulayın. Bu kontroller, istemci uygulamalarına istenmeyen veya yanlış yapılandırılmış uygulamalara erişim izni verilmesini önlemek için önemlidir. Birden fazla OAuth 2.0 akışını destekliyorsanızresponse_type
değerinincode
olduğunu da onaylayın.- Kullanıcının hizmetinizde oturum açıp açmadığını kontrol edin. Kullanıcı oturum açmadıysa hizmetinizin oturum açma veya kaydolma akışını tamamlayın.
- Google'ın API'nize erişmek için kullanacağı bir yetkilendirme kodu oluşturun. Yetkilendirme kodu herhangi bir dize değeri olabilir ancak kullanıcıyı, jetonun ait olduğu istemciyi ve kodun geçerlilik bitiş zamanını benzersiz şekilde temsil etmeli ve tahmin edilebilir olmamalıdır. Genellikle yaklaşık 10 dakika sonra süresi dolan yetkilendirme kodları gönderirsiniz.
redirect_uri
parametresi tarafından belirtilen URL'nin aşağıdaki biçime sahip olduğunu doğrulayın:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
- Kullanıcının tarayıcısını
redirect_uri
parametresi tarafından belirtilen URL'ye yönlendirir.code
vestate
parametrelerini ekleyerek yönlendirme yaparken, yeni oluşturduğunuz yetkilendirme kodunu ve değiştirilmemiş orijinal durum değerini ekleyin. Aşağıda, elde edilen URL'ye dair bir örnek verilmiştir: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 jeton değişiminden sorumludur:
- Yetkilendirme kodlarını erişim jetonları ve yenileme jetonlarıyla değiştirme
- Yenileme jetonlarını erişim jetonlarıyla değiştirme
Jeton değişimi istekleri aşağıdaki parametreleri içerir:
Jeton değişimi uç noktası parametreleri | |
---|---|
client_id |
İsteğin kaynağını Google olarak tanımlayan bir dize. Bu dize, Google'ın benzersiz tanımlayıcısı olarak sisteminizde kaydedilmelidir. |
client_secret |
Hizmetiniz için Google'a kaydettiğiniz gizli dize. |
grant_type |
Değişim yapılan jetonun türü. authorization_code veya refresh_token olmalıdır. |
code |
grant_type=authorization_code olduğunda bu parametre, Google'ın oturum açma veya jeton değişimi uç noktanızdan aldığı koddur. |
redirect_uri |
grant_type=authorization_code olduğunda bu parametre, ilk yetkilendirme isteğinde kullanılan URL'dir. |
refresh_token |
grant_type=refresh_token olduğunda bu parametre, Google'ın jeton değişimi uç noktanızdan aldığı yenileme jetonudur. |
Google'ın kimlik bilgilerini sunucunuza nasıl göndereceğini yapılandırma
Yetkilendirme sunucunuz, uygulanma şekline bağlı olarak istek gövdesinde veya istek başlığında istemci kimlik bilgilerini almayı bekler.
Google, kimlik bilgilerini varsayılan olarak istek gövdesinde gönderir. Yetkilendirme sunucunuz istemci kimlik bilgilerinin istek başlığında olmasını gerektiriyorsa Cloud-to-cloud entegrasyonunuzu buna göre yapılandırmanız gerekir:
Proje listesinde, üzerinde çalışmak istediğiniz projenin yanındaki Aç'ı tıklayın.
Buluttan Buluta bölümünde Geliştir'i seçin.
Entegrasyonunuzun yanındaki Aç'ı tıklayın.
İzinler (isteğe bağlı) bölümüne gidin ve Google'ın istemci kimliğini ve gizlisini HTTP temel kimlik doğrulama üstbilgisi üzerinden iletmesini sağlayın onay kutusunu işaretleyin.
Değişikliklerinizi kaydetmek için Kaydet'i tıklayın.
Yetkilendirme kodlarını erişim jetonları ve yenileme jetonlarıyla değiştirme
Kullanıcı oturum açtıktan ve yetkilendirme uç noktanız Google'a kısa süreli bir yetkilendirme kodu döndürdükten sonra Google, yetkilendirme kodunu bir erişim jetonu ve yenileme jetonuyla değiştirmek için jeton değişimi uç noktanıza bir istek gönderir.
Bu isteklerde grant_type
değeri authorization_code
, code
değeri ise daha önce Google'a verdiğiniz yetkilendirme kodunun değeridir. Aşağıda, yetkilendirme koduyla erişim jetonu ve yenileme jetonu değiş tokuşu yapma isteği örneği verilmiştir:
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
Yetkilendirme kodlarını erişim jetonu ve yenileme jetonuyla değiştirmek için jeton değişimi uç noktanız, aşağıdaki adımları uygulayarak POST
isteklerine yanıt verir:
client_id
değerinin, istek kaynağını yetkili bir kaynak olarak tanımladığından veclient_secret
değerinin beklenen değerle eşleştiğinden emin olun.- Yetkilendirme kodunun geçerli ve süresinin dolmadığını ve isteğinde belirtilen istemci kimliğinin, yetkilendirme koduyla ilişkili istemci kimliğiyle eşleştiğini doğrulayın.
redirect_uri
parametresi tarafından belirtilen URL'nin, ilk yetkilendirme isteğinde kullanılan değerle aynı olduğunu onaylayın.- Yukarıdaki ölçütlerin tümünü doğrulayamazsanız gövdesi
{"error": "invalid_grant"}
olan bir HTTP 400 Hatalı İstek hatası döndürün. - Aksi takdirde, yenileme jetonu ve erişim jetonu oluşturmak için yetkilendirme kodundaki kullanıcı kimliğini kullanın. Bu jetonlar herhangi bir dize değeri olabilir ancak kullanıcıyı ve jetonun kullanılacağı istemciyi benzersiz şekilde temsil etmeli ve tahmin edilebilir olmamalıdır. Erişim jetonları için jetonun geçerlilik bitiş zamanını da kaydedin. Bu zaman genellikle jetonu yayınladıktan bir saat sonradır. Yenileme jetonlarının süresi dolmaz.
- 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ının erişim jetonunu ve yenileme jetonunu depolar ve erişim jetonunun süresinin dolduğunu kaydeder. Erişim jetonunun süresi dolduğunda Google, jeton değişimi uç noktanızdan yeni bir erişim jetonu almak için yenileme jetonunu kullanır.
Yenileme jetonlarını erişim jetonlarıyla değiştirme
Bir erişim jetonunun süresi dolduğunda Google, yenileme jetonunu yeni bir erişim jetonuyla değiştirmek için jeton değişimi uç noktanıza bir istek gönderir.
Bu isteklerde grant_type
değeri refresh_token
, refresh_token
değeri ise daha önce Google'a verdiğiniz yenileme jetonunun değeridir. Aşağıda, yenileme jetonunu erişim jetonuyla değiştirme isteği örneği verilmiştir:
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 erişim jetonuyla değiştirmek için jeton değişimi uç noktanız, aşağıdaki adımları uygulayarak POST
isteklerine yanıt verir:
client_id
değerinin istek kaynağını Google olarak tanımladığından veclient_secret
değerinin beklenen değerle eşleştiğinden emin olun.- Yenileme jetonunun geçerli olup olmadığını ve istekte belirtilen istemci kimliğinin, yenileme jetonuyla ilişkili istemci kimliğiyle eşleşip eşleşmediğini doğrulayın.
- Yukarıdaki ölçütlerin tümünü doğrulayamazsanız gövdesi
{"error": "invalid_grant"}
olan bir HTTP 400 Kötü İstek hatası döndürün. - Aksi takdirde, erişim jetonu oluşturmak için yenileme jetonundaki kullanıcı kimliğini kullanın. Bu jetonlar herhangi bir dize değeri olabilir ancak kullanıcıyı ve jetonun kullanılacağı istemciyi benzersiz şekilde temsil etmeli ve tahmin edilebilir olmamalıdır. Erişim jetonları için jetonun geçerlilik bitiş zamanını da (genellikle jetonu verdikten bir saat sonra) kaydedin.
- HTTPS yanıtının gövdesinde aşağıdaki JSON nesnesini döndürün:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
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:
- Google One Tap ile Bağlı Hesapta Oturum Açma.
- AndroidTV'de sorunsuz abonelik.
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:
- Yetkilendirme başlığından erişim jetonunu çıkarın ve erişim jetonuyla ilişkilendirilmiş kullanıcının bilgilerini döndürün.
- 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. 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.