Google, Siyah topluluklar için ırksal eşitliği geliştirmeye kararlıdır. Nasıl olduğunu gör.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

OpenID Connect

Google'ın OpenID Connect uç noktası OpenID Sertifikalıdır.

Google'ın OAuth 2.0 API'leri hem kimlik doğrulama hem de yetkilendirme için kullanılabilir. Bu belge, OpenID Connect spesifikasyonuna uyan ve OpenID Sertifikalı kimlik doğrulama için OAuth 2.0 uygulamamızı açıklamaktadır. Google API'lerine Erişmek İçin OAuth 2.0'ı Kullanma'da bulunan belgeler bu hizmet için de geçerlidir. Bu protokolü etkileşimli olarak keşfetmek istiyorsanız, Google OAuth 2.0 Playground'u öneririz. Stack Overflow ile ilgili yardım almak için sorularınızı "google-oauth" ile etiketleyin.

OAuth 2.0'ı kurma

Uygulamanız, kullanıcı girişi için Google'ın OAuth 2.0 kimlik doğrulama sistemini kullanmadan önce, OAuth 2.0 kimlik bilgilerini almak, bir yönlendirme URI'si ayarlamak ve (isteğe bağlı olarak) kullanıcılarınızın kullanıcı üzerinde gördüğü marka bilgilerini özelleştirmek için Google API Console'de bir proje oluşturmalısınız. izin ekranı. API Console'u bir hizmet hesabı oluşturmak, faturalandırmayı etkinleştirmek, filtrelemeyi ayarlamak ve diğer görevleri yapmak için de kullanabilirsiniz. Daha fazla ayrıntı için Google API Console Yardımına bakın .

OAuth 2.0 kimlik bilgilerini edinin

Kullanıcıların kimliğini doğrulamak ve Google'ın API'larına erişim elde etmek için bir istemci kimliği ve istemci sırrı dahil 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 :

  1. Go to the Credentials page.
  2. Kimlik bilgilerinizin adını veya kurşun kalem ( ) simgesini tıklayın. Müşteri kimliğiniz ve sırrınız sayfanın en üstünde.

Yönlendirme URI'sı ayarlayın

API 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 bilgileri için yönlendirme URI'leri oluşturmak, görüntülemek veya düzenlemek için aşağıdakileri yapın:

  1. Go to the Credentials page.
  2. Sayfanın OAuth 2.0 istemci kimlikleri bölümünde bir kimlik bilgilerini tıklatın.
  3. 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ştirin

Kullanıcılarınız için OAuth 2.0 kimlik doğrulama deneyimi, kullanıcının yayınladığı bilgileri ve geçerli şartları açıklayan bir izin ekranı içerir. Örneğin, kullanıcı oturum açtığında, uygulamanıza e-posta adresine ve temel hesap bilgilerine erişim izni vermesi istenebilir. Uygulamanızın kimlik doğrulama isteğine dahil ettiği scope parametresini kullanarak bu bilgilere erişim talep edersiniz. Diğer Google API'larına erişim istemek için kapsamları da kullanabilirsiniz.

Kullanıcı izni ekranı ayrıca ürün adınız, logonuz ve bir ana sayfa URL'si gibi marka bilgilerini de gösterir. API Console'da marka bilgilerini 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 kutusu, istekte OAuth 2.0 ve Google Drive kapsamlarının bir kombinasyonu bulunduğunda kullanıcının ne göreceğini gösterir. (Bu genel iletişim kutusu Google OAuth 2.0 Playground kullanılarak oluşturulmuştur, bu nedenle API Console'da ayarlanacak marka bilgilerini içermez.)

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

Hizmete erişim

Google ve üçüncü taraflar, kullanıcıların kimliklerini doğrulamaya ve Google API'lerine erişim sağlamaya ilişkin 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 Oturum Açma ve Google istemci kitaplıkları yer alır .

Bir kitaplık kullanmamayı seçerseniz, bu belgenin geri kalanında bulunan ve mevcut kitaplıkların altında yatan HTTP istek akışlarını açıklayan talimatları izleyin.

Kullanıcının kimliğini doğrulama

Kullanıcının kimliğini doğrulamak, bir kimlik belirtecinin alınmasını ve onaylanmasını içerir. Kimlik belirteçleri , İnternette kimlik onaylarını paylaşmada kullanılmak üzere tasarlanmış standart bir OpenID Connect özelliğidir.

Bir kullanıcının kimliğini doğrulamak ve bir kimlik belirteci elde etmek için en yaygın kullanılan yaklaşımlara "sunucu" akışı ve "örtük" akış denir. Sunucu akışı, bir uygulamanın arka uç sunucusunun, bir tarayıcı veya mobil cihaz kullanarak kişinin kimliğini doğrulamasına izin verir. Örtük akış, bir istemci tarafı uygulamasının (tipik olarak tarayıcıda çalışan bir JavaScript uygulaması), arka uç sunucusu yerine API'lere doğrudan erişmesi gerektiğinde kullanılır.

Bu belge, kullanıcının kimliğini doğrulamak için sunucu akışının nasıl gerçekleştirileceğini açıklar. İstemci tarafında belirteçlerin işlenmesi ve kullanılmasındaki güvenlik riskleri nedeniyle örtük akış önemli ölçüde daha karmaşıktır. Örtülü bir akış uygulamanız gerekiyorsa, Google Oturum Açma'yı kullanmanızı önemle tavsiye ederiz.

Sunucu akışı

Uygulamanızı API Console'da bu protokolleri kullanması ve kullanıcılarınızın kimliğini doğrulaması için kurduğunuzdan emin olun. Bir kullanıcı Google ile giriş yapmaya çalıştığında yapmanız gerekenler:

  1. Sahtecilik karşıtı durum belirteci oluşturun
  2. Google'a bir kimlik doğrulama isteği gönderin
  3. Sahtecilik karşıtı durum belirtecini onaylayın
  4. Erişim belirteci ve kimlik belirteci için değişim code
  5. Kimlik belirtecinden kullanıcı bilgilerini alın
  6. Kullanıcının kimliğini doğrulayın

1. Bir sahtecilik karşıtı durum belirteci oluşturun

Sahte talep saldırılarını önleyerek kullanıcılarınızın güvenliğini korumalısınız. İlk adım, uygulamanız ve kullanıcının istemcisi arasındaki durumu tutan benzersiz bir oturum jetonu oluşturmaktır. Daha sonra, kullanıcının istekte bulunduğunu ve kötü niyetli bir saldırgan olmadığını 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 belirteçler genellikle siteler arası istek sahteciliği ( CSRF ) belirteçleri olarak adlandırılır.

Durum belirteci için iyi bir seçim, yüksek kaliteli bir rasgele sayı üreteci kullanılarak oluşturulmuş 30 veya daha fazla karakterden oluşan bir dizedir. Bir diğeri, oturum durumu değişkenlerinizden bazılarını arka ucunuzda gizli tutulan bir anahtarla imzalayarak oluşturulan bir karmadır.

Aşağıdaki kod, benzersiz oturum belirteçleri oluşturmayı gösterir.

PHP

Bu örneği kullanmak için PHP için Google API'leri istemci kitaplığını indirmelisiniz.

// 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 üzere Java için Google API'leri istemci kitaplığını indirmelisiniz.

// 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ı indirmelisiniz.

# 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 bir kimlik doğrulama isteği gönderin

Bir 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ımına dikkat edin; HTTP bağlantıları reddedildi. Sen gelen baz URI'yı almak gerekir Keşif belgesinde kullanarak authorization_endpoint meta veri değeri. 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 Eğer API Console Credentials page adresten temin.
  • response_type temel yetki kodu akış isteğinde olması gereken code . ( response_type adresinde daha fazlasını okuyun.)
  • scope , temel bir istekte açık openid email olmalıdır. ( scope daha fazlasını okuyun.)
  • redirect_uri , sunucunuzdaki Google'dan yanıt alacak HTTP uç noktası olmalıdır. Değer, API Console Credentials page'da yapılandırdığınız OAuth 2.0 istemcisi için yetkili yönlendirme URI'lerinden biriyle tam olarak eşleşmelidir. Bu değer yetkili bir URI ile eşleşmezse, istek bir redirect_uri_mismatch hatasıyla başarısız olur.
  • state sahteciliğe karşı benzersiz oturum belirtecinin değerini ve ayrıca kullanıcı uygulamanıza döndüğünde bağlamı kurtarmak için gereken diğer bilgileri, örneğin başlangıç ​​URL'sini içermelidir. (Devamı için state .)
  • 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 dize olabilir. Bir login_hint ve kullanıcı şu anda oturum login_hint , izin ekranı, kullanıcının e-posta adresini uygulamanıza bırakmak için bir onay isteği içerir. ( login_hint adresinde daha fazlasını okuyun.)
  • Belirli bir G Suite alanındaki kullanıcılar için OpenID Connect akışını optimize etmek için hd parametresini kullanın. (Devamı için hd .)

Aşağıda, satır sonları ve okunabilirlik için 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 kendileriyle ilgili yeni bilgiler isterse veya uygulamanız daha önce onaylamadıkları hesap erişimi isterse, kullanıcıların izin vermesi gerekir.

3. Sahteciliği önleme durum belirtecini onaylayın

Yanıt, istekte belirttiğiniz redirect_uri 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 1. Adımda oluşturduğunuz oturum jetonuyla eşleştiğini doğrulamanız gerekir. Bu gidiş-dönüş doğrulama, istekte kötü niyetli bir komut dosyası değil, kullanıcının yaptığından emin olmaya yardımcı olur.

Aşağıdaki kod, 1. Adımda oluşturduğunuz oturum belirteçlerinin onaylanmasını gösterir:

PHP

Bu örneği kullanmak için PHP için Google API'leri istemci kitaplığını indirmelisiniz.

// 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 üzere Java için Google API'leri istemci kitaplığını indirmelisiniz.

// 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ı indirmelisiniz.

# 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 değişimi

Yanıt, bir code parametresi, sunucunuzun bir erişim jetonu ve kimlik jetonu karşılığında değiştirebileceği tek seferlik bir yetkilendirme kodu 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 Discovery belgesinden almanız gereken belirteç 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 talepten döndürülen yetkilendirme kodu.
client_id OAuth 2.0 kimlik bilgilerini edinme bölümünde açıklandığı gibi API Console Credentials page'dan edindiğiniz istemci kimliği.
client_secret OAuth 2.0 kimlik bilgilerini edinme bölümünde açıklandığı gibi API Console Credentials page'dan edindiğiniz istemci sırrı.
redirect_uri Verilen için yetkili yönlendirme URI client_id açıklandığı gibi, API Console Credentials page belirtilen Set bir yönlendirme URI .
grant_type Bu alan , OAuth 2.0 spesifikasyonunda tanımlandığı gibi bir authorization_code değeri 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 başarılı bir yanıt, bir JSON dizisinde aşağıdaki alanları içerir:

Alanlar
access_token Bir Google API'ye gönderilebilen bir jeton.
expires_in Erişim belirtecinin saniye cinsinden kalan ömrü.
id_token Google tarafından dijital olarak imzalanmış kullanıcı hakkında kimlik bilgilerini içeren bir JWT .
scope access_token tarafından verilen erişim kapsamları, boşlukla sınırlandırılmış, büyük / küçük harfe duyarlı dizelerin bir listesi 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 access_type parametresi kimlik doğrulama isteğinde offline olarak ayarlanmışsa mevcuttur. Ayrıntılar için bkz. Belirteçleri yenileme .

5. Kimlik belirtecinden kullanıcı bilgilerini alın

Bir Kimlik Jetonu bir JWT (JSON Web Jetonu), yani kriptografik olarak imzalanmış Base64 kodlu bir JSON nesnesidir. Normalde, bir kimlik jetonunu kullanmadan önce doğrulamanız çok önemlidir, ancak Google ile aracısız bir HTTPS kanalı üzerinden doğrudan iletişim kurduğunuzdan ve Google'da kimliğinizi doğrulamak için istemci sırrınızı kullandığınızdan, jetonun size ait olduğundan emin olabilirsiniz. almak gerçekten Google'dan gelir ve geçerlidir. Sunucunuz kimlik jetonunu uygulamanızın diğer bileşenlerine iletirse, 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 çalışmasıyla birleştirdiğinden, muhtemelen kimlik belirtecindeki taleplere eriştiğinizde belirteci doğrulamak zorunda kalacaksınız.

Bir kimlik jetonunun yükü

Kimlik simgesi, bir dizi ad / değer çifti içeren bir JSON nesnesidir. 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ı içerebilir ( talep olarak bilinir):

İddia Sağlanan Açıklama
aud her zaman Bu kimlik jetonunun amaçlandığı kitle. Uygulamanızın OAuth 2.0 istemci kimliklerinden biri olmalıdır.
exp her zaman Kimlik jetonunun kabul edilmemesi gereken sona erme süresi. Unix zamanında (tamsayı saniye) temsil edilir.
iat her zaman Kimlik jetonunun verildiği zaman. Unix zamanında (tamsayı saniye) temsil edilir.
iss her zaman Yanıtı Yayınlayan için Yayınlayan Kimliği. Google ID 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 asla tekrar kullanılmayan bir tanımlayıcı. Bir Google hesabının zaman içinde farklı noktalarda birden çok e-posta adresi olabilir, ancak sub değer hiçbir zaman değiştirilmez. Uygulamanızda kullanıcı için benzersiz tanımlayıcı anahtar olarak sub kullanın. 255 büyük / küçük harf duyarlı ASCII karakterlik maksimum uzunluk.
at_hash Erişim belirteci karması. Erişim belirtecinin kimlik belirtecine bağlı olduğunun doğrulanmasını sağlar. Kimlik belirteci sunucu akışında bir access_token belirteci değeri ile access_token , bu talep 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 Adım 1 ve Adım 3'ü izlerseniz, erişim jetonunu doğrulamak gerekli değildir.
azp Yetkili client_id . Bu hak talebi, yalnızca kimlik jetonunu talep eden taraf, kimlik jetonunun hedef kitlesi ile aynı olmadığında gereklidir. Bu, bir web uygulamasının ve Android uygulamasının farklı bir OAuth 2.0 client_id ancak aynı Google API'leri projesini paylaştığı hibrit uygulamalar için Google'da geçerli olabilir.
email Kullanıcının e-posta adresi. Bu değer, bu kullanıcıya özel olmayabilir ve birincil anahtar olarak kullanılmaya uygun değildir. Yalnızca kapsamınız email kapsam değerini içeriyorsa sağlanır.
email_verified Kullanıcının e-posta adresi doğrulanmışsa doğrudur; aksi takdirde yanlış.
family_name Kullanıcının soyadı veya soyadı. Bir name talebi mevcut olduğunda sağlanabilir.
given_name Kullanıcının verdiği ad (lar) veya ad (lar). Bir name talebi mevcut olduğunda sağlanabilir.
hd Kullanıcının barındırılan G Suite alanı. Yalnızca kullanıcı barındırılan bir alana aitse sağlanır.
locale BCP 47 dil etiketiyle temsil edilen kullanıcının yerel ayarı. Bir name talebi mevcut olduğunda sağlanabilir.
name Kullanıcının görüntülenebilir biçimde tam adı. Ş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ı uygulamanızın kullanıcı kayıtlarını güncellemek için kullanabilirsiniz. Bu iddianın mevcut olmasının hiçbir zaman garanti edilmediğini unutmayın.

nonce Kimlik doğrulama isteğinde uygulamanız tarafından sağlanan nonce değeri. Yalnızca bir kez sunulmasını sağlayarak tekrar saldırılarına karşı koruma sağlamalısınız.
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ı uygulamanızın kullanıcı kayıtlarını güncellemek için kullanabilirsiniz. Bu iddianın mevcut olmasının hiçbir zaman 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 talepleri mevcut olduğunda, bunları uygulamanızın kullanıcı kayıtlarını güncellemek için kullanabilirsiniz. Bu iddianın mevcut olmasının hiçbir zaman garanti edilmediğini unutmayın.

6. Kullanıcının kimliğini doğrulayın

Kimlik belirtecinden kullanıcı bilgilerini aldıktan sonra, uygulamanızın kullanıcı veritabanını sorgulamalısınız. Kullanıcı veritabanınızda zaten mevcutsa, tüm giriş gereksinimleri Google API yanıtı tarafından karşılanıyorsa, bu kullanıcı için bir uygulama oturumu başlatmalısınız.

Kullanıcı veritabanınızda yoksa, kullanıcıyı yeni kullanıcı kayıt akışınıza yönlendirmelisiniz. Google'dan aldığınız bilgilere göre kullanıcıyı otomatik olarak kaydettirebilirsiniz veya en azından kayıt formunuzda gerekli olan birçok alanı önceden doldurabilirsiniz. Kimlik belirtecindeki bilgilere ek olarak, kullanıcı profili uç noktalarımızda ek kullanıcı profili bilgileri alabilirsiniz.

İleri düzey konular

Aşağıdaki bölümler Google OAuth 2.0 API'yi daha ayrıntılı olarak açıklamaktadır. Bu bilgiler, kimlik doğrulama ve yetkilendirmeyle ilgili gelişmiş gereksinimleri olan geliştiriciler için tasarlanmış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, siz kullanıcının kimliğini doğruladığınız sırada kullanıcı adına (YouTube, Google Drive, Takvim veya Kişiler gibi) diğer Google API'larını 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 iletin. Kullanıcıya, onay ekranında uygun şekilde sorulur. Google'dan geri aldığınız erişim jetonu, talep ettiğiniz ve size verilen erişim kapsamlarıyla ilgili tüm API'lara erişmenize olanak tanır.

Jetonları yenile

API erişimi talebinizde, code değişimi sırasında iade edilecek bir yenileme belirteci isteyebilirsiniz. Yenileme jetonu, kullanıcı uygulamanızda bulunmadığında uygulamanızın Google API'lerine sürekli erişimini sağlar. Yenileme belirteci istemek için, kimlik doğrulama isteğinizde access_type parametresini offline olarak ayarlayın.

Hususlar:

  • Yenileme belirtecini güvenli ve kalıcı bir şekilde sakladığınızdan emin olun, çünkü yalnızca kod değişim akışını ilk kez gerçekleştirdiğinizde yenileme belirteci alabilirsiniz.
  • Verilen yenileme belirteçlerinin sayısında sınırlar vardır: istemci / 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 ulaşabilir ve bu durumda eski yenileme jetonları çalışmayı durdurur.

Daha fazla bilgi için bkz. Erişim belirtecini yenileme (çevrimdışı erişim) .

Sen ayarlayarak uygulamayı yeniden yetkilendirmek için kullanıcıyı uyararak prompt parametreyi consent için de doğrulama isteği . prompt=consent dahil edildiğinde, tüm kapsamlar daha önce Google API projenize verilmiş olsa bile, uygulamanız her erişim kapsamları için yetki istediğinde izin ekranı görüntülenir. Bu nedenle, yalnızca gerektiğinde prompt=consent ekleyin.

Bilgi prompt parametresi hakkında daha fazla bilgi için, Kimlik Doğrulama URI parametreleri tablosundaki prompt bakın.

Kimlik doğrulama URI parametreleri

Aşağıdaki tablo, Google'ın OAuth 2.0 kimlik doğrulama API'si tarafından kabul edilen parametrelerin daha eksiksiz açıklamalarını verir.

Parametre gereklidir Açıklama
client_id (Gereklidir) OAuth 2.0 kimlik bilgilerini edinme bölümünde açıklandığı gibi, API Console Credentials page'dan edindiğiniz istemci kimliği dizesi.
nonce (Gereklidir) Uygulamanız tarafından oluşturulan ve tekrar korumasını etkinleştiren rastgele bir değer.
response_type (Gereklidir) Değer code , jetonları almak için jeton uç noktasına bir POST gerektiren bir Temel yetkilendirme kodu akışı başlatır. Değer token id_token veya id_token token ise, URI #fragment tanımlayıcısından jetonları almak için yeniden yönlendirme #fragment JavaScript kullanımını gerektiren bir Örtük akış başlatır.
redirect_uri (Gereklidir) Yanıtın nereye gönderileceğini belirler. Bu parametrenin değeri, API Console Credentials page'da ayarladığınız yetkili yönlendirme değerlerinden biriyle tam olarak eşleşmelidir (varsa HTTP veya HTTPS şeması, büyük / küçük harf ve sondaki '/' dahil).
scope (Gereklidir)

Kapsam parametresi, openid değeriyle başlamalı ve ardından profile değerini, email değerini veya her ikisini birden içermelidir.

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

E email kapsam değeri mevcutsa, kimlik jetonu, email ve email_verified hak taleplerini içerir.

Bu OpenID'ye özgü kapsamlara ek olarak, kapsam bağımsız değişkeniniz başka kapsam değerlerini 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 başına erişim istiyorsanız, kapsam parametreniz openid profile email https://www.googleapis.com/auth/drive.file .

Kullanılabilir kapsamlar hakkında bilgi için, Google API'leri için OAuth 2.0 Kapsamlarına veya kullanmak istediğiniz Google API belgelerine bakın.

state (İsteğe bağlı, ancak şiddetle tavsiye edilir)

Protokolde geri dönen opak bir dize; başka bir deyişle, Temel akışta bir URI parametresi olarak ve Örtük akışta URI #fragment tanımlayıcısında #fragment .

state istekleri ve yanıtları ilişkilendirmek için yararlı olabilir. redirect_uri tahmin edilebildiğinden, bir state değeri kullanmak, gelen bir bağlantının uygulamanız tarafından başlatılan bir kimlik doğrulama isteğinin sonucu olduğuna dair güvencenizi artırabilir. Bu state değişkeninde rastgele bir dize oluşturursanız veya bazı istemci durumlarının karmasını (örneğin bir çerez) kodlarsanız, istek ve yanıtın aynı tarayıcıdan kaynaklandığından 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 . Etkisi, Çevrimdışı Erişim'de belgelenmiştir; bir erişim belirteci isteniyorsa, istemci bir offline değeri belirtilmedikçe bir yenileme belirteci 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 belirtmek için bir ASCII dize değeri. Aşağıdaki değerler belirtilir ve Google sunucuları tarafından kabul edilir, ancak davranışları üzerinde herhangi bir etkisi yoktur: page , popup , touch ve wap .
hd (İsteğe bağlı)

hd (barındırılan alan) parametresi, G Suite tarafından barındırılan hesaplar için giriş sürecini kolaylaştırır. G Suite kullanıcısının alanını dahil ederek (örneğin, mycollege.edu ), hesap seçimi kullanıcı arayüzünün o alandaki hesaplar için optimize edilmesi gerektiğini belirtebilirsiniz. Genel olarak tek bir alan yerine G Suite hesaplarını optimize etmek için yıldız ( * ) değerini ayarlayın: hd=* .

İstemci tarafı istekler 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 belirtecinin beklediğinizle eşleşen bir hd talep değerine sahip olduğunu doğruladığınızdan emin olun (örn. mycolledge.edu ). İstek parametresinden farklı olarak, ID jetonu hd talebi Google'dan bir güvenlik jetonu içinde 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 verilirse, yetkilendirme, diğer kapsamlar için bu kullanıcı / uygulama kombinasyonuna verilen önceki yetkileri içerecektir; Artımlı yetkilendirmeye bakın.

Yüklü Uygulama akışıyla 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 bir ipucu olarak sağlayabilir. Bu ipucunun iletilmesi, hesap seçiciyi engeller ve oturum açma formundaki e-posta kutusunu önceden doldurur veya uygun oturumu seçer (kullanıcı çoklu oturum açma kullanıyorsa); yanlış kullanıcı hesabıyla oturum açar. Değer, bir e-posta adresi veya kullanıcının Google kimliğine eşdeğer olan sub dize olabilir.
prompt (İsteğe bağlı) Yetkilendirme sunucusunun kullanıcıdan yeniden kimlik doğrulama ve izin isteyip istemediğini belirten, boşlukla sınırlandırılmış bir dize değerleri listesi. Olası değerler şunlardır:
  • none

    Yetkilendirme sunucusu, herhangi bir kimlik doğrulama veya kullanıcı izni ekranları görüntülemez; kullanıcının kimliği henüz doğrulanmamışsa ve istenen kapsamlar için önceden yapılandırılmış izin yoksa bir hata döndürür. Mevcut kimlik doğrulamasını ve / veya iznini kontrol etmek için none kullanamazsınız.

  • consent

    Yetkilendirme sunucusu, istemciye bilgi göndermeden önce kullanıcıdan onay ister.

  • select_account

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

Hiçbir değer belirtilmezse ve kullanıcı daha önce erişime izin vermediyse, kullanıcıya bir izin ekranı gösterilir.

Bir kimlik jetonunu doğrulama

Doğrudan Google'dan geldiklerini bilmiyorsanız, sunucunuzdaki tüm kimlik jetonlarını doğrulamanız gerekir. Örneğin, sunucunuz, istemci uygulamalarınızdan aldığı tüm kimlik jetonlarının gerçek olduğunu doğrulamalıdır.

Sunucunuza kimlik belirteçleri gönderebileceğiniz yaygın durumlar şunlardır:

  • Kimliği doğrulanması gereken isteklerle kimlik belirteçleri gönderme. Kimlik jetonları, istekte bulunan belirli kullanıcıyı ve bu kimlik jetonunun hangi istemciye verildiğini size söyler.

Kimlik simgeleri hassastır ve ele geçirilirse kötüye kullanılabilir. Bu belirteçlerin yalnızca HTTPS üzerinden ve yalnızca POST verileri yoluyla veya istek başlıkları içinde iletilerek güvenli bir şekilde işlendiğinden emin olmalısınız. Kimlik belirteçlerini sunucunuzda saklarsanız, bunları da güvenli bir şekilde saklamanız gerekir.

Kimlik jetonlarını kullanışlı kılan şeylerden biri, bunları uygulamanızın farklı bileşenlerine aktarabilmenizdir. Bu bileşenler, uygulamanın ve kullanıcının kimliğini doğrulayan hafif bir kimlik doğrulama mekanizması olarak bir kimlik belirteci kullanabilir. Eğer belirteç kimliği bilgileri kullanabilirsiniz veya kullanıcı doğrulanmış olması iddiası olarak güvenebilirsiniz Ama hepsinden önce bunu doğrulamak gerekir.

Bir kimlik jetonunun doğrulanması birkaç adım gerektirir:

  1. Kimlik belirtecinin düzenleyici tarafından düzgün şekilde imzalandığını doğrulayın. Google tarafından verilen jetonlar, Keşif belgesinin jwks_uri meta veri değerinde belirtilen jwks_uri bulunan sertifikalardan biri kullanılarak imzalanır.
  2. Kimlik jetonundaki iss talebinin değerinin https://accounts.google.com veya accounts.google.com eşit olduğunu doğrulayın.
  3. Kimlik jetonundaki aud talebinin değerinin uygulamanızın istemci kimliğine eşit olduğunu doğrulayın.
  4. Son kullanma süresi (emin olun exp İD belirtecin talebi) geçmedi.
  5. İstekte bir hd parametre değeri belirttiyseniz kimlik jetonunun, G Suite tarafından barındırılan kabul edilen bir alanla eşleşen bir hd hak talebine sahip olduğunu doğrulayın.

2'den 5'e kadar olan adımlar yalnızca oldukça basit olan dizi ve tarih karşılaştırmalarını içerir, bu nedenle bunları burada detaylandırmayacağız.

İ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 tokeninfo karşılaştırmak için Google'ın tokeninfo uç noktasını kullanabilirsiniz. Kimlik jetonunuzun değerinin XYZ123 olduğunu XYZ123 . O zaman URI'nin referansını https://oauth2.googleapis.com/tokeninfo?id_token= XYZ123 . Belirteç imzası geçerliyse, yanıt, kodu çözülmüş JSON nesne biçimindeki JWT yükü olacaktır.

tokeninfo uç noktası, hata ayıklama için kullanışlıdır, ancak üretim amacıyla Google'ın genel 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 jwks_uri . Hata ayıklama uç noktasına yapılan istekler kısılabilir veya başka şekilde aralıklı hatalara tabi olabilir.

Google genel anahtarlarını nadiren değiştirdiğinden, bunları HTTP yanıtının önbellek yönergelerini kullanarak ö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, sertifikaların alınmasını ve ayrıştırılmasını ve imzayı kontrol etmek için uygun şifreleme çağrılarının yapılmasını gerektirir. Neyse ki, bunu başarmak için çok çeşitli dillerde iyi hata ayıklanmış kitaplıklar mevcuttur (bkz. Jwt.io ).

Kullanıcı profili bilgilerinin alınması

Kullanıcı hakkında ek profil bilgileri almak için, erişim belirtecini (uygulamanızın kimlik doğrulama akışı sırasında aldığı) ve OpenID Connect standardını kullanabilirsiniz:

  1. OpenID uyumlu olmak için, kimlik doğrulama isteğinize openid profile kapsam değerlerini dahil etmeniz gerekir.

    Kullanıcının e-posta adresinin dahil edilmesini istiyorsanız, ek bir email kapsam değeri belirtebilirsiniz. Hem profile hem de email belirtmek için, kimlik doğrulama isteği URI'nize aşağıdaki parametreyi ekleyebilirsiniz:

    scope=openid%20profile%20email
  2. Erişim jetonunuzu yetkilendirme başlığına ekleyin ve userinfo_endpoint meta veri değerini kullanarak Discovery belgesinden almanız gereken userinfo uç noktasına bir HTTPS GET isteği yapın. Kullanıcı bilgisi yanıtı, OpenID Connect Standard Claims bölümünde açıklandığı gibi kullanıcı hakkındaki bilgileri ve Keşif belgesinin claims_supported meta veri değerini içerir. Kullanıcılar veya kuruluşları belirli alanları sağlamayı veya saklamayı seçebilir, bu nedenle yetkili erişim kapsamlarınız için her alan için bilgi alamayabilirsiniz.

Keşif belgesi

OpenID Connect protokolü, kullanıcıların kimliklerini doğrulamak ve belirteçler, kullanıcı bilgileri ve genel anahtarlar dahil olmak üzere kaynakları talep etmek için birden çok uç noktanın kullanımını gerektirir.

Uygulamaları basitleştirmek ve esnekliği artırmak için OpenID Connect, yetkilendirmenin URI'leri de dahil olmak üzere OpenID Connect sağlayıcısının yapılandırması hakkında ayrıntılar sağlayan anahtar / değer çiftlerini içeren iyi bilinen bir konumda bulunan bir JSON belgesi olan "Keşif belgesi" kullanımına izin verir. , belirteç, iptal, kullanıcı bilgisi ve genel anahtar uç noktaları. Google'ın OpenID Connect hizmeti için Keşif belgesi şuradan alınabilir:

https://accounts.google.com/.well-known/openid-configuration

Google'ın OpenID Connect hizmetlerini kullanmak için, Keşif belgesi URI'sını ( https://accounts.google.com/.well-known/openid-configuration ) uygulamanıza sabit kodlamalısınız. Uygulamanız belgeyi getirir, yanıtta önbelleğe alma kurallarını uygular ve ardından gerektiğinde ondan uç nokta URI'larını alır. Örneğin, bir kullanıcının kimliğini doğrulamak için, kodunuz, gönderilen kimlik doğrulama istekleri için temel URI olarak authorization_endpoint meta veri değerini (aşağıdaki örnekte https://accounts.google.com/o/oauth2/v2/auth ) alır Google.

İşte böyle bir belgeye bir örnek; alan adları, OpenID Connect Discovery 1.0'da belirtilenlerdir (anlamları için bu belgeye bakın). Değerler tamamen açıklama amaçlıdır ve gerçek Google Discovery belgesinin son sürümünden kopyalanmış olsalar 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 bir HTTP gidiş dönüşünden kaçınabilirsiniz. Standart HTTP önbelleğe alma üstbilgileri 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:

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ış herhangi bir istemci bu hizmetle birlikte çalışmalıdır ( OpenID İstek Nesnesi dışında ).