OpenID Connect

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.

To view the client ID and client secret for a given OAuth 2.0 credential, click the following text: Select credential. In the window that opens, choose your project and the credential you want, then click View.

Or, view your client ID and client secret from the Credentials page in API Console:

  1. Go to the Credentials page.
  2. Click the name of your credential or the pencil () icon. Your client ID and secret are at the top of the page.

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.

To create, view, or edit the redirect URIs for a given OAuth 2.0 credential, do the following:

  1. Go to the Credentials page.
  2. In the OAuth 2.0 client IDs section of the page, click a credential.
  3. View or edit the redirect URIs.

If there is no OAuth 2.0 client IDs section on the Credentials page, then your project has no OAuth credentials. To create one, click Create credentials.

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.

Projenizin onay ekranını etkinleştirmek için:

  1. Consent Screen page yılında Google API Console .
  2. If prompted, select a project, or create a new one.
  3. Formu doldurun ve 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 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.)

İzin sayfası ekran görüntüsü

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:

  1. Sahtecilik karşıtı durum jetonu oluşturma
  2. Google'a kimlik doğrulama isteği gönderme
  3. Sahtecilik önleme durum jetonunu onaylama
  4. code'yi erişim jetonu ve kimlik jetonuyla değiştirme
  5. Kimlik jetonundan kullanıcı bilgilerini alma
  6. 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ğinde code olmalıdır. (response_type adresinde daha fazla bilgi edinebilirsiniz.)
  • scope, temel bir istekte openid 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 istek redirect_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 olan sub 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 access_type parametresi offline olarak ayarlanmışsa mevcuttur. Ayrıntılar için Yenileme jetonları başlıklı makaleyi inceleyin.

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:
  • İstek kapsamı "profil" dizesini içeriyordu
  • Kimlik jetonu, jeton yenilemesinden döndürülür.

name hak talepleri mevcut olduğunda bunları kullanarak uygulamanızın kullanıcı kayıtlarını güncelleyebilirsiniz. Bu hak talebinin her zaman mevcut olacağının garanti edilmediğini unutmayın.

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:
  • İstek kapsamı "profil" dizesini içeriyordu
  • Kimlik jetonu, jeton yenilemesinden döndürülür.

picture hak talepleri mevcut olduğunda bunları kullanarak uygulamanızın kullanıcı kayıtlarını güncelleyebilirsiniz. Bu hak talebinin her zaman mevcut olacağının garanti edilmediğini unutmayın.

profile Kullanıcının profil sayfasının URL'si. Şu durumlarda sağlanabilir:
  • İstek kapsamı "profil" dizesini içeriyordu
  • Kimlik jetonu, jeton yenilemesinden döndürülür.

profile hak talepleri mevcut olduğunda bunları kullanarak uygulamanızın kullanıcı kayıtlarını güncelleyebilirsiniz. Bu hak talebinin her zaman mevcut olacağının garanti edilmediğini unutmayın.

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).

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 openid değeriyle başlamalı ve ardından profile değerini, email değerini veya her ikisini de içermelidir.

profile kapsam değeri mevcutsa kimlik jetonu, kullanıcının varsayılan profile hak taleplerini içerebilir (ancak içermesi garanti edilmez).

email kapsam değeri mevcutsa kimlik jetonu email ve email_verified iddialarını içerir.

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 openid profile email https://www.googleapis.com/auth/drive.file olabilir.

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 #fragment tanımlayıcısı olarak döndürülür.

state, istekleri ve yanıtları ilişkilendirmek için yararlı olabilir. redirect_uri değeriniz tahmin edilebileceğinden, state değeri kullanmak gelen bir bağlantının uygulamanız tarafından başlatılan bir kimlik doğrulama isteği sonucunda oluştuğundan emin olmanızı sağlayabilir. Bu state değişkeninde rastgele bir dize oluşturursanız veya bazı istemci durumlarının karmasını (ör. çerez) kodlarsanız isteğin ve yanıtın aynı tarayıcıdan geldiğinden emin olmak için yanıtı doğrulayabilirsiniz. Bu, siteler arası istek sahteciliği gibi saldırılara karşı koruma sağlar.

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 (*) değerini ayarlayın: hd=*.

İ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 hd iddia değerinin, beklediğiniz değerle (ör.mycolledge.edu) eşleştiğini doğruladığınızdan emin olun. İstek parametresinin aksine, kimlik jetonu hd iddiası Google'dan gelen bir güvenlik jetonunda yer alır. Bu nedenle değere güvenilebilir.

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:
  • none

    Yetkilendirme sunucusu herhangi bir kimlik doğrulama veya kullanıcı izni ekranı göstermez. Kullanıcının kimliği doğrulanmamışsa ve istenen kapsamlar için önceden yapılandırılmış izni yoksa hata döndürülür. Mevcut kimlik doğrulamayı ve/veya izni kontrol etmek için none kullanabilirsiniz.

  • consent

    Yetkilendirme sunucusu, bilgileri istemciye döndürmeden önce kullanıcıdan izin ister.

  • select_account

    Yetkilendirme sunucusu, kullanıcıdan bir kullanıcı hesabı seçmesini ister. Bu, yetkilendirme sunucusunda birden fazla hesabı olan bir kullanıcının, mevcut oturumları olabileceği birden fazla hesap arasından seçim yapmasına olanak tanır.

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:

  1. 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.
  2. Kimlik jetonundaki iss iddia değerinin https://accounts.google.com veya accounts.google.com ile aynı olduğundan emin olun.
  3. Kimlik jetonundaki aud iddia değerinin uygulamanızın istemci kimliğiyle aynı olduğundan emin olun.
  4. Kimlik jetonunun geçerlilik süresinin (exp iddiası) geçmediğini doğrulayın.
  5. İ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:

  1. 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. Hem profile hem de email parametresini belirtmek için kimlik doğrulama istek URI'nize aşağıdaki parametreyi ekleyebilirsiniz:

    scope=openid%20profile%20email
  2. 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 belgesinin claims_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:

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ç).