Google'ın OAuth 2.0 API'leri hem kimlik doğrulama hem de yetkilendirme için kullanılabilir. Bu dokümanda, kimlik doğrulama için OpenID Connect spesifikasyonuna uygun ve OpenID Sertifikalı olan OAuth 2.0 uygulamamız açıklanmaktadır. Google API'lerine erişmek için OAuth 2.0'ı kullanma başlıklı makalede yer alan belgeler bu hizmet için de geçerlidir. Bu protokolü etkileşimli olarak keşfetmek istiyorsanız Google OAuth 2.0 Playground'u kullanmanızı öneririz. Stack Overflow'da yardım almak için sorularınızı "google-oauth" etiketiyle etiketleyin.
OAuth 2.0'ı ayarlama
Uygulamanızın kullanıcı girişi için Google'ın OAuth 2.0 kimlik doğrulama sistemini kullanabilmesi için Google Cloud Console'da bir proje oluşturarak OAuth 2.0 kimlik bilgilerini almanız, yönlendirme URI'si ayarlamanız ve (isteğe bağlı olarak) kullanıcılarınızın kullanıcı rızası ekranında gördüğü marka bilgilerini özelleştirmeniz gerekir. Cloud Console'u kullanarak hizmet hesabı oluşturma, faturalandırmayı etkinleştirme, filtreleme ayarlama ve diğer görevleri de gerçekleştirebilirsiniz. Daha fazla bilgi için Google Cloud Console Yardım sayfasını inceleyin.
OAuth 2.0 kimlik bilgilerini alma
Kullanıcıların kimliğini doğrulamak ve Google'ın API'lerine erişmek için istemci kimliği ve istemci gizli anahtarı dahil olmak üzere OAuth 2.0 kimlik bilgilerine ihtiyacınız vardır.
Belirli bir OAuth 2.0 kimlik bilgisinin istemci kimliğini ve istemci gizli anahtarını görüntülemek için şu metni tıklayın: Kimlik bilgisi seç. Açılan pencerede projenizi ve istediğiniz kimlik bilgisini seçip Görüntüle'yi tıklayın.
İstemci kimliğinizi ve istemci gizli anahtarınızı Cloud Console'daki İstemciler sayfasından da görüntüleyebilirsiniz:
- Müşteriler sayfasına gidin.
- Müşterinizin adını veya düzenle (create) simgesini tıklayın. İstemci kimliğiniz ve gizli anahtarınız sayfanın üst kısmında yer alır.
Yönlendirme URI'si ayarlama
Cloud Console'da ayarladığınız yönlendirme URI'si, Google'ın kimlik doğrulama isteklerinize yanıtları nereye göndereceğini belirler.
Belirli bir OAuth 2.0 kimlik bilgisi için yönlendirme URI'leri oluşturmak, görüntülemek veya düzenlemek için aşağıdakileri yapın:
- Müşteriler sayfasına gidin.
- Müşteriyi tıklayın.
- Yönlendirme URI'lerini görüntüleyin veya düzenleyin.
İstemciler sayfasında listelenen bir istemci yoksa projenizin OAuth kimlik bilgileri yoktur. Oluşturmak için Müşteri oluştur'u tıklayın.
Kullanıcı rızası ekranını özelleştirme
Kullanıcılarınız için OAuth 2.0 kimlik doğrulama deneyimi, kullanıcının paylaştığı bilgileri ve geçerli şartları açıklayan bir kullanıcı rızası ekranı içerir. Örneğin, kullanıcı giriş yaptığında uygulamanıza e-posta adresine ve temel hesap bilgilerine erişim izni vermesi istenebilir. Bu bilgilere erişim isteğinde bulunmak için uygulamanızın kimlik doğrulama isteğine eklediği scope parametresini kullanırsınız. Diğer Google API'lerine erişim isteğinde bulunmak için de kapsamları kullanabilirsiniz.
Kullanıcı rızası ekranında ayrıca ürün adınız, logonuz ve ana sayfa URL'niz gibi marka bilgileri de gösterilir. Marka bilgilerini Cloud Console'da kontrol edersiniz.
Projenizin kullanıcı rızası ekranını etkinleştirmek için:
- Google Cloud Console'da Markalama sayfasını açın.
- İstenirse bir proje seçin veya yeni bir proje oluşturun.
- Formu doldurup Kaydet'i tıklayın.
Aşağıdaki izin iletişim kutusunda, istekte OAuth 2.0 ve Google Drive kapsamlarının bir kombinasyonu bulunduğunda kullanıcının ne göreceği gösterilmektedir. (Bu genel iletişim kutusu, Google OAuth 2.0 Playground kullanılarak oluşturulduğundan Cloud Console'da ayarlanacak marka bilgilerini içermez.)
Hizmete erişme
Google ve üçüncü taraflar, kullanıcıların kimliğini doğrulama ve Google API'lerine erişim sağlama ile ilgili uygulama ayrıntılarının çoğunu halletmek için kullanabileceğiniz kitaplıklar sağlar. Örnekler arasında, çeşitli platformlarda kullanılabilen Google Kimlik Hizmetleri ve Google istemci kitaplıkları yer alır.
Kitaplık kullanmamayı tercih ederseniz bu belgenin geri kalanındaki talimatları uygulayın. Bu talimatlarda, mevcut kitaplıkların temelini oluşturan HTTP istek akışları açıklanmaktadır.
Kullanıcının kimliğini doğrulama
Kullanıcının kimliğini doğrulamak için bir kimlik jetonu alınması ve doğrulanması gerekir. Kimlik jetonları, internette kimlik onaylarını paylaşmak için tasarlanmış standart bir OpenID Connect özelliğidir.
Kullanıcıların kimliğini doğrulamak ve kimlik jetonu almak için en çok tercih edilen yaklaşımlar "sunucu" akışı ve "dolaylı" akış olarak adlandırılır. Sunucu akışı, bir uygulamanın arka uç sunucusunun, tarayıcı veya mobil cihaz kullanan kişinin kimliğini doğrulamasını sağlar. Dolaylı akış, istemci tarafı uygulamasının (genellikle tarayıcıda çalışan bir JavaScript uygulaması) arka uç sunucusunu kullanmak yerine API'lere doğrudan erişmesi gerektiğinde kullanılır.
Bu belgede, kullanıcının kimliğini doğrulamak için sunucu akışının nasıl gerçekleştirileceği açıklanmaktadır. Dolaylı akış, istemci tarafında jetonların işlenmesi ve kullanılmasıyla ilgili güvenlik riskleri nedeniyle çok daha karmaşıktır. Dolaylı akış uygulamanız gerekiyorsa Google Kimlik Hizmetleri'ni kullanmanızı önemle tavsiye ederiz.
Sunucu akışı
Uygulamanızın bu protokolleri kullanabilmesi ve kullanıcılarınızın kimliğini doğrulayabilmesi için uygulamanızı Cloud Console'da ayarladığınızdan emin olun. Bir kullanıcı Google ile oturum açmaya çalıştığında şunları yapmanız gerekir:
- Sahteciliğe karşı durum jetonu oluşturma
- Google'a kimlik doğrulama isteği gönderme
- Sahteciliğe karşı durum jetonunu onaylama
- Erişim jetonu ve kimlik jetonu için
codeile değişim yapın - Kimlik jetonundan kullanıcı bilgilerini alma
- Kullanıcının kimliğini doğrulama
1. Sahteciliğe karşı durum jetonu oluşturma
İstek sahteciliği saldırılarını önleyerek kullanıcılarınızın güvenliğini sağlamanız gerekir. İlk adım, uygulamanız ile kullanıcının istemcisi arasında durumu tutan benzersiz bir oturum jetonu oluşturmaktır. Daha sonra, isteği kötü amaçlı bir saldırganın değil, kullanıcının gönderdiğini doğrulamak için bu benzersiz oturum jetonunu Google OAuth Giriş hizmeti tarafından döndürülen kimlik doğrulama yanıtıyla eşleştirirsiniz. Bu jetonlar genellikle siteler arası istek sahteciliği (CSRF) jetonları olarak adlandırılır.
Durum jetonu için iyi bir seçenek, yüksek kaliteli bir rastgele sayı üreteci kullanılarak oluşturulan yaklaşık 30 karakterlik bir dizedir. Diğeri ise oturum durumu değişkenlerinizden bazılarını arka ucunuzda gizli tutulan bir anahtarla imzalayarak oluşturulan bir karma değerdir.
Aşağıdaki kodda, benzersiz oturum jetonlarının nasıl oluşturulacağı gösterilmektedir.
PHP
Bu örneği kullanmak için PHP için Google API'leri istemci kitaplığını indirmeniz gerekir.
// Create a state token to prevent request forgery. // Store it in the session for later validation. $state = bin2hex(random_bytes(128/8)); $app['session']->set('state', $state); // Set the client ID, token state, and application name in the HTML while // serving it. return $app['twig']->render('index.html', array( 'CLIENT_ID' => CLIENT_ID, 'STATE' => $state, 'APPLICATION_NAME' => APPLICATION_NAME ));
Java
Bu örneği kullanmak için Java için Google API'leri istemci kitaplığı'nı indirmeniz gerekir.
// Create a state token to prevent request forgery. // Store it in the session for later validation. String state = new BigInteger(130, new SecureRandom()).toString(32); request.session().attribute("state", state); // Read index.html into memory, and set the client ID, // token state, and application name in the HTML before serving it. return new Scanner(new File("index.html"), "UTF-8") .useDelimiter("\\A").next() .replaceAll("[{]{2}\\s*CLIENT_ID\\s*[}]{2}", CLIENT_ID) .replaceAll("[{]{2}\\s*STATE\\s*[}]{2}", state) .replaceAll("[{]{2}\\s*APPLICATION_NAME\\s*[}]{2}", APPLICATION_NAME);
Python
Bu örneği kullanmak için Python için Google API'leri istemci kitaplığını indirmeniz gerekir.
# Create a state token to prevent request forgery. # Store it in the session for later validation. state = hashlib.sha256(os.urandom(1024)).hexdigest() session['state'] = state # Set the client ID, token state, and application name in the HTML while # serving it. response = make_response( render_template('index.html', CLIENT_ID=CLIENT_ID, STATE=state, APPLICATION_NAME=APPLICATION_NAME))
2. Google'a kimlik doğrulama isteği gönderme
Sonraki adım, uygun URI parametreleriyle bir HTTPS GET isteği oluşturmaktır.
Bu işlemin tüm adımlarında HTTP yerine HTTPS kullanıldığına dikkat edin. HTTP bağlantıları reddedilir. authorization_endpoint meta veri değerini kullanarak keşif belgesinden temel URI'yi almanız gerekir. Aşağıdaki tartışmada temel URI'nin https://accounts.google.com/o/oauth2/v2/auth olduğu varsayılmaktadır.
Temel bir istek için aşağıdaki parametreleri belirtin:
client_id. Bu değeri Cloud Console'daki İstemciler sayfasından edinebilirsiniz.response_type. Temel yetkilendirme kodu akışı isteğinde bu değercodeolmalıdır. (Daha fazla bilgi içinresponse_typeadresini ziyaret edin.)scope(temel bir istekteopenid emailolmalıdır). (Daha fazla bilgi içinscopeadresini ziyaret edin.)redirect_uri, sunucunuzda Google'dan yanıt alacak HTTP uç noktası olmalıdır. Değer, Cloud Console Kimlik Bilgileri sayfasında 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 istekredirect_uri_mismatchhatasıyla başarısız olur.state, sahteciliğe karşı benzersiz oturum jetonunun değerinin yanı sıra kullanıcı uygulamanıza döndüğünde bağlamı kurtarmak için gereken diğer bilgileri (ör. başlangıç URL'si) içermelidir. (Daha fazla bilgi içinstateadresini ziyaret edin.)nonce, uygulamanız tarafından oluşturulan ve mevcut olduğunda tekrar oynatma korumasını etkinleştiren rastgele bir değerdir.login_hint, kullanıcının e-posta adresi veya kullanıcının Google kimliğine eşdeğer olansubdizesi olabilir.login_hintsağlamazsanız ve kullanıcı oturum açmışsa kullanıcı rızası ekranında, kullanıcının e-posta adresinin uygulamanızla paylaşılması için onay isteği yer alır. (Daha fazla bilgi içinlogin_hintadresini ziyaret edin.)- Google Workspace veya Cloud kuruluşuyla ilişkili belirli bir alanın kullanıcıları için OpenID Connect akışını optimize etmek üzere
hdparametresini kullanın (Daha fazla bilgi içinhdsayfasını inceleyin).
Aşağıda, okunabilirlik için satır sonları ve boşluklar içeren eksiksiz bir OpenID Connect kimlik doğrulama URI'si örneği verilmiştir:
https://accounts.google.com/o/oauth2/v2/auth? response_type=code& client_id=424911365001.apps.googleusercontent.com& scope=openid%20email& redirect_uri=https%3A//developers.google.com/oauthplayground& state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2-login-demo.example.com%2FmyHome& login_hint=jsmith@example.com& nonce=0394852-3190485-2490358& hd=example.com
Uygulamanız kullanıcılar hakkında yeni bilgiler isterse veya daha önce onaylamadıkları hesap erişimi isterse kullanıcıların izin vermesi gerekir.
3. Sahteciliğe karşı durum jetonunu onaylama
Yanıt, istekte belirttiğiniz redirect_uri adresine gönderilir. Tüm yanıtlar sorgu dizesinde döndürülür:
https://developers.google.com/oauthplayground?state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foa2cb.example.com%2FmyHome&code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&scope=openid%20email%20https://www.googleapis.com/auth/userinfo.email
RFC 6749 uyarınca istemciler, tanınmayan yanıt parametrelerini YOKSAYMALIDIR. Sunucuda, Google'dan alınan state değerinin 1. adımda oluşturduğunuz oturum jetonuyla eşleştiğini doğrulamanız gerekir. Bu gidiş dönüş doğrulaması, isteği kötü amaçlı bir komut dosyasının değil, kullanıcının gönderdiğini doğrulamaya yardımcı olur.
Aşağıdaki kodda, 1. adımda oluşturduğunuz oturum jetonlarının nasıl onaylanacağı gösterilmektedir:
PHP
Bu örneği kullanmak için PHP için Google API'leri istemci kitaplığını indirmeniz gerekir.
// Ensure that there is no request forgery going on, and that the user // sending us this connect request is the user that was supposed to. if ($request->get('state') != ($app['session']->get('state'))) { return new Response('Invalid state parameter', 401); }
Java
Bu örneği kullanmak için Java için Google API'leri istemci kitaplığı'nı indirmeniz gerekir.
// Ensure that there is no request forgery going on, and that the user // sending us this connect request is the user that was supposed to. if (!request.queryParams("state").equals( request.session().attribute("state"))) { response.status(401); return GSON.toJson("Invalid state parameter."); }
Python
Bu örneği kullanmak için Python için Google API'leri istemci kitaplığını indirmeniz gerekir.
# Ensure that the request is not a forgery and that the user sending # this connect request is the expected user. if request.args.get('state', '') != session['state']: response = make_response(json.dumps('Invalid state parameter.'), 401) response.headers['Content-Type'] = 'application/json' return response
4. Erişim jetonu ve kimlik jetonu için code ile değiştirme
Yanıt, sunucunuzun bir erişim jetonu ve kimlik jetonu ile değiştirebileceği tek seferlik bir yetkilendirme kodu olan code parametresini içerir. Sunucunuz bu değişimi bir HTTPS POST isteği göndererek yapar. POST isteği, token_endpoint meta veri değerini kullanarak keşif belgesinden almanız gereken jeton uç noktasına gönderilir. Aşağıdaki tartışmada uç noktanın https://oauth2.googleapis.com/token olduğu varsayılmaktadır. İstek, POST gövdesinde aşağıdaki parametreleri içermelidir:
| Alanlar | |
|---|---|
code |
İlk istekten döndürülen yetkilendirme kodu. |
client_id |
OAuth 2.0 kimlik bilgilerini alma bölümünde açıklandığı gibi Cloud Console İstemciler sayfasından aldığınız istemci kimliği. |
client_secret |
Cloud Console İstemciler sayfasından aldığınız istemci gizli anahtarı. OAuth 2.0 kimlik bilgilerini alma bölümünde açıklandığı gibi. |
redirect_uri |
Yönlendirme URI'si ayarlama bölümünde açıklandığı gibi, Cloud Console İstemciler sayfasında belirtilen client_id için yetkilendirilmiş bir yönlendirme URI'si. |
grant_type |
Bu alan,
OAuth 2.0 spesifikasyonunda tanımlandığı şekilde authorization_code değerini içermelidir. |
Gerçek istek aşağıdaki örneğe benzer:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7& client_id=your-client-id& client_secret=your-client-secret& redirect_uri=https%3A//developers.google.com/oauthplayground& grant_type=authorization_code
Bu isteğe verilen başarılı bir yanıt, bir JSON dizisinde aşağıdaki alanları içerir:
| Alanlar | |
|---|---|
access_token |
Google API'ye gönderilebilen bir jeton. |
expires_in |
Erişim jetonunun saniye cinsinden kalan kullanım ömrü. |
id_token |
Kullanıcı hakkında Google tarafından dijital olarak imzalanmış kimlik bilgilerini içeren bir JWT. |
scope |
access_token tarafından verilen erişim kapsamları, boşlukla ayrılmış, büyük/küçük harfe duyarlı dizelerden oluşan bir liste olarak ifade edilir. |
token_type |
Döndürülen jetonun türünü tanımlar. Şu anda bu alan her zaman Bearer değerine sahiptir.
|
refresh_token |
(isteğe bağlı)
Bu alan yalnızca kimlik doğrulama isteğinde |
5. Kimlik jetonundan kullanıcı bilgilerini alma
Kimlik jetonu, JWT'dir (JSON Web Jetonu). Diğer bir deyişle, kriptografik olarak imzalanmış Base64 kodlu bir JSON nesnesidir. Normalde, kullanmadan önce kimlik jetonunu doğrulamanız çok önemlidir. Ancak Google ile doğrudan, aracısız bir HTTPS kanalı üzerinden iletişim kurduğunuz ve Google'da kimliğinizi doğrulamak için istemci gizli anahtarınızı kullandığınız için aldığınız jetonun gerçekten Google'dan geldiğinden ve geçerli olduğundan emin olabilirsiniz. Sunucunuz kimlik jetonunu uygulamanızın diğer bileşenlerine iletiyorsa diğer bileşenlerin jetonu kullanmadan önce doğrulaması son derece önemlidir.
Çoğu API kitaplığı, doğrulamayı base64url ile kodlanmış değerlerin kodunu çözme ve içindeki JSON'u ayrıştırma işlemiyle birleştirdiğinden, kimlik jetonundaki taleplere erişirken jetonu doğrulamanız gerekir.
Kimlik jetonunun yükü
Kimlik jetonu, bir dizi ad/değer çifti içeren bir JSON nesnesidir. Aşağıda, okunabilirliği artırmak için biçimlendirilmiş bir örnek verilmiştir:
{ "iss": "https://accounts.google.com", "azp": "1234987819200.apps.googleusercontent.com", "aud": "1234987819200.apps.googleusercontent.com", "sub": "10769150350006150715113082367", "at_hash": "HK6E_P6Dh8Y93mRNtsDB1Q", "hd": "example.com", "email": "jsmith@example.com", "email_verified": "true", "iat": 1353601026, "exp": 1353604926, "nonce": "0394852-3190485-2490358" }
Google kimlik jetonları aşağıdaki alanları (talepler olarak bilinir) içerebilir:
| İddia | Sağlandı | Açıklama |
|---|---|---|
aud |
her zaman | Bu kimlik jetonunun hedeflediği kitle. Uygulamanızın OAuth 2.0 istemci kimliklerinden biri olmalıdır. |
exp |
her zaman | Kimlik jetonunun kabul edilmemesi gereken geçerlilik bitiş zamanı. Unix epoch zamanı (tam sayı saniye) olarak gösterilir. |
iat |
her zaman | Kimlik jetonunun verildiği zaman. Unix epoch zamanı (tam sayı saniye) olarak gösterilir. |
iss |
her zaman | Yanıtı veren kuruluşun tanımlayıcısı. Google kimlik jetonları için her zaman https://accounts.google.com veya accounts.google.com. |
sub |
her zaman | Kullanıcı için tüm Google Hesapları arasında benzersiz olan ve hiçbir zaman yeniden kullanılmayan bir tanımlayıcı. Bir Google Hesabı'nın farklı zamanlarda birden fazla e-posta adresi olabilir ancak sub değeri hiçbir zaman değişmez. Uygulamanızda kullanıcının benzersiz tanımlayıcı anahtarı olarak sub kullanın. Maksimum uzunluk, büyük/küçük harfe duyarlı 255 ASCII karakteridir. |
amr |
Bir Google Hesabı'nda oturum açmak için kullanılan kimlik doğrulama yöntemlerini tanımlayan dize JSON dizisi. Varsa aşağıdaki olası [IANA.AMR] değerlerinden birini veya daha fazlasını içerir:
amr talebi kimlik doğrulama isteğine dahil edildiğinde ve ayarlarda etkinleştirildiğinde gösterilir.
|
|
auth_time |
Kullanıcı kimlik doğrulamasının gerçekleştiği zaman. Unix epoch'tan (1 Ocak 1970, 00:00:00 UTC) bu yana geçen saniye sayısını temsil eden bir JSON sayısıdır. auth_time talebi, kimlik doğrulama isteğine dahil edildiğinde ve ayarlarda etkinleştirildiğinde sağlanır.
|
|
at_hash |
Erişim jetonu karması. Erişim jetonunun kimlik jetonuna bağlı olduğunu doğrular. Kimlik jetonu, sunucu akışında access_token değeriyle verilirse bu hak talebi her zaman dahil edilir. Bu talep, siteler arası istek sahteciliği saldırılarına karşı koruma sağlamak için alternatif bir mekanizma olarak kullanılabilir ancak 1. adım ve 3. adımı uygularsanız erişim jetonunu doğrulamanız gerekmez. |
|
azp |
Yetkili sunucunun client_id. Bu hak talebi yalnızca kimlik jetonunu isteyen taraf, kimlik jetonunun hedef kitlesiyle aynı olmadığında gereklidir. Bu durum, Google'da bir web uygulaması ile Android uygulamasının farklı OAuth 2.0 client_id değerine sahip olduğu ancak aynı Google API'leri projesini paylaştığı karma uygulamalarda geçerli olabilir. |
|
email |
Kullanıcının e-posta adresi. Yalnızca isteğinize email kapsamını dahil ettiyseniz sağlanır. Bu talebin değeri bu hesaba özgü olmayabilir ve zaman içinde değişebilir. Bu nedenle, bu değeri kullanıcı kaydınıza bağlanacak birincil tanımlayıcı olarak kullanmamanız gerekir. Google Workspace veya Cloud kuruluşlarının kullanıcılarını tanımlamak için email talebinin alanına da güvenemezsiniz. Bunun yerine hd talebini kullanın.
|
|
email_verified |
Kullanıcının e-posta adresi doğrulandıysa True (Doğru), doğrulanmadıysa False (Yanlış) değerine sahiptir. | |
family_name |
Kullanıcının soyadı veya soyadları. name hak talebi olduğunda sağlanabilir. |
|
given_name |
Kullanıcının adı veya adları. name hak talebi olduğunda sağlanabilir. |
|
hd |
Kullanıcının Google Workspace veya Cloud kuruluşuyla ilişkili alan. Yalnızca kullanıcı bir Google Cloud kuruluşuna aitse sağlanır. Bir kaynağa erişimi yalnızca belirli alanların üyeleriyle kısıtlarken bu talebi kontrol etmeniz gerekir. Bu talebin olmaması, hesabın Google tarafından barındırılan bir alana ait olmadığını gösterir. | |
locale |
Kullanıcının BCP 47 dil etiketiyle temsil edilen yerel ayarı.
name hak talebi olduğunda sağlanabilir. |
|
name |
Kullanıcının görüntülenebilir biçimdeki tam adı. Şu durumlarda sağlanabilir:
|
|
nonce |
Uygulamanız tarafından kimlik doğrulama isteğinde sağlanan nonce değeri.
Bu değeri yalnızca bir kez sunarak tekrar oynatma saldırılarına karşı koruma sağlamanız gerekir. |
|
picture |
Kullanıcının profil resminin URL'si. Şu durumlarda sağlanabilir:
|
|
profile |
Kullanıcının profil sayfasının URL'si. Şu durumlarda sağlanabilir:
|
6. Kullanıcının kimliğini doğrulama
Kimlik jetonundan kullanıcı bilgilerini aldıktan sonra uygulamanızın kullanıcı veritabanını sorgulamanız gerekir. Kullanıcı veritabanınızda zaten mevcutsa ve Google API'leri yanıtı tüm giriş koşullarını karşılıyorsa bu kullanıcı için bir uygulama oturumu başlatmanız gerekir.
Kullanıcı, kullanıcı veritabanınızda yoksa kullanıcıyı yeni kullanıcı kaydolma akışınıza yönlendirmeniz gerekir. Google'dan aldığınız bilgilere göre kullanıcıyı otomatik olarak kaydetmeniz veya en azından kayıt formunuzda gerekli olan alanların çoğunu önceden doldurmanız mümkün olabilir. Kimlik jetonundaki bilgilere ek olarak, kullanıcı profili uç noktalarımızdan daha fazla kullanıcı profili bilgisi alabilirsiniz.
İleri düzey konular
Aşağıdaki bölümlerde Google OAuth 2.0 API daha ayrıntılı olarak açıklanmaktadır. Bu bilgiler, kimlik doğrulama ve yetkilendirme ile ilgili ileri düzey gereksinimleri olan geliştiricilere yöneliktir.
Diğer Google API'lerine erişim
Kimlik doğrulama için OAuth 2.0 kullanmanın avantajlarından biri, uygulamanızın kullanıcı adına diğer Google API'lerini (YouTube, Google Drive, Takvim veya Kişiler gibi) kullanma iznini, kullanıcının kimliğini doğruladığınız sırada alabilmesidir. Bunun için Google'a gönderdiğiniz kimlik doğrulama isteğine ihtiyacınız olan diğer kapsamları ekleyin. Örneğin, kullanıcının yaş grubunu kimlik doğrulama isteğinize eklemek için openid email https://www.googleapis.com/auth/profile.agerange.read kapsam parametresini iletin. Kullanıcı, kullanıcı rızası ekranında uygun şekilde bilgilendirilir. Google'dan aldığınız erişim jetonu, uygulamanızın istediğiniz ve size verilen erişim kapsamlarıyla ilgili tüm API'lere erişmesine olanak tanır.
Yenileme jetonları
API erişimi isteğinizde, code değişimi sırasında bir yenileme jetonunun döndürülmesini isteyebilirsiniz. Yenileme jetonu, kullanıcı uygulamanızda değilken uygulamanızın Google API'lerine sürekli erişmesini sağlar. Yenileme jetonu istemek için kimlik doğrulama isteğinizde access_type parametresini offline olarak ayarlayın.
Dikkat etmeniz gereken noktalar:
- Yenileme jetonunu güvenli ve kalıcı bir şekilde sakladığınızdan emin olun. Yenileme jetonunu yalnızca kod değişimi akışını ilk kez gerçekleştirdiğinizde alabilirsiniz.
- Verilen yenileme jetonlarının sayısıyla ilgili sınırlar vardır: İstemci/kullanıcı kombinasyonu başına bir sınır ve tüm istemcilerde kullanıcı başına başka bir sınır. Uygulamanız çok fazla yenileme jetonu isterse bu sınırlara takılabilir. Bu durumda eski yenileme jetonları çalışmayı durdurur.
Daha fazla bilgi için Erişim jetonunu yenileme (çevrimdışı erişim) başlıklı makaleyi inceleyin.
Yeniden izin isteme
Kimlik doğrulama isteğinizde prompt parametresini consent olarak ayarlayarak kullanıcıdan uygulamanızı yeniden yetkilendirmesini isteyebilirsiniz. prompt=consent dahil edildiğinde, tüm kapsamlar daha önce Google API'leri projenize verilmiş olsa bile uygulamanız erişim kapsamları için yetkilendirme istediğinde kullanıcı rızası ekranı gösterilir. Bu nedenle, prompt=consent öğesini yalnızca gerektiğinde ekleyin.
prompt parametresi hakkında daha fazla bilgi için Kimlik doğrulama URI parametreleri tablosundaki prompt bölümüne bakın.
Kimlik doğrulama URI'si parametreleri
Aşağıdaki tabloda, Google'ın OAuth 2.0 kimlik doğrulama API'si tarafından kabul edilen parametrelerin daha ayrıntılı açıklamaları verilmiştir.
| Parametre | Zorunlu | Açıklama | ||||||
|---|---|---|---|---|---|---|---|---|
client_id |
(Gerekli) | OAuth 2.0 kimlik bilgilerini alma bölümünde açıklandığı gibi Cloud Console İstemciler sayfasından aldığınız istemci kimliği dizesi. | ||||||
nonce |
(Gerekli) | Uygulamanız tarafından oluşturulan ve yeniden oynatma korumasını etkinleştiren rastgele bir değer. | ||||||
response_type |
(Gerekli) | Değer code ise temel yetkilendirme kodu akışı başlatılır. Bu akışta, jetonları almak için jeton uç noktasına POST gönderilmesi gerekir. Değer token id_token veya id_token token ise dolaylı akış başlatılır. Bu durumda, URI #fragment tanımlayıcısından jetonları almak için yönlendirme URI'sinde JavaScript kullanılması gerekir. |
||||||
redirect_uri |
(Gerekli) | Yanıtın nereye gönderileceğini belirler. Bu parametrenin değeri, Cloud Console İstemciler sayfasında ayarladığınız yetkili yönlendirme değerlerinden biriyle tam olarak eşleşmelidir (HTTP veya HTTPS şeması, büyük/küçük harf ve varsa sondaki "/" dahil). | ||||||
scope |
(Gerekli) | Kapsam parametresi
OpenID'ye özgü bu kapsamlara ek olarak kapsam bağımsız değişkeniniz başka kapsam değerleri de içerebilir. Tüm kapsam değerleri boşlukla ayrılmalıdır. Örneğin, bir kullanıcının Google Drive'ına dosya bazında erişmek istiyorsanız kapsam parametreniz Kullanılabilir kapsamlar hakkında bilgi edinmek için Google API'leri için OAuth 2.0 Kapsamları başlıklı makaleyi veya kullanmak istediğiniz Google API'sinin dokümanlarını inceleyin. |
||||||
state |
(İsteğe bağlıdır ancak kesinlikle önerilir) | Protokolde gidiş dönüş yapan opak bir dize. Yani, Temel akışta URI parametresi olarak, Dolaylı akışta ise URI
|
||||||
access_type |
(İsteğe bağlı) | İzin verilen değerler offline ve online'dir. Etki, Çevrimdışı Erişim bölümünde açıklanmıştır. Erişim jetonu isteniyorsa offline değeri belirtilmediği sürece istemci yenileme jetonu almaz. |
||||||
claims |
(İsteğe bağlı) |
claims parametresi, userinfo uç noktasına veya kimlik doğrulama isteği kimlik jetonu yanıt türlerine dahil edilecek bir veya daha fazla isteğe bağlı alanı belirtmek için kullanılır. Değer, yanıt türünü ve istenen talepleri içeren bir JSON nesnesidir. Aşağıdaki hak talebi istekleri Google sunucuları tarafından kabul edilir:
|
||||||
display |
(İsteğe bağlı) | Yetkilendirme sunucusunun, kimlik doğrulama ve izin kullanıcı arayüzü sayfalarını nasıl görüntüleyeceğini belirten bir ASCII dize değeri. Aşağıdaki değerler belirtilir ve Google sunucuları tarafından kabul edilir ancak protokol akış davranışı üzerinde herhangi bir etkisi yoktur: page, popup, touch ve wap. |
||||||
hd |
(İsteğe bağlı) | Google Cloud kuruluşuna ait hesapların giriş sürecini kolaylaştırın. Google Cloud kuruluş alanını (ör. mycollege.edu) ekleyerek hesap seçimi kullanıcı arayüzünün söz konusu alandaki hesaplar için optimize edilmesi gerektiğini belirtebilirsiniz. Yalnızca bir Google Cloud kuruluş alanı yerine genel olarak Google Cloud kuruluş hesapları için optimizasyon yapmak istiyorsanız yıldız işareti ( İstemci tarafı istekleri değiştirilebileceğinden, uygulamanıza kimlerin erişebileceğini kontrol etmek için bu kullanıcı arayüzü optimizasyonuna güvenmeyin. Döndürülen kimlik jetonunun beklediğiniz değerle (ör. mycolledge.edu) eşleşen bir |
||||||
include_granted_scopes |
(İsteğe bağlı) | Bu parametre true değeriyle sağlanırsa ve yetkilendirme isteği kabul edilirse yetkilendirme, diğer kapsamlar için bu kullanıcı/uygulama kombinasyonuna verilen önceki yetkilendirmeleri içerir.
Artımlı yetkilendirme bölümüne bakın.
Yüklü uygulama akışıyla artımlı yetkilendirme yapamayacağınızı unutmayın. |
||||||
login_hint |
(İsteğe bağlı) | Uygulamanız, kimliğini doğrulamaya çalıştığı kullanıcıyı bildiğinde bu parametreyi kimlik doğrulama sunucusuna ipucu olarak sağlayabilir. Bu ipucunun iletilmesi, hesap seçiciyi gizler ve oturum açma formundaki e-posta kutusunu önceden doldurur veya uygun oturumu seçer (kullanıcı çoklu oturum açma özelliğini kullanıyorsa). Bu sayede, uygulamanızın yanlış kullanıcı hesabına giriş yapması durumunda ortaya çıkabilecek sorunları önleyebilirsiniz.
Değer, bir e-posta adresi veya kullanıcının Google kimliğine eşdeğer olan sub dizesi olabilir. |
||||||
prompt |
(İsteğe bağlı) | Yetkilendirme sunucusunun kullanıcıdan yeniden kimlik doğrulama ve izin isteyip istemediğini belirten, boşlukla ayrılmış dize değerleri listesi. Olası değerler şunlardır:
Herhangi bir değer belirtilmezse ve kullanıcı daha önce erişim yetkisi vermediyse kullanıcıya bir kullanıcı rızası ekranı gösterilir. |
||||||
hl |
(İsteğe bağlı) | Oturum açma, hesap seçici ve kullanıcı rızası ekranlarının görüntüleme dilini belirtmek için kullanılan BCP 47 dil etiketi. Bu parametre sağlanmazsa dil, varsayılan olarak kullanıcının Google Hesabı veya tarayıcı ayarlarına göre belirlenir. Örneğin, kullanıcı arayüzünü İngiliz İngilizcesi olarak istemek için parametreyi en-GB olarak ayarlayın.
|
||||||
Kimlik jetonunu doğrulama
Doğrudan Google'dan geldiğini bildikleriniz hariç, sunucunuzdaki tüm kimlik jetonlarını doğrulamanız gerekir. Örneğin, sunucunuzun istemci uygulamalarınızdan aldığı tüm kimlik jetonlarının gerçek olduğunu doğrulaması gerekir.
Aşağıda, sunucunuza kimlik jetonları gönderebileceğiniz yaygın durumlar verilmiştir:
- Kimlik doğrulama gerektiren isteklerle birlikte kimlik jetonları gönderme Kimlik jetonları, isteği gönderen kullanıcıyı ve kimlik jetonunun hangi istemci için verildiğini belirtir.
Kimlik jetonları hassas bilgilerdir ve ele geçirilmeleri durumunda kötüye kullanılabilir. Bu jetonların yalnızca HTTPS üzerinden ve yalnızca POST verileri kullanılarak veya istek başlıkları içinde iletilerek güvenli bir şekilde işlendiğinden emin olmanız gerekir. Kimlik jetonlarını sunucunuzda saklıyorsanız bunları güvenli bir şekilde saklamanız da gerekir.
Kimlik jetonlarını kullanışlı kılan özelliklerden biri, bunları uygulamanızın farklı bileşenleri arasında aktarabilmenizdir. Bu bileşenler, uygulamayı ve kullanıcıyı doğrulayan hafif bir kimlik doğrulama mekanizması olarak kimlik jetonunu kullanabilir. Ancak kimlik jetonundaki bilgileri kullanabilmeniz veya kullanıcının kimliğinin doğrulandığına dair bir onay olarak bu bilgilere güvenebilmeniz için önce kimlik jetonunu doğrulamanız gerekir.
Kimlik jetonunun doğrulanması için birkaç adım gerekir:
- Kimlik jetonunun, veren kuruluş tarafından doğru şekilde imzalandığını doğrulayın. Google tarafından verilen jetonlar, keşif belgesinin
jwks_urimeta veri değerinde belirtilen URI'da bulunan sertifikalardan biri kullanılarak imzalanır. - Kimlik jetonundaki
isstalebinin değerininhttps://accounts.google.comveyaaccounts.google.comdeğerine eşit olduğunu doğrulayın. - Kimlik jetonundaki
audtalebinin değerinin, uygulamanızın istemci kimliğine eşit olduğunu doğrulayın. - Kimlik jetonunun süre sonunun (
exptalebi) dolmadığını doğrulayın. - İstekte bir hd parametresi değeri belirttiyseniz kimlik jetonunun, bir Google Cloud kuruluşuyla ilişkili kabul edilen bir alan adıyla eşleşen bir
hdtalebi olduğunu doğrulayın.
2 ila 5. adımlar yalnızca dize ve tarih karşılaştırmalarını içerir. Bu karşılaştırmalar oldukça basit olduğundan burada ayrıntılı olarak açıklanmayacaktır.
İlk adım daha karmaşıktır ve kriptografik imza kontrolünü içerir. Hata ayıklama amacıyla, sunucunuzda veya cihazınızda uygulanan yerel işlemeyle karşılaştırmak için Google'ın tokeninfo uç noktasını kullanabilirsiniz. Kimlik jetonunuzun değerinin XYZ123 olduğunu varsayalım. Ardından URI'nin referansını kaldırırsınız
https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123. Jeton imzası geçerliyse yanıt, kodu çözülmüş JSON nesnesi biçimindeki JWT yükü olur.
tokeninfo uç noktası, hata ayıklama için kullanışlıdır ancak üretim amaçları için Google'ın ortak anahtarlarını anahtar uç noktasından alın ve doğrulamayı yerel olarak gerçekleştirin. jwks_uri meta veri değerini kullanarak keşif belgesinden anahtar URI'sini almanız gerekir. Hata ayıklama uç noktasına gönderilen istekler kısıtlanabilir veya aralıklı hatalara tabi olabilir.
Google, ortak anahtarlarını nadiren değiştirdiğinden, HTTP yanıtının önbellek yönergelerini kullanarak bunları önbelleğe alabilir ve çoğu durumda yerel doğrulamayı tokeninfo uç noktasını kullanmaktan çok daha verimli bir şekilde gerçekleştirebilirsiniz. Bu doğrulama için sertifikaların alınıp ayrıştırılması ve imzayı kontrol etmek üzere uygun kriptografik çağrıların yapılması gerekir. Neyse ki bunu gerçekleştirmek için çok çeşitli dillerde iyi hata ayıklanmış kitaplıklar mevcuttur (bkz. jwt.io).
Kullanıcı profili bilgilerini alma
Kullanıcı hakkında daha fazla profil bilgisi edinmek için erişim jetonunu (uygulamanızın kimlik doğrulama akışı sırasında aldığı) ve OpenID Connect standardını kullanabilirsiniz:
OpenID uyumlu olmak için kimlik doğrulama isteğinize
openid profilekapsam değerlerini eklemeniz gerekir.Kullanıcının e-posta adresinin dahil edilmesini istiyorsanız ek bir kapsam değeri olan
emaildeğerini belirtebilirsiniz. Hemprofilehem deemailparametrelerini belirtmek için kimlik doğrulama isteği URI'nize aşağıdaki parametreyi ekleyebilirsiniz:scope=openid%20profile%20email
- Erişim jetonunuzu yetkilendirme başlığına ekleyin ve userinfo uç noktasına HTTPS
GETisteği gönderin. Bu uç noktayı,userinfo_endpointmeta veri değerini kullanarak keşif belgesinden almanız gerekir. userinfo yanıtı,OpenID Connect Standard Claimsve Keşif belgesininclaims_supportedmeta veri değerinde açıklandığı gibi kullanıcıyla ilgili bilgileri içerir. Kullanıcılar veya kuruluşları belirli alanları sağlamayı ya da gizlemeyi seçebilir. Bu nedenle, yetkili erişim kapsamlarınızdaki her alan için bilgi alamayabilirsiniz.
Keşif belgesi
OpenID Connect protokolü, kullanıcıların kimliğini doğrulamak ve jetonlar, kullanıcı bilgileri ve ortak anahtarlar gibi kaynakları istemek için birden fazla uç noktanın kullanılmasını gerektirir.
OpenID Connect, uygulamaları basitleştirmek ve esnekliği artırmak için "keşif belgesi" kullanılmasını sağlar. Bu belge, OpenID Connect sağlayıcısının yapılandırmasıyla ilgili ayrıntıları (yetkilendirme, jeton, iptal, kullanıcı bilgileri ve ortak anahtar uç noktalarının URI'leri dahil) sağlayan anahtar/değer çiftlerini içeren, bilinen bir konumda bulunan bir JSON belgesidir. Google'ın OpenID Connect hizmeti için keşif belgesi şu adresten alınabilir:
https://accounts.google.com/.well-known/openid-configuration
Google'ın OpenID Connect hizmetlerini kullanmak için keşif belgesi URI'sini (https://accounts.google.com/.well-known/openid-configuration) uygulamanıza sabit kodlamanız gerekir.
Uygulamanız dokümanı getirir, yanıttaki önbelleğe alma kurallarını uygular ve ardından gerektiğinde dokümandan uç nokta URI'lerini alır. Örneğin, bir kullanıcının kimliğini doğrulamak için kodunuz, Google'a gönderilen kimlik doğrulama isteklerinin temel URI'si olarak authorization_endpoint meta veri değerini (aşağıdaki örnekte https://accounts.google.com/o/oauth2/v2/auth) alır.
Aşağıda bu tür bir doküman örneği verilmiştir. Alan adları, OpenID Connect Discovery 1.0'da belirtilen adlardır (anlamları için ilgili dokümana bakın). Değerler yalnızca örnek amaçlıdır ve gerçek Google Keşif belgesinin yeni bir sürümünden kopyalanmış olsa da değişebilir:
{ "issuer": "https://accounts.google.com", "authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth", "device_authorization_endpoint": "https://oauth2.googleapis.com/device/code", "token_endpoint": "https://oauth2.googleapis.com/token", "userinfo_endpoint": "https://openidconnect.googleapis.com/v1/userinfo", "revocation_endpoint": "https://oauth2.googleapis.com/revoke", "jwks_uri": "https://www.googleapis.com/oauth2/v3/certs", "response_types_supported": [ "code", "token", "id_token", "code token", "code id_token", "token id_token", "code token id_token", "none" ], "subject_types_supported": [ "public" ], "id_token_signing_alg_values_supported": [ "RS256" ], "scopes_supported": [ "openid", "email", "profile" ], "token_endpoint_auth_methods_supported": [ "client_secret_post", "client_secret_basic" ], "claims_supported": [ "aud", "email", "email_verified", "exp", "family_name", "given_name", "iat", "iss", "locale", "name", "picture", "sub" ], "code_challenge_methods_supported": [ "plain", "S256" ] }
Keşif belgesindeki değerleri önbelleğe alarak HTTP gidiş dönüşünü önleyebilirsiniz. Standart HTTP önbelleğe alma üst bilgileri kullanılır ve bunlara uyulmalıdır.
İstemci kitaplıkları
Aşağıdaki istemci kitaplıkları, popüler çerçevelerle entegre olarak OAuth 2.0'ın uygulanmasını kolaylaştırır:
- Java için Google API'leri istemci kitaplığı
- Python için Google API'leri istemci kitaplığı
- .NET için Google API'leri İstemci Kitaplığı
- Ruby için Google API'leri İstemci Kitaplığı
- PHP için Google API'leri İstemci Kitaplığı
- Google Web Toolkit için OAuth 2.0 Kitaplığı
- Mac OAuth 2.0 Denetleyicileri için Google Araç Kutusu
OpenID Connect uyumluluğu
Google'ın OAuth 2.0 kimlik doğrulama sistemi, OpenID Connect Core spesifikasyonunun gerekli özelliklerini destekler. OpenID Connect ile çalışmak üzere tasarlanmış tüm istemciler bu hizmetle birlikte çalışmalıdır (OpenID Request Object hariç).
