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 kullandığımız, OpenID Connect spesifikasyonuna uygun ve OpenID Sertifikalı OAuth 2.0 uygulamamız açıklanmaktadır. Google API'lerine Erişmek için OAuth 2.0'ı Kullanma başlıklı makalede bulunan dokümanlar 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" ile etiketleyin.
OAuth 2.0'ı ayarlama
Uygulamanızın kullanıcı girişi için Google'ın OAuth 2.0 kimlik doğrulama sistemini kullanabilmesi amacıyla Google API Console OAuth 2.0 kimlik bilgilerini almak, yönlendirme URI'si ayarlamak ve (isteğe bağlı olarak) kullanıcılarınızın kullanıcı rızası ekranında gördüğü marka bilgilerini özelleştirmek için bir proje oluşturmanız gerekir. Hizmet hesabı oluşturmak, faturalandırmayı etkinleştirmek, filtreleme ayarlarını yapmak ve başka görevler yapmak için de API Console 'i kullanabilirsiniz. Daha fazla bilgi için Google API Console Yardım bölümüne bakın.
OAuth 2.0 kimlik bilgileri edinme
Kullanıcıların kimliğini doğrulamak ve Google'ın API'lerine erişmek için istemci kimliği ve istemci gizli anahtarı da 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 sırrını görüntülemek için aşağıdaki metni tıklatın: Kimlik bilgilerini seçin . Açılan pencerede projenizi ve istediğiniz kimlik bilgilerini seçin, ardından Görüntüle'yi tıklayın.
Veya müşteri kimliğinizi ve müşteri sırrınızı API Console Kimlik Bilgileri sayfasından API Console :
- Go to the Credentials page.
- Kimlik bilgilerinizin adını veya kurşun kalem ( create ) simgesini tıklayın. Müşteri kimliğiniz ve sırrınız sayfanın en üstünde.
Yönlendirme URI'si ayarlama
API Console öğesinde belirlediğiniz yönlendirme URI'si, Google'ın kimlik doğrulama isteklerinize yanıtları nereye göndereceğini belirler.
Belirli bir OAuth 2.0 kimlik bilgileri için yönlendirme URI'leri oluşturmak, görüntülemek veya düzenlemek için aşağıdakileri yapın:
- Go to the Credentials page.
- Sayfanın OAuth 2.0 istemci kimlikleri bölümünde bir kimlik bilgilerini tıklatın.
- Yönlendirme URI'lerini görüntüleyin veya düzenleyin.
Kimlik Bilgileri sayfasında OAuth 2.0 istemci kimlikleri bölümü yoksa, projenizde OAuth kimlik bilgileri yoktur. Bir tane oluşturmak için Kimlik bilgileri oluştur'u tıklayın.
Kullanıcı izni ekranını özelleştirme
OAuth 2.0 kimlik doğrulama deneyimi, kullanıcılarınız için kullanıcının paylaştığı bilgileri ve geçerli şartları açıklayan bir izin ekranı içerir. Örneğin, kullanıcı giriş yaptığında uygulamanıza e-posta adresine ve temel hesap bilgilerine erişim izni vermesi istenebilir. Uygulamanızın kimlik doğrulama isteğine eklediği scope
parametresini kullanarak bu bilgilere erişim isteğinde bulunursunuz. Diğer Google API'lerine erişim isteğinde bulunmak için de kapsamları kullanabilirsiniz.
Kullanıcı rızası ekranında ürün adınız, logonuz ve ana sayfa URL'niz gibi marka bilgileri de sunulur. API Console'teki marka bilgilerini siz kontrol edersiniz.
To enable your project's consent screen:
- Open the Consent Screen page in the Google API Console.
- If prompted, select a project, or create a new one.
- Fill out the form and click Save.
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 göreceği içerik gösterilmektedir. (Bu genel iletişim kutusu, Google OAuth 2.0 Playground kullanılarak oluşturulduğundan API Console'de 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 elde etmeyle ilgili uygulama ayrıntılarının çoğunu halletmek için kullanabileceğiniz kitaplıklar sağlar. Google Kimlik Hizmetleri ve çeşitli platformlarda kullanılabilen Google istemci kitaplıkları buna örnek gösterilebilir.
Kitaplık kullanmamayı tercih ederseniz mevcut kitaplıkların temelindeki HTTP istek akışlarını açıklayan bu dokümanın geri kalanındaki talimatları uygulayın.
Kullanıcının kimliğini doğrulama
Kullanıcının kimliğini doğrulamak, bir kimlik jetonu alıp doğrulamayı içerir. Kimlik jetonları, internette kimlik beyanlarının paylaşılmasında kullanılmak üzere tasarlanmış OpenID Connect'in standartlaştırılmış bir özelliğidir.
Kullanıcının kimliğini doğrulamak ve kimlik jetonu almak için en yaygın olarak kullanılan 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ına olanak tanır. İstemci tarafı bir uygulamanın (genellikle tarayıcıda çalışan bir JavaScript uygulaması) arka uç sunucusu üzerinden değil, doğrudan API'lere erişmesi gerektiğinde örtülü akış 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. İstemci tarafında jetonların işlenmesi ve kullanılmasıyla ilgili güvenlik riskleri nedeniyle, örtülü akış önemli ölçüde daha karmaşıktır. Anlamlı olmayan bir akış uygulamanız gerekiyorsa Google Kimlik Hizmetleri'ni kullanmanızı önemle tavsiye ederiz.
Sunucu akışı
Bu protokolleri kullanabilmesi ve kullanıcılarınızın kimliğini doğrulayabilmesi için uygulamanızı API Console olarak ayarlayın. Kullanıcı Google ile giriş yapmaya çalıştığında şunları yapmanız gerekir:
- Sahtecilik karşıtı durum jetonu oluşturma
- Google'a kimlik doğrulama isteği gönderme
- Sahtecilik önleme durum jetonunu onaylama
code
'yi erişim jetonu ve kimlik jetonuyla değiştirme- Kimlik jetonundan kullanıcı bilgilerini alma
- Kullanıcı kimliğini doğrulama
1. Sahtekarlık önleme durum jetonu oluşturma
İstek sahteciliği saldırılarını önleyerek kullanıcılarınızın güvenliğini korumanı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, bu benzersiz oturum jetonunu Google OAuth Giriş hizmeti tarafından döndürülen kimlik doğrulama yanıtıyla eşleştirerek isteği kötü amaçlı bir saldırgan değil, kullanıcının gönderdiğini doğrularsınız. Bu jetonlara genellikle siteler arası istek sahteciliği (CSRF) jetonları denir.
Eyalet jetonu için iyi bir seçenek, yüksek kaliteli bir rastgele sayı üreteci kullanılarak oluşturulan 30 veya daha fazla karakterden oluşan bir dizedir. Diğeri ise oturum durumu değişkenlerinizin bazılarını arka uçta gizli tutulan bir anahtarla imzalayarak oluşturulan karma oluşturma işlemidir.
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 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 sürecin tüm adımlarında HTTP yerine HTTPS'nin kullanıldığını unutmayın. HTTP bağlantıları reddedilir. authorization_endpoint
meta veri değerini kullanarak Discovery 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
, API Console Credentials page adresinden edinebilirsiniz.response_type
, temel bir yetkilendirme kodu akışı isteğindecode
olmalıdır. (response_type
adresinde daha fazla bilgi edinebilirsiniz.)scope
, temel bir istekteopenid email
olmalıdır. (scope
adresinde daha fazla bilgi edinebilirsiniz.)redirect_uri
, Google'dan yanıtı alacak olan sunucunuzdaki HTTP uç noktası olmalıdır. Değer, OAuth 2.0 istemcisi için yetkili yönlendirme URI'lerinden biriyle tam olarak eşleşmelidir. Bu URI'yi API Console Credentials page'te yapılandırdınız. Bu değer yetkili bir URI ile eşleşmezse istekredirect_uri_mismatch
hatasıyla başarısız olur.state
, sahteciliğe karşı benzersiz oturum jetonunun değerinin yanı sıra kullanıcı uygulamanıza geri döndüğünde bağlamı kurtarmak için gereken diğer bilgileri (ör. başlangıç URL'si) içermelidir. (state
adresinde daha fazla bilgi edinebilirsiniz.)nonce
, uygulamanız tarafından oluşturulan ve mevcut olduğunda yeniden 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 olansub
dizesi olabilir.login_hint
sağlamazsanız ve kullanıcı şu anda oturum açmışsa izin ekranında, kullanıcının e-posta adresini uygulamanıza vermek için onay isteği yer alır. (login_hint
adresinden daha fazla bilgi edinebilirsiniz.)- OpenID Connect akışını, Google Workspace veya Cloud kuruluşuyla ilişkili belirli bir alanın kullanıcıları için optimize etmek üzere
hd
parametresini kullanın (hd
adresinde daha fazla bilgi edinin).
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//oauth2.example.com/code& 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 istiyorsa veya daha önce onaylamamış oldukları hesap erişimi istiyorsa kullanıcıların izin vermesi gerekir.
3. Sahtekarlık önleme durum jetonunu onaylama
Yanıt, istek bölümünde belirttiğiniz redirect_uri
adresine gönderilir. Tüm yanıtlar, aşağıda gösterildiği gibi sorgu dizesinde döndürülür:
https://oauth2.example.com/code?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
Sunucuda, Google'dan alınan state
değerinin 1. adımda oluşturduğunuz oturum jetonuyla eşleştiğini onaylamanı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öndermesini sağlar.
Aşağıdaki kodda, 1. adımda oluşturduğunuz oturum jetonlarının onaylanması 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 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. code
yerine erişim jetonu ve kimlik jetonu kullanma
Yanıt, sunucunuzun erişim jetonu ve kimlik jetonuyla takas edebileceği tek seferlik bir yetkilendirme kodu olan code
parametresini içerir. Sunucunuz, HTTPS POST
isteği göndererek bu değişimi yapar. POST
isteği, jeton uç noktasına gönderilir. Bu uç noktasını, token_endpoint
meta veri değerini kullanarak Discovery belgesinden almanız gerekir. Aşağıdaki tartışmada uç noktanın https://oauth2.googleapis.com/token
olduğu varsayılmaktadır. İstek, POST
metninde aşağıdaki parametreleri içermelidir:
Alanlar | |
---|---|
code |
İlk istek üzerinden döndürülen yetkilendirme kodu. |
client_id |
OAuth 2.0 kimlik bilgilerini edinme bölümünde açıklandığı gibi, API Console Credentials pageadresinden aldığınız istemci kimliği. |
client_secret |
OAuth 2.0 kimlik bilgilerini edinme bölümünde açıklandığı gibi, API Console Credentials pageadresinden aldığınız istemci sırrı. |
redirect_uri |
Yönlendirme URI'si ayarlama bölümünde açıklandığı gibi, API Console
Credentials pagebölümünde belirtilen belirli bir client_id için yetkili 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 örnek gibi görünebilir:
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//oauth2.example.com/code& grant_type=authorization_code
Bu isteğe verilen başarılı bir yanıt, JSON dizisinde aşağıdaki alanları içerir:
Alanlar | |
---|---|
access_token |
Google API'ye gönderilebilen bir jeton. |
expires_in |
Erişim jetonunun kalan kullanım ömrü (saniye cinsinden). |
id_token |
Google tarafından dijital olarak imzalanmış, kullanıcıyla ilgili 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ı dizelerin listesi olarak ifade edilir. |
token_type |
Döndürülen jetonun türünü tanımlar. Bu aşamada bu alanın değeri her zaman Bearer olur.
|
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 (JSON Web Jetonu) yani kriptografik olarak imzalanmış Base64 kodlu bir JSON nesnesi. Normalde, kimlik jetonunu kullanmadan önce doğrulamanız gerekir. Ancak aracısız bir HTTPS kanalı üzerinden doğrudan Google ile iletişim kuruyor ve Google'da kimliğinizi doğrulamak için istemci gizli anahtarınızı kullanıyorsunuz. Bu nedenle, 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 kodlamalı değerlerin kodunu çözme ve içindeki JSON'u ayrıştırma işlemiyle birleştirdiğinden, kimlik jetonundaki iddialara erişirken jetonu doğrulamanız gerekir.
Kimlik jetonunun yükü
Kimlik jetonu, bir ad/değer çifti grubu içeren bir JSON nesnesi. Okunabilirlik için biçimlendirilmiş bir örnek:
{ "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ı (iddialar olarak bilinir) içerebilir:
İddia | Sağlandı | Açıklama |
---|---|---|
aud |
her zaman | Bu kimlik jetonunun hedef kitlesi. Uygulamanızın OAuth 2.0 istemci kimliklerinden biri olmalıdır. |
exp |
her zaman | Kimlik jetonunun kabul edilmemesi gereken son kullanma zamanı. Unix zamanında (tam sayı saniye) temsil edilir. |
iat |
her zaman | Kimlik jetonunun verildiği zaman. Unix zamanında (tam sayı saniye) gösterilir. |
iss |
her zaman | Yanıtı veren kuruluşun Issuer Identifier değeri. Google kimliği jetonları için her zaman https://accounts.google.com veya accounts.google.com olmalıdır. |
sub |
her zaman | Kullanıcının, tüm Google Hesapları arasında benzersiz olan ve hiçbir zaman yeniden kullanılmayan bir tanımlayıcısıdır. Bir Google hesabının farklı zamanlarda birden fazla e-posta adresi olabilir ancak sub değeri hiçbir zaman değişmez. Kullanıcının benzersiz tanımlayıcı anahtarı olarak uygulamanızda sub değerini kullanın. Maksimum uzunluk 255 büyük/küçük harf duyarlı ASCII karakterdir. |
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 gönderilirse bu iddia her zaman dahil edilir. Bu iddia, 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 iddia yalnızca kimlik jetonunu isteyen taraf, kimlik jetonunun kitlesiyle aynı olmadığında gereklidir. Bu durum, web uygulaması ve Android uygulamasının farklı OAuth 2.0 client_id 'a sahip olduğu ancak aynı Google API'si projesini paylaştığı karma uygulamalarda Google'da söz konusu olabilir. |
|
email |
Kullanıcının e-posta adresi. Yalnızca isteğinize email kapsamını eklediyseniz sağlanır. Bu iddianın değeri, bu hesaba özgü olmayabilir ve zaman içinde değişebilir. Bu nedenle, kullanıcı kaydınıza bağlamak için birincil tanımlayıcı olarak bu değeri kullanmamalısınız. Ayrıca, Google Workspace veya Cloud kuruluşlarının kullanıcılarını tanımlamak için email hak talebinin alanına güvenemezsiniz. Bunun yerine hd hak talebini kullanın. |
|
email_verified |
Kullanıcının e-posta adresi doğrulandıysa doğru, aksi takdirde yanlış değerini alır. | |
family_name |
Kullanıcının soyadları. name hak talebi varsa sağlanabilir. |
|
given_name |
Kullanıcıya verilen adlar veya adlar. name hak talebi varsa 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 alan adlarının üyelerine kısıtlamak istediğinizde bu hak talebini işaretlemeniz gerekir. Bu iddianın bulunmaması, hesabın Google tarafından barındırılan bir alana ait olmadığını gösterir. | |
locale |
Kullanıcının yerel ayarı. BCP 47 dil etiketiyle temsil edilir.
name hak talebi olduğunda sağlanabilir. |
|
name |
Kullanıcının tam adı, görüntülenebilir biçimde. Şu durumlarda sağlanabilir:
|
|
nonce |
Kimlik doğrulama isteğinde uygulamanız tarafından sağlanan nonce değerini belirtir.
Tekrar oynatma saldırılarına karşı korumanın yalnızca bir kez sunulmasını sağlayarak bu korumayı zorunlu kılmanı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 yanıtı tüm giriş şartlarını karşılıyorsa söz konusu 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ı kaydoluş akışınıza yönlendirmeniz gerekir. Google'dan aldığınız bilgilere göre kullanıcıyı otomatik olarak kaydedebilir veya en azından kayıt formunuzda gerekli olan alanların çoğunu önceden doldurabilirsiniz. Kimlik jetonundaki bilgilere ek olarak, kullanıcı profili uç noktalarımızdan kullanıcı profili bilgileri de alabilirsiniz.
İleri seviye konular
Aşağıdaki bölümlerde Google OAuth 2.0 API daha ayrıntılı olarak açıklanmaktadır. Bu bilgi, kimlik doğrulama ve yetkilendirmeyle ilgili gelişmiş gereksinimleri olan geliştiriciler için hazırlanmıştır.
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ının kimliğini doğrularken aynı anda kullanıcı adına diğer Google API'lerini (ör. YouTube, Google Drive, Takvim veya Kişiler) kullanma izni alabilmesidir. Bunu yapmak için Google'a gönderdiğiniz kimlik doğrulama isteğine ihtiyacınız olan diğer kapsamları ekleyin. Örneğin, kimlik doğrulama isteğinize kullanıcının yaş grubunu eklemek için openid email https://www.googleapis.com/auth/profile.agerange.read
kapsam parametresini gönderin. Kullanıcıdan izin ekranında uygun şekilde izin istenir. Google'dan aldığınız erişim jetonu, istediğiniz ve size verilen erişim kapsamlarıyla ilgili tüm API'lere erişmenize olanak tanır.
Yenileme jetonları
API erişim isteğinizde, code
değişimi sırasında döndürülecek bir yenileme jetonu isteyebilirsiniz. Yenileme jetonu, kullanıcı uygulamanızda değilken uygulamanıza Google API'lerine sürekli erişim 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 yalnızca kod değişimi akışını ilk kez gerçekleştirdiğinizde elde edebileceğiniz için güvenli ve kalıcı bir şekilde sakladığınızdan emin olun.
- Düzenlenen yenileme jetonu sayısıyla ilgili sınırlamalar vardır: istemci/kullanıcı kombinasyonu başına bir sınır ve tüm istemciler genelinde kullanıcı başına bir sınır. Uygulamanız çok fazla yenileme jetonu isterse bu sınırlara ulaşabilir. Bu durumda eski yenileme jetonları çalışmayı durdurur.
Daha fazla bilgi için bkz. Erişim jetonunu yenileme (çevrimdışı erişim).
Yeniden izin isteğinde bulunma
Kimlik doğrulama isteğinizde prompt
parametresini consent
olarak ayarlayarak kullanıcıdan uygulamanızı yeniden yetkilendirmesini isteyebilirsiniz. prompt=consent
dahil edildiğinde, uygulamanız erişim kapsamları için yetkilendirme istediğinde izin ekranı gösterilir. Bu durum, tüm kapsamlar daha önce Google API'leri projenize verilmiş olsa bile geçerlidir. Bu nedenle, prompt=consent
değerini yalnızca gerekli olduğunda 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 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 edinme bölümünde açıklandığı gibi, API Console Credentials pageadresinden 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ın alınması için jeton uç noktasına POST gönderilmesi gerekir. Değer token id_token veya id_token token ise URI #fragment tanımlayıcısından jeton almak için yönlendirme URI'sinde JavaScript kullanılması gereken bir örtük akış başlatır. |
redirect_uri |
(Gerekli) | Yanıtın nereye gönderileceğini belirler. Bu parametrenin değeri, API Console Credentials page içinde ayarladığınız yetkili yönlendirme değerlerinden biriyle tam olarak eşleşmelidir(HTTP veya HTTPS şeması, büyük/küçük harf kullanımı ve varsa sondaki "/" dahil). |
scope |
(Gerekli) | scope parametresi
Kapsam bağımsız değişkeniniz, OpenID'ye özgü bu kapsamlara ek olarak 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şim isterseniz 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 önemle tavsiye edilir) | Protokolde gidip gelen opak bir dizedir. Yani Temel akışında URI parametresi olarak, örtülü akışında ise URI
|
access_type |
(İsteğe bağlı) | İzin verilen değerler offline ve online 'tır. Bu durumun etkisi Ç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. |
display |
(İsteğe bağlı) | Yetkilendirme sunucusunun kimlik doğrulama ve izin kullanıcı arayüzü sayfalarını nasıl görüntülediğini belirten bir ASCII dize değeri. Aşağıdaki değerler belirtilir ve Google sunucuları tarafından kabul edilir ancak 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ı (örneğin, mycollege.edu) ekleyerek hesap seçimi kullanıcı arayüzünün bu alandaki hesaplar için optimize edilmesi gerektiğini belirtebilirsiniz. Yalnızca bir Google Cloud kuruluşu alanı yerine genel olarak Google Cloud kuruluş hesapları için optimizasyon yapmak istiyorsanız yıldız işareti ( İstemci tarafı istekler değiştirilebildiğinden, uygulamanıza kimlerin erişebileceğini kontrol etmek için bu kullanıcı arayüzü optimizasyonundan yararlanmayın. İade edilen kimlik jetonunun |
include_granted_scopes |
(İsteğe bağlı) | Bu parametre true değeriyle sağlanırsa ve yetkilendirme isteği kabul edilirse yetkilendirme, bu kullanıcı/uygulama kombinasyonuna diğer kapsamlar için verilen önceki tüm yetkilendirmeleri içerir. Artımlı yetkilendirme bölümüne bakın.
Yüklü Uygulama akışı ile artımlı yetkilendirme yapamayacağınızı unutmayın. |
login_hint |
(İsteğe bağlı) | Uygulamanız hangi kullanıcının kimliğini doğrulamaya çalıştığını bildiğinde bu parametreyi kimlik doğrulama sunucusuna ipucu olarak sağlayabilir. Bu ipucunu ilettiğinizde hesap seçici devre dışı bırakılır ve oturum açma formundaki e-posta kutusu önceden doldurulur ya da doğru oturum (kullanıcı birden fazla oturum açma özelliğini kullanıyorsa) seçilir. Bu sayede, uygulamanız yanlış kullanıcı hesabına giriş yaptığında 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 istemeyeceğini belirten, boşlukla ayrılmış dize değerleri listesi. Olası değerler:
Herhangi bir değer belirtilmezse ve kullanıcı daha önce erişime yetki vermediyse kullanıcıya izin ekranı gösterilir. |
Kimlik jetonunu doğrulama
Doğrudan Google'dan geldiklerini bilmediğiniz sürece sunucunuzdaki tüm kimlik jetonlarını doğrulamanız gerekir. Örneğin, sunucunuz istemci uygulamalarınızdan aldığı kimlik jetonlarının orijinal olduğunu doğrulamalıdır.
Aşağıda, sunucunuza kimlik jetonları gönderebileceğiniz yaygın durumlar verilmiştir:
- Kimlik doğrulaması yapılması gereken isteklerle kimlik jetonları gönderme. Kimlik jetonları, isteği yapan belirli kullanıcıyı ve kimlik jetonunun hangi istemci için verildiğini belirtir.
Kimlik jetonları hassastır ve aktarımı engellenirse kötüye kullanılabilir. Bu jetonları yalnızca HTTPS üzerinden ve yalnızca POST verileri veya istek üstbilgileri aracılığıyla ileterek güvenli bir şekilde işlediğinizden emin olmalısınız. Kimlik jetonlarını sunucunuzda depoluyorsanız bunları güvenli bir şekilde depolamanız gerekir.
Kimlik jetonlarını yararlı kılan özelliklerden biri, uygulamanızın farklı bileşenlerine iletebilmenizdir. Bu bileşenler, uygulamanın ve kullanıcının kimliğini doğrulayan hafif bir kimlik doğrulama mekanizması olarak kimlik jetonu kullanabilir. Ancak kimlik jetonundaki bilgileri kullanabilmek veya kullanıcının kimliğini doğruladığına dair bir iddia olarak kullanabilmek için bu bilgileri doğrulamanız gerekir.
Kimlik jetonunun doğrulanması için birkaç adım gerekir:
- Kimlik jetonunun, veren tarafından doğru şekilde imzalandığını doğrulayın. Google tarafından verilen jetonlar, Discovery dokümanının
jwks_uri
meta veri değerinde belirtilen URI'de bulunan sertifikalardan biri kullanılarak imzalanır. - Kimlik jetonundaki
iss
iddia değerininhttps://accounts.google.com
veyaaccounts.google.com
ile aynı olduğundan emin olun. - Kimlik jetonundaki
aud
iddia değerinin uygulamanızın istemci kimliğiyle aynı olduğundan emin olun. - Kimlik jetonunun geçerlilik süresinin (
exp
iddiası) geçmediğini doğrulayın. - İstekte bir hd parametresi değeri belirttiyseniz kimlik jetonunda, Google Cloud kuruluşuyla ilişkili kabul edilen bir alanla eşleşen bir
hd
iddiasının bulunduğundan emin olun.
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 ele alınmayacaktı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, kodlanmış JSON nesnesi biçimindeki JWT yükü olur.
tokeninfo
uç noktası hata ayıklama için kullanışlıdır ancak üretim amacıyla anahtarlar uç noktasından Google'ın ortak anahtarlarını alın ve doğrulamayı yerel olarak gerçekleştirin. jwks_uri
meta veri değerini kullanarak anahtar URI'sini Keşif belgesinden almanız gerekir. Hata ayıklama uç noktasına gönderilen istekler sınırlandırılabilir veya aralıklı hatalara maruz kalabilir.
Google, herkese açık anahtarlarını yalnızca nadiren değiştirdiğinden, HTTP yanıtının önbelleğe alma 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şlemi, sertifikaların alınmasını ve ayrıştırılmasını ve imzayı kontrol etmek için uygun kriptografik çağrıların yapılmasını gerektirir. Neyse ki bu işlemi gerçekleştirmek için çeşitli dillerde iyi hata ayıklanmış kitaplıklar mevcuttur (jwt.io adresine bakın).
Kullanıcı profili bilgilerini edinme
Kullanıcıyla ilgili ek profil bilgileri edinmek için erişim jetonunu (kimlik doğrulama akışı sırasında uygulamanızın aldığı) ve OpenID Connect standardını kullanabilirsiniz:
OpenID uyumlu olmak için kimlik doğrulama isteğinize
openid profile
kapsam değerlerini eklemeniz gerekir.Kullanıcının e-posta adresinin dahil edilmesini istiyorsanız
email
değerini ek bir kapsam değeri olarak belirtebilirsiniz. Hemprofile
hem deemail
parametresini belirtmek için kimlik doğrulama istek URI'nize aşağıdaki parametreyi ekleyebilirsiniz:scope=openid%20profile%20email
- Erişim jetonunuzu yetkilendirme başlığına ekleyin ve userinfo uç noktasına bir HTTPS
GET
isteği gönderin. Bu isteği,userinfo_endpoint
meta veri değerini kullanarak Discovery belgesinden almanız gerekir. userinfo yanıtı,OpenID Connect Standard Claims
bölümünde açıklandığı şekilde kullanıcıyla ilgili bilgileri ve Discovery belgesininclaims_supported
meta veri değerini içerir. Kullanıcılar veya kuruluşları belirli alanları sağlamayı veya gizlemeyi seçebilir. Bu nedenle, yetkili erişim kapsamlarınız için her alanla ilgili bilgi alamayabilirsiniz.
Keşif dokümanı
OpenID Connect protokolü, kullanıcıların kimliğini doğrulamak ve jetonlar, kullanıcı bilgileri ve herkese açık anahtarlar gibi kaynakları istemek için birden fazla uç noktanın kullanılmasını gerektirir.
OpenID Connect, uygulamayı basitleştirmek ve esnekliği artırmak için "Keşif belgesi"nin kullanılmasına olanak tanır. Bu, bilinen bir konumda bulunan ve OpenID Connect sağlayıcısının yapılandırması hakkında ayrıntılar (ör. yetkilendirme, jeton, iptal, kullanıcı bilgileri ve herkese açık anahtar uç noktalarının URI'leri) sağlayan anahtar/değer çiftleri içeren bir JSON belgesidir. Google'ın OpenID Connect hizmeti için Discovery 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ıta önbelleğe alma kurallarını uygular ve ardından gerektiğinde 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ın örneği verilmiştir. Alan adları, OpenID Connect Discovery 1.0'da belirtilen alan adlarıdır (anlamları için bu dokümana bakın). Değerler, gerçek Google Discovery dokümanının güncel bir sürümünden kopyalanmış olsa da tamamen örnek niteliğindedir ve 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" ] }
Discovery dokümanındaki değerleri önbelleğe alarak HTTP gidiş dönüşünü önleyebilirsiniz. Standart HTTP önbelleğe alma üst bilgileri kullanılır ve bu üst bilgilere uyulmalıdır.
İstemci kitaplıkları
Aşağıdaki istemci kitaplıkları, popüler çerçevelerle entegre olarak OAuth 2.0'ı uygulamayı basitleştirir:
- Java için Google API'leri istemci kitaplığı
- Python için Google API'ler istemci kitaplığı
- .NET için Google API'leri istemci kitaplığı
- Ruby için Google API'ler istemci kitaplığı
- PHP için Google API'leri istemci kitaplığı
- Google Web Toolkit için OAuth 2.0 Kitaplığı
- Mac için Google Araç Kutusu OAuth 2.0 Denetleyicileri
OpenID Connect uyumluluğu
Google'ın OAuth 2.0 kimlik doğrulama sistemi, OpenID Connect Core spesifikasyonunun zorunlu özelliklerini destekler. OpenID Connect ile çalışmak üzere tasarlanmış tüm istemciler bu hizmetle birlikte çalışmalıdır (OpenID istek nesnesi hariç).