OpenID Bağlan

tutucu122 l10n-yer
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 belirtimine uyan ve OpenID Sertifikalı olan kimlik doğrulama için OAuth 2.0 uygulamamızı açıklamaktadır. Google API'lerine Erişmek için OAuth 2.0'ı Kullanma bölümünde bulunan belgeler de bu hizmet için geçerlidir. Bu protokolü etkileşimli olarak keşfetmek istiyorsanız, Google OAuth 2.0 Playground'u öneririz. Stack Overflow hakkında 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 için Google API Console bir proje oluşturmanız, bir yönlendirme URI'si ayarlamanız ve (isteğe bağlı olarak) kullanıcılarınızın ekranda gördüğü marka bilgilerini özelleştirmeniz gerekir. kullanıcı onayı ekranı. API Console 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 ConsoleYardım'a bakın.

OAuth 2.0 kimlik bilgilerini edinin

Kullanıcıların kimliğini doğrulamak ve Google'ın API'lerine erişim elde etmek için bir istemci kimliği ve istemci sırrı dahil olmak üzere OAuth 2.0 kimlik bilgilerine ihtiyacınız vardır.

tutucu127 l10n-yer

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.

Bir yönlendirme URI'sı ayarlayın

API Console 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 serbest bıraktığı bilgileri ve geçerli şartları açıklayan bir izin ekranı içerir. Örneğin, kullanıcı oturum açtığında, uygulamanızın e-posta adresine ve temel hesap bilgilerine erişmesine izin 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'lerine erişim istemek için kapsamları da kullanabilirsiniz.

Kullanıcı izin ekranı ayrıca ürün adınız, logonuz ve ana sayfa URL'niz gibi marka bilgilerini de sunar. API Consolemarka 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 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 Consoleiçinde ayarlanacak marka bilgilerini içermez.)

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

hizmete erişim

Google ve üçüncü taraflar, kullanıcıların kimliğini doğrulamaya ve Google API'lerine erişim elde etmeye ilişkin uygulama ayrıntılarının çoğuyla ilgilenmek için kullanabileceğiniz kitaplıklar sağlar. Örnekler, çeşitli platformlar için kullanılabilen Google Oturum Açma ve Google istemci kitaplıklarını içerir.

Bir kitaplık kullanmamayı seçerseniz, bu belgenin geri kalanında, mevcut kitaplıkların temelindeki HTTP istek akışlarını açıklayan yönergeleri izleyin.

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

Kullanıcının kimliğinin doğrulanması, bir kimlik belirteci almayı ve onu doğrulamayı içerir. Kimlik belirteçleri , Internet'te kimlik iddialarının paylaşılmasında 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 olarak 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 kullanan kişinin kimliğini doğrulamasını sağlar. Örtük akış, bir istemci tarafı uygulamasının (genellikle tarayıcıda çalışan bir JavaScript uygulaması) API'lere arka uç sunucusu yerine 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ük bir akış uygulamanız gerekiyorsa, Google Sign-In'i kullanmanızı şiddetle öneririz.

sunucu akışı

Bu protokolleri kullanmasını ve kullanıcılarınızın kimliğini doğrulamasını sağlamak için uygulamanızı API Consoleayarladığınızdan emin olun. Bir kullanıcı Google ile giriş yapmaya çalıştığında şunları yapmanız gerekir:

  1. Sahteciliğe karşı bir durum belirteci oluşturun
  2. Google'a bir kimlik doğrulama isteği gönderin
  3. Sahteciliğe karşı 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ğrula

1. Sahteciliğe karşı bir durum belirteci oluşturun

İstek sahteciliği saldırılarını engelleyerek 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ında durumu tutan benzersiz bir oturum belirteci 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 belirtecini Google OAuth Giriş hizmeti tarafından döndürülen kimlik doğrulama yanıtıyla eşleştirirsiniz. Bu belirteçlere genellikle siteler arası istek sahteciliği ( CSRF ) belirteçleri denir.

Durum belirteci için iyi bir seçim, yüksek kaliteli bir rastgele sayı üreteci kullanılarak oluşturulmuş 30 kadar karakterden oluşan bir dizedir. Bir diğeri, oturum durumu değişkenlerinizden bazılarını arka uçunuzda 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 için 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);

piton

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

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 kullanımına dikkat edin; HTTP bağlantıları reddedilir. authorization_endpoint meta veri değerini kullanarak Discovery belgesinden temel URI'yi almalısınız. Aşağıdaki tartışma, temel URI'nin https://accounts.google.com/o/oauth2/v2/auth olduğunu varsayar.

Temel bir istek için aşağıdaki parametreleri belirtin:

  • API ConsoleCredentials pageelde ettiğiniz client_id .
  • response_type bir yetkilendirme kodu akışı isteğinde code olması gereken answer_type . ( response_type adresinde daha fazlasını okuyun.)
  • Temel bir istekte openid email olması gereken scope . (Daha fazlasını scope okuyun.)
  • redirect_uri , sunucunuzda Google'dan yanıt alacak HTTP uç noktası olmalıdır. Değer, API ConsoleCredentials pageiçinde 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. ( state adresinde daha fazlasını okuyun.)
  • nonce , uygulamanız tarafından oluşturulan ve mevcut olduğunda yeniden oynatma koruması sağlayan 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 açmışsa, izin ekranı, kullanıcının e-posta adresini uygulamanıza bırakmak için bir onay isteği içerir. (Daha fazlasını login_hint adresinde okuyun.)
  • Belirli bir G Suite alanının kullanıcıları için OpenID Connect akışını optimize etmek için hd parametresini kullanın. (Daha fazlasını hd okuyun.)

Burada 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 kendileri hakkında herhangi bir yeni bilgi isterse veya uygulamanız daha önce onaylamadıkları bir hesaba erişim isterse, kullanıcıların onay vermesi gerekir.

3. Sahteciliğe karşı 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 belirteciyle eşleştiğini onaylamanız gerekir. Bu gidiş-dönüş doğrulama, kötü niyetli bir komut dosyası değil, kullanıcının istekte bulunduğundan emin olmaya yardımcı olur.

Aşağıdaki kod, 1. Adımda oluşturduğunuz oturum belirteçlerinin onaylandığı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 için 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.");
}

piton

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 belirteci ve kimlik belirteci için değişim code

Yanıt, bir code parametresi, sunucunuzun bir erişim belirteci ve kimlik belirteci ile değiş tokuş edebileceği tek seferlik bir yetkilendirme kodu içerir. Sunucunuz bu alışverişi 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ışma, bitiş noktasının https://oauth2.googleapis.com/token olduğunu varsayar. İstek, POST gövdesinde aşağıdaki parametreleri içermelidir:

Alanlar
code İlk istekten döndürülen yetkilendirme kodu.
client_id API ConsoleCredentials pageOAuth 2.0 kimlik bilgilerini elde etme bölümünde açıklandığı gibi elde ettiğiniz istemci kimliği.
client_secret API ConsoleCredentials page'den elde ettiğiniz istemci sırrı, Obtain OAuth 2.0 kimlik bilgilerinin altında açıklandığı gibi.
redirect_uri API ConsoleCredentials pageiçinde belirtilen, verilen client_id için bir yetkili yeniden yönlendirme URI'si, Set a yönlendirme URI'si içinde açıklandığı gibi.
grant_type Bu alan , OAuth 2.0 belirtiminde 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 verilen başarılı bir yanıt, bir JSON dizisinde aşağıdaki alanları içerir:

Alanlar
access_token Bir Google API'sine gönderilebilen bir belirteç.
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 ayrılmış, büyük/küçük harfe duyarlı dizelerin bir listesi olarak ifade edilir.
token_type Döndürülen belirteç 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 Belirteçleri yenileme konusuna bakın.

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

Kimlik Simgesi, bir JWT'dir (JSON Web Simgesi), yani kriptografik olarak imzalanmış Base64 kodlu bir JSON nesnesidir. Normalde, bir kimlik jetonunu kullanmadan önce doğrulamanız çok önemlidir, ancak aracısız bir HTTPS kanalı üzerinden doğrudan Google ile iletişim kurduğunuz ve Google'da kimliğinizi doğrulamak için müşteri sırrınızı kullandığınız için jetonun size ait olduğundan emin olabilirsiniz. alma gerçekten Google'dan gelir ve geçerlidir. Sunucunuz kimlik belirtecini uygulamanızın diğer bileşenlerine geçirirse, kullanmadan önce diğer bileşenlerin belirteci doğrulaması son derece önemlidir.

Çoğu API kitaplığı doğrulamayı base64url kodlu değerlerin kodunu çözme ve içindeki JSON'u ayrıştırma çalışmasıyla birleştirdiğinden, muhtemelen kimlik belirtecindeki taleplere erişirken belirteci yine de doğrulamayı bitireceksiniz.

Bir kimlik belirtecinin yükü

Kimlik belirteci, bir dizi ad/değer çifti içeren bir JSON nesnesidir. İşte 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 Belirteçleri aşağıdaki alanları içerebilir ( talep olarak bilinir):

İddia Tedarik edilen Açıklama
aud Her zaman Bu kimlik belirtecinin amaçlandığı hedef kitle. Uygulamanızın OAuth 2.0 istemci kimliklerinden biri olmalıdır.
exp Her zaman Kimlik belirtecinin kabul edilmemesi gereken veya sonrasında sona erme süresi. Unix zamanında (tamsayı saniye) temsil edilir.
iat Her zaman Kimlik belirtecinin verildiği saat. Unix zamanında (tamsayı saniye) temsil edilir.
iss Her zaman Yanıtı Veren için Veren Kimliği. Google Kimliği belirteçleri 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 yeniden kullanılmayan bir tanımlayıcı. Bir Google hesabının farklı zamanlarda birden fazla e-posta adresi olabilir, ancak sub değer asla değişmez. Kullanıcı için benzersiz tanımlayıcı anahtar olarak uygulamanızda sub kullanın. Maksimum 255 büyük/küçük harfe duyarlı ASCII karakter uzunluğu.
at_hash Erişim belirteci karması. Erişim belirtecinin kimlik belirtecine bağlı olduğunun doğrulamasını sağlar. Kimlik belirteci, sunucu akışında bir access_token değeriyle verilirse, 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 belirtecini doğrulamanız gerekmez.
azp Yetkili sunucunun 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 sahip olduğu ancak aynı Google API projesini paylaştığı karma 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 halde yanlış.
family_name Kullanıcının soyadı/adları veya soyadı/adları. Bir name talebi mevcut olduğunda sağlanabilir.
given_name Kullanıcının verilen 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 etki alanına aitse sağlanır.
locale BCP 47 dil etiketi ile temsil edilen kullanıcının yerel ayarı. Bir name talebi mevcut olduğunda sağlanabilir.
name Kullanıcının tam adı, görüntülenebilir bir biçimde. Şu durumlarda sağlanabilir:
  • İstek kapsamı "profil" dizesini içeriyordu
  • Kimlik belirteci, belirteç yenilemesinden döndürülür

name talepleri mevcut olduğunda, bunları uygulamanızın kullanıcı kayıtlarını güncellemek için kullanabilirsiniz. Bu iddianın hiçbir zaman mevcut olacağının 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 uygulamalısınız.
picture Kullanıcının profil resminin URL'si. Şu durumlarda sağlanabilir:
  • İstek kapsamı "profil" dizesini içeriyordu
  • Kimlik belirteci, belirteç yenilemesinden döndürülür

picture talepleri mevcut olduğunda, bunları uygulamanızın kullanıcı kayıtlarını güncellemek için kullanabilirsiniz. Bu iddianın hiçbir 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 belirteci, belirteç 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 hiçbir zaman mevcut olacağının 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ı sorgulamanız gerekir. Kullanıcı veritabanınızda zaten mevcutsa, tüm oturum açma gereksinimleri Google API yanıtı tarafından karşılanıyorsa, o kullanıcı için bir uygulama oturumu başlatmalısınız.

Kullanıcı, kullanıcı veritabanınızda yoksa, kullanıcıyı yeni kullanıcı kaydı akışınıza yönlendirmelisiniz. Google'dan aldığınız bilgilere dayanarak kullanıcıyı otomatik olarak kaydedebilir 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.

Gelişmiş konular

Aşağıdaki bölümlerde Google OAuth 2.0 API'si daha ayrıntılı olarak açıklanmaktadır. Bu bilgiler, kimlik doğrulama ve yetkilendirme konusunda gelişmiş gereksinimleri olan geliştiricilere yöneliktir.

Diğer Google API'lerine erişim

Kimlik doğrulama için OAuth 2.0 kullanmanın avantajlarından biri, siz kullanıcının kimliğini doğrularken uygulamanızın kullanıcı adına diğer Google API'lerini (YouTube, Google Drive, Takvim veya Kişiler gibi) kullanma izni alabilmesidir. Bunu yapmak için, ihtiyacınız olan diğer kapsamları Google'a gönderdiğiniz kimlik doğrulama isteğine 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ıdan uygun şekilde izin ekranında istenir. Google'dan geri aldığınız erişim jetonu, talep ettiğiniz ve size verilen erişim kapsamlarıyla ilgili tüm API'lere erişmenizi sağlar.

Jetonları yenile

API erişimi talebinizde, code değişimi sırasında bir yenileme belirtecinin döndürülmesini talep edebilirsiniz. Yenileme belirteci, kullanıcı uygulamanızda yokken uygulamanızın Google API'lerine sürekli erişimini sağlar. Yenileme belirteci istemek için, kimlik doğrulama isteğinize access_type parametresini offline olarak ayarlayın.

Hususlar:

  • Yenileme belirtecini güvenli ve kalıcı olarak sakladığınızdan emin olun, çünkü yalnızca kod değişim akışını ilk kez gerçekleştirdiğinizde bir yenileme belirteci alabilirsiniz.
  • Yayınlanan yenileme belirteçlerinin sayısında sınırlamalar vardır: istemci/kullanıcı kombinasyonu başına bir sınır ve tüm istemcilerde kullanıcı başına bir sınır. Uygulamanız çok fazla yenileme belirteci isterse, bu sınırlarla karşılaşabilir ve bu durumda eski yenileme belirteçleri çalışmayı durdurabilir.

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

Kimlik doğrulama isteğinizde bilgi prompt parametresini consent şekilde ayarlayarak kullanıcıdan uygulamanızı yeniden yetkilendirmesini isteyebilirsiniz . prompt=consent eklendiğinde, tüm kapsamlar daha önce Google API'leri projenize verilmiş olsa bile, uygulamanız erişim kapsamlarının yetkilendirilmesini her 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 bilgi prompt bakın.

Kimlik doğrulama URI parametreleri

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

Parametre Gerekli Açıklama
client_id (Gerekli) API ConsoleCredentials pageelde ettiğiniz istemci kimliği dizesi, Obtain OAuth 2.0 kimlik bilgilerinin altında açıklandığı gibi.
nonce (Gerekli) Uygulamanız tarafından oluşturulan ve yeniden oynatma koruması sağlayan rastgele bir değer.
response_type (Gerekli) Değer code ise, belirteçleri almak için belirteç 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 belirteçleri almak için yeniden yönlendirme URI'sinde JavaScript kullanılmasını gerektiren bir Örtülü akış başlatır.
redirect_uri (Gerekli) Yanıtın nereye gönderileceğini belirler. Bu parametrenin değeri, API ConsoleCredentials page ayarladığınız yetkilendirilmiş yeniden yönlendirme değerlerinden biriyle tam olarak eşleşmelidir (HTTP veya HTTPS şeması, büyük/küçük harf ve varsa sonundaki '/' dahil).
scope (Gerekli)

Kapsam parametresi openid değeriyle başlamalı ve ardından profile değerini, email değerini veya her ikisini 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 belirteci email ve email_verified 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ılmış olmalı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 olabilir.

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

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

Protokolde gidiş-dönüş olan opak bir dize; yani, Temel akışta bir URI parametresi olarak ve Örtülü akışta URI #fragment tanımlayıcısında döndürülür.

state , istek 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şturur veya bazı istemci durumlarının (örneğin bir tanımlama bilgisi) karmasını 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 . Etki Çevrimdışı Erişim'de belgelenmiştir; bir erişim belirteci isteniyorsa, offline değeri belirtilmedikçe istemci bir yenileme belirteci almaz.
display (İsteğe bağlı) Yetkilendirme sunucusunun kimlik doğrulama ve izin kullanıcı arabirimi sayfalarını nasıl görüntülediğini belirtmek için bir ASCII dize değeri. Şu 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ı)

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 bu alandaki hesaplar için optimize edilmesi gerektiğini belirtebilirsiniz. Yalnızca bir alan yerine genel olarak G Suite hesaplarını optimize etmek için bir yıldız işareti ( * ) değeri ayarlayın: hd=* .

İstemci tarafı istekleri değiştirilebileceğinden, uygulamanıza kimlerin erişebileceğini kontrol etmek için bu UI 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 (örneğin mycolledge.edu ). request parametresinden farklı olarak, kimlik belirteci hd talebi, Google'dan gelen bir güvenlik belirtecinde bulunur, böylece değere güvenilebilir.

include_granted_scopes (İsteğe bağlı) Bu parametre true değeriyle sağlanırsa ve yetkilendirme talebi verilirse, yetkilendirme, diğer kapsamlar için bu kullanıcıya/uygulama kombinasyonuna daha önce verilmiş olan tüm yetkileri içerecektir; bkz. Artımlı yetkilendirme .

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 gizler ve oturum açma formundaki e-posta kutusunu önceden doldurur veya uygun oturumu seçer (kullanıcı çoklu oturum açma kullanıyorsa), bu, uygulamanız yanlış kullanıcı hesabında 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 onay isteyip istemediğini belirten, boşlukla ayrılmış bir dize değerleri listesi. Olası değerler şunlardır:
  • none

    Yetkilendirme sunucusu, herhangi bir kimlik doğrulama veya kullanıcı onayı ekranı görüntülemez; Kullanıcının kimliği önceden doğrulanmamışsa ve istenen kapsamlar için önceden yapılandırılmış onaya sahip değilse bir hata döndürür. Mevcut kimlik doğrulamasını ve/veya onayını kontrol etmek için none kullanamazsınız.

  • consent

    Yetkilendirme sunucusu, bilgileri istemciye 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.

Herhangi bir değer belirtilmemişse ve kullanıcının daha önce erişim yetkisi yoksa, kullanıcıya bir izin ekranı gösterilir.

Kimlik belirtecini doğrulama

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

Aşağıdakiler, sunucunuza kimlik belirteçleri gönderebileceğiniz yaygın durumlardır:

  • Kimliği doğrulanması gereken isteklerle kimlik belirteçleri gönderme. Kimlik belirteçleri, istekte bulunan belirli kullanıcıyı ve bu kimlik belirtecinin hangi müşteri için verildiğini size söyler.

Kimlik belirteçleri hassastır ve ele geçirilirse kötüye kullanılabilir. Bu belirteçlerin yalnızca HTTPS üzerinden ve yalnızca POST verileri aracılığıyla 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 belirteçlerini yararlı kılan şeylerden biri, bunları uygulamanızın farklı bileşenlerinde geçirebilmenizdir. Bu bileşenler, uygulamanın ve kullanıcının kimliğini doğrulayan basit bir kimlik doğrulama mekanizması olarak bir kimlik belirtecini kullanabilir. Ancak, kimlik belirtecindeki bilgileri kullanmadan veya kullanıcının kimliğini doğruladığına dair bir iddia olarak ona güvenmeden önce, onu doğrulamanız gerekir .

Kimlik belirtecinin doğrulanması birkaç adım gerektirir:

  1. Kimlik belirtecinin veren tarafından uygun şekilde imzalandığını doğrulayın. Google tarafından verilen belirteçler, Discovery belgesinin jwks_uri meta veri değerinde belirtilen URI'de bulunan sertifikalardan biri kullanılarak imzalanır.
  2. Kimlik belirtecindeki iss talebinin değerinin https://accounts.google.com veya accounts.google.com ile eşit olduğunu doğrulayın.
  3. Kimlik belirtecindeki aud talebinin değerinin, uygulamanızın müşteri kimliğine eşit olduğunu doğrulayın.
  4. Kimlik belirtecinin sona erme süresinin ( exp request) geçmediğini doğrulayın.
  5. İstekte bir hd parametre değeri belirttiyseniz kimlik jetonunun, kabul edilen bir G Suite tarafından barındırılan alanla eşleşen bir hd talebi olduğunu doğrulayın.

2'den 5'e kadar olan adımlar, yalnızca oldukça basit olan dize ve tarih karşılaştırmalarını içerir, bu nedenle bunları burada ayrıntılandı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 işlemeyle karşılaştırmak için Google'ın tokeninfo uç noktasını kullanabilirsiniz. Kimlik simgenizin değerinin XYZ123 olduğunu varsayalım. O zaman URI https://oauth2.googleapis.com/tokeninfo?id_token= XYZ123 referansını kaldırırsınız. 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 amaçları için, anahtar uç noktasından Google'ın genel anahtarlarını alın ve doğrulamayı yerel olarak gerçekleştirin. jwks_uri meta veri değerini kullanarak Discovery belgesinden anahtar URI'sini almalısınız. Hata ayıklama uç noktasına yapılan istekler kısılabilir veya başka şekilde aralıklı hatalara maruz kalabilir.

Google genel anahtarlarını nadiren değiştirdiğinden, HTTP yanıtının önbellek yönergelerini kullanarak bunları önbelleğe alabilir ve çoğu durumda yerel doğrulamayı tokeninfo uç noktasını kullanmaktan çok daha verimli bir şekilde gerçekleştirebilirsiniz. Bu doğrulama, 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, bunu başarmak için çok çeşitli dillerde iyi hata ayıklanmış kitaplıklar var (bkz. jwt.io ).

Kullanıcı profili bilgilerinin alınması

Kullanıcı hakkında ek profil bilgileri elde etmek 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 dahil edebilirsiniz:

    scope=openid%20profile%20email
  2. Yetkilendirme başlığına erişim belirtecinizi ekleyin ve userinfo uç noktasına, userinfo_endpoint meta veri değerini kullanarak Discovery belgesinden almanız gereken bir HTTPS GET isteği yapın. Userinfo yanıtı, OpenID Connect Standard Claims claims_supported açıklandığı gibi kullanıcıyla ilgili bilgileri ve Discovery belgesininclaim_supported meta veri değerini içerir. Kullanıcılar veya onların kuruluşları, belirli alanları sağlamayı veya vermemeyi 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 kimliğini doğrulamak ve belirteçler, kullanıcı bilgileri ve genel anahtarlar dahil olmak üzere kaynakları istemek için birden çok uç noktanın kullanılmasını gerektirir.

Uygulamaları basitleştirmek ve esnekliği artırmak için OpenID Connect, yetkilendirmenin URI'leri 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 yerde bulunan bir JSON belgesi olan "Keşif belgesinin" kullanılmasına izin verir. , belirteç, iptal, kullanıcı bilgileri ve ortak anahtarlar uç noktaları. 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, Discovery-document URI'sini ( https://accounts.google.com/.well-known/openid-configuration ) uygulamanıza sabit olarak kodlamanız gerekir. Uygulamanız belgeyi getirir, yanıtta önbelleğe alma kurallarını uygular ve ardından gerektiğinde ondan uç nokta URI'lerini alır. Örneğin, bir kullanıcının kimliğini doğrulamak için kodunuz, authorization_endpoint meta veri değerini (aşağıdaki örnekte https://accounts.google.com/o/oauth2/v2/auth ) adresine gönderilen kimlik doğrulama istekleri için temel URI olarak alır. Google.

İşte böyle bir belgenin bir örneği; alan adları OpenID Connect Discovery 1.0'da belirtilenlerdir (anlamları için bu belgeye bakın). Değerler tamamen açıklayıcıdır ve gerçek Google Discovery belgesinin yeni bir sürümünden kopyalanmış olmalarına rağmen 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 belgesindeki değerleri önbelleğe alarak bir HTTP gidiş-dönüşünü önleyebilirsiniz. Standart HTTP önbelleğe alma başlıkları kullanılır ve bunlara uyulmalıdır.

İstemci kitaplıkları

Aşağıdaki istemci kitaplıkları, popüler çerçevelerle entegre edilerek 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).