Genel bakış
Google API'lerini çağırmak üzere kullanıcı başına erişim jetonu almak için Google birden fazla JavaScript kitaplığı sunar:
Bu kılavuzda, bu kitaplıklardan Google Kimlik Hizmetleri kitaplığına geçiş talimatları sağlanmaktadır.
Bu kılavuzu izleyerek:
- Kullanımdan kaldırılan Platform Kitaplığı'nı Kimlik Hizmetleri kitaplığıyla değiştirin ve
- API İstemci Kitaplığı'nı kullanıyorsanız kullanımdan kaldırılan
gapi.auth2
modülünü, yöntemlerini ve nesnelerini kaldırıp bunların yerine Kimlik Hizmetleri'ndeki eşdeğerlerini ekleyin.
Kimlik Hizmetleri JavaScript kitaplığındaki değişikliklerin açıklaması için genel bakış ve kullanıcı yetkilendirmenin işleyiş şekli bölümlerini okuyarak temel terimleri ve kavramları inceleyin.
Kullanıcı kaydı ve oturum açma işlemleri için kimlik doğrulaması arıyorsanız Google ile Oturum Açma özelliğinden geçiş başlıklı makaleyi inceleyin.
Yetkilendirme akışınızı tanımlama
İki olası kullanıcı yetkilendirme akışı vardır: dolaylı ve yetkilendirme kodu.
Şu anda kullanılmakta olan yetkilendirme akışının türünü tanımlamak için web uygulamanızı inceleyin.
Web uygulamanızın dolaylı akışı kullandığı göstergeler:
- Web uygulamanız tamamen tarayıcı tabanlıdır ve arka uç platformu yoktur.
- Kullanıcının Google API'lerini çağırmak için mevcut olması gerekir. Uygulamanız yalnızca erişim jetonları kullanır ve yenileme jetonları gerektirmez.
- Web uygulamanız
apis.google.com/js/api.js
yükleniyor. - Uygulamanız, İstemci Tarafı Web Uygulamaları için OAuth 2.0'ı temel alır.
- Uygulamanız, JavaScript için Google API İstemci Kitaplığı'nda bulunan
gapi.client
veyagapi.auth2
modüllerini kullanıyor.
Web uygulamanızın yetkilendirme kodu akışını kullandığı göstergeler:
Uygulamanız aşağıdakilere dayanır:
Uygulamanız hem kullanıcının tarayıcısında hem de arka uç platformunuzda yürütülür.
Arka uç platformunuz bir yetkilendirme kodu uç noktası barındırır.
Arka uç platformunuz, mevcut olmalarına gerek kalmadan Google API'lerini kullanıcılar adına çağırır. Bu API, çevrimdışı mod olarak da bilinir.
Yenileme jetonları, arka uç platformunuz tarafından yönetilir ve depolanır.
Bazı durumlarda kod tabanınız her iki akışı da destekleyebilir.
Yetkilendirme akışı seçin
Taşıma işlemine başlamadan önce, mevcut akışınıza devam etmenin mi yoksa farklı bir akış benimsemenin mi ihtiyaçlarınızı en iyi şekilde karşılayacağını belirlemeniz gerekir.
İki akış arasındaki temel farkları ve ödünleri anlamak için yetkilendirme akışı seçme bölümünü inceleyin.
Çoğu durumda, en yüksek kullanıcı güvenliği düzeyini sunduğu için yetkilendirme kodu akışı önerilir. Bu akışın uygulanması, platformunuzun takvim, fotoğraf, abonelik ve benzeri öğelerde yapılan önemli değişiklikleri bildirmek için güncellemeleri getirme gibi yeni çevrimdışı işlevlerin daha kolay bir şekilde eklenmesini de sağlar.
Aşağıdaki seçicileri kullanarak bir yetkilendirme akışı seçin.
Örtülü akış
Kullanıcı mevcutken tarayıcıda kullanım için bir erişim jetonu alın.
Dolaylı akış örnekleri, web uygulamalarını Kimlik Hizmetleri'ne taşıma işleminden önce ve sonra gösterir.
Yetkilendirme kodu akışı
Google tarafından verilen kullanıcı başına yetkilendirme kodu, arka uç platformunuza gönderilir. Burada, bir erişim jetonu ve yenileme jetonuyla değiştirilir.
Yetkilendirme kodu akışı örnekleri, web uygulamalarını Kimlik Hizmetleri'ne taşıma işleminden önce ve sonra gösterir.
Bu kılavuz boyunca mevcut işlevleri Eklemek, Kaldırmak, Güncellemek veya Değiştirmek için kalın yazıyla listelenen talimatları uygulayın.
Tarayıcı içi web uygulamanızda yapılan değişiklikler
Bu bölümde, Google Kimlik Hizmetleri JavaScript kitaplığına geçiş yaparken tarayıcı içi web uygulamanızda yapacağınız değişiklikler ele alınmaktadır.
Etkilenen kodları belirleme ve test etme
Hata ayıklama çerezi, etkilenen kodu bulmaya ve kullanımdan kaldırma sonrası davranışı test etmeye yardımcı olabilir.
Büyük veya karmaşık uygulamalarda, gapi.auth2
modülünün kullanımdan kaldırılmasından etkilenen tüm kodları bulmak zor olabilir. Yakında kullanımdan kaldırılacak olan işlevin mevcut kullanımını konsola kaydetmek için G_AUTH2_MIGRATION
çerezinin değerini informational
olarak ayarlayın. İsteğe bağlı olarak, oturum depolama alanına giriş yapmak için bir iki nokta üst üste işareti ve ardından bir anahtar değeri ekleyebilirsiniz. Oturum açıldıktan ve kimlik bilgileri alındıktan sonra inceleme veya toplanan günlükleri daha sonra analiz için bir arka uca gönderin. Örneğin informational:showauth2use
, kaynağı ve URL'yi showauth2use
adlı bir oturum depolama anahtarına kaydeder.
gapi.auth2
modülü artık yüklenmediğinde uygulama davranışını doğrulamak için G_AUTH2_MIGRATION
çerezinin değerini enforced
olarak ayarlayın. Bu sayede, kullanımdan kaldırma sonrası davranış yaptırım tarihinden önce test edilebilir.
Olası G_AUTH2_MIGRATION
çerez değerleri:
enforced
gapi.auth2
modülünü yüklemeyin.informational
Kullanımdan kaldırılan işlevlerin kullanımını JS konsoluna kaydedin. İsteğe bağlı bir anahtar adı ayarlandığında da oturum depolama alanına günlüğe kaydedilir:informational:key-name
.
Kullanıcı etkisini en aza indirmek için bu çerezi üretim ortamlarında kullanmadan önce geliştirme ve test aşamasında yerel olarak ayarlamanız önerilir.
Kitaplıklar ve modüller
gapi.auth2
modülü, oturum açma için kullanıcı kimlik doğrulamasını ve yetkilendirme için dolaylı akışı yönetir. Bu modül, kullanımdan kaldırılan bu modülün yanı sıra nesnelerin ve yöntemleri de Google Kimlik Hizmetleri kitaplığıyla değiştirir.
Kimlik Hizmetleri kitaplığını dokümanınıza ekleyerek web uygulamanıza ekleyin:
<script src="https://accounts.google.com/gsi/client" async defer></script>
gapi.load('auth2',
function)
kullanarak auth2
modülü yükleme örneklerini kaldırın.
Google Kimlik Hizmetleri kitaplığı, gapi.auth2
modülü kullanımının yerini alır.
JavaScript için Google API İstemci Kitaplığı'ndaki gapi.client
modülünü güvenli bir şekilde kullanmaya devam edebilir ve bir keşif dokümanından çağrılabilir JS yöntemlerinin otomatik olarak oluşturulmasından, birden fazla API çağrısını toplu olarak işlenmesinden ve CORS yönetim işlevlerinden yararlanabilirsiniz.
kurabiyeler
Kullanıcı yetkilendirmesi, çerez kullanımını gerektirmez.
Kullanıcı kimlik doğrulamasının çerezleri nasıl kullandığıyla ilgili ayrıntılar için Google ile Oturum Açma özelliğinden geçiş yapma ve diğer Google ürün ve hizmetlerinin çerez kullanımı için Google'ın çerezleri nasıl kullandığı konularına bakın.
Kimlik bilgileri
Google Kimlik Hizmetleri, kullanıcı kimlik doğrulama ve yetkilendirmeyi iki farklı işleme ayırır ve kullanıcı kimlik bilgileri ayrıdır: kullanıcıyı tanımlamak için kullanılan kimlik jetonu, yetkilendirme için kullanılan erişim jetonundan ayrı olarak döndürülür.
Bu değişiklikleri görüntülemek için örnek kimlik bilgilerine bakın.
Örtülü akış
Kullanıcı profili işlemesini yetkilendirme akışlarından kaldırarak kullanıcı kimlik doğrulamasını ve yetkilendirmesini ayırın.
Bu Google ile Oturum Açma JavaScript istemci referanslarını kaldırın:
Yöntemler
GoogleUser.getBasicProfile()
GoogleUser.getId()
Yetkilendirme kodu akışı
Identity Services, tarayıcıdaki kimlik bilgilerini kimlik jetonu ve erişim jetonu olarak ayırır. Bu değişiklik, arka uç platformunuzdan Google OAuth 2.0 uç noktalarına doğrudan çağrılarla veya platformunuzdaki güvenli bir sunucuda çalışan Google API'leri Node.js İstemcisi gibi kitaplıklar aracılığıyla alınan kimlik bilgileri için geçerli değildir.
Oturum durumu
Google ile Oturum Açma, önceden aşağıdakileri kullanarak kullanıcının oturum açma durumunu yönetmenize yardımcı oluyor:
- Kullanıcının oturum durumunu izleme için geri arama işleyicileri.
- Bir kullanıcının Google Hesabı'nın oturum açma durumundaki etkinlikleri ve değişiklikleri dinleyiciler.
Web uygulamanızın oturum açma durumunu ve kullanıcı oturumlarını yönetmek sizin sorumluluğunuzdadır.
Bu Google ile Oturum Açma JavaScript istemci referanslarını kaldırın:
Nesneler:
gapi.auth2.SignInOptions
Yöntemler:
GoogleAuth.attachClickHandler()
GoogleAuth.isSignedIn()
GoogleAuth.isSignedIn.get()
GoogleAuth.isSignedIn.listen()
GoogleAuth.signIn()
GoogleAuth.signOut()
GoogleAuth.currentUser.get()
GoogleAuth.currentUser.listen()
GoogleUser.isSignedIn()
İstemci yapılandırması
Dolaylı veya yetkilendirme kod akışı için bir jeton istemcisini başlatmak üzere web uygulamanızı güncelleyin.
Bu Google ile Oturum Açma JavaScript istemci referanslarını kaldırın:
Nesneler:
gapi.auth2.ClientConfig
gapi.auth2.OfflineAccessOptions
Yöntemler:
gapi.auth2.getAuthInstance()
GoogleUser.grant()
Örtülü akış
Bir jeton istemcisini başlatın bölümündeki örneği izleyerek web uygulamanızı yapılandırmak için bir TokenClientConfig
nesnesi ve initTokenClient()
çağrısı ekleyin.
Google ile Oturum Açma JavaScript istemci referanslarını Google Kimlik Hizmetleri ile değiştirin:
Nesneler:
TokenClientConfig
ilegapi.auth2.AuthorizeConfig
Yöntemler:
google.accounts.oauth2.initTokenClient()
ilegapi.auth2.init()
Parametreler:
TokenClientConfig.login_hint
ilegapi.auth2.AuthorizeConfig.login_hint
.TokenClientConfig.hd
ilegapi.auth2.GoogleUser.getHostedDomain()
.
Yetkilendirme kodu akışı
Kod İstemcisi başlatma bölümündeki örneği izleyerek web uygulamanızı yapılandırmak için bir CodeClientConfig
nesnesi ve initCodeClient()
çağrısı ekleyin.
Dolaylı moddan yetkilendirme kodu akışına geçiş yaparken:
Google ile Oturum Açma JavaScript istemci referanslarını kaldırın
Nesneler:
gapi.auth2.AuthorizeConfig
Yöntemler:
gapi.auth2.init()
Parametreler:
gapi.auth2.AuthorizeConfig.login_hint
gapi.auth2.GoogleUser.getHostedDomain()
Jeton isteği
Düğme tıklaması gibi bir kullanıcı hareketi, erişim jetonunun örtülü akışla doğrudan kullanıcının tarayıcısına veya bir kullanıcı başına yetkilendirme kodu bir erişim jetonu ve yenileme jetonuyla değiştirildikten sonra arka uç platformunuza döndürülmesiyle sonuçlanan bir istek oluşturur.
Örtülü akış
Erişim jetonları, kullanıcı oturum açmış ve Google ile etkin bir oturumu varken alınmış ve tarayıcıda kullanılabilir. Dolaylı modda, daha önce istek yapılmış olsa bile bir kullanıcı hareketinin erişim jetonu istemesi gerekir.
Google ile Oturum Açma JavaScript istemci referanslarını Google Kimlik Hizmetleri ile değiştirin:
Yöntemler:
TokenClient.requestAccessToken()
ilegapi.auth2.authorize()
TokenClient.requestAccessToken()
ileGoogleUser.reloadAuthResponse()
Erişim jetonu istemek veya mevcut jetonun süresi dolduğunda yeni bir jeton almak amacıyla pop-up kullanıcı deneyimi akışını başlatmak için requestAccessToken()
yöntemini çağırmak üzere bir bağlantı veya düğme ekleyin.
Kod tabanınızı aşağıdaki şekilde güncelleyin:
requestAccessToken()
ile OAuth 2.0 jeton akışını tetikleyin.- Birçok kapsam için bir isteği birden fazla daha küçük isteğe ayırmak amacıyla
requestAccessToken
veOverridableTokenClientConfig
kullanarak artımlı yetkilendirmeyi destekleyin. - Mevcut jetonun süresi dolduğunda veya iptal edildiğinde yeni bir jeton isteyin.
Birden çok kapsamla çalışmak, bir kerede değil de yalnızca ihtiyaç duyulan kapsamlara erişim istemek için kod tabanınızda yapısal değişiklikler gerektirebilir. Buna artımlı yetkilendirme denir. Her istek mümkün olduğunca az sayıda kapsam ve ideal olarak tek bir kapsam içermelidir. Uygulamanızı artımlı yetkilendirme için nasıl güncelleyeceğiniz hakkında daha fazla bilgiyi kullanıcı iznini işleme bölümünde bulabilirsiniz.
Bir erişim jetonunun süresi dolduğunda gapi.auth2
modülü otomatik olarak web uygulamanız için yeni ve geçerli bir erişim jetonu alır. Daha fazla kullanıcı güvenliği için bu otomatik jeton yenileme işlemi, Google Kimlik Hizmetleri kitaplığı tarafından desteklenmez. Web uygulamanızın, süresi dolmuş bir erişim jetonunu algılayıp yenisini isteyecek şekilde güncellenmesi gerekir. Daha fazla bilgi için aşağıdaki Jeton işleme bölümüne bakın.
Yetkilendirme kodu akışı
Google'dan yetkilendirme kodu istemek üzere requestCode()
hizmetini aramak için bir bağlantı veya düğme ekleyin. Örnek için OAuth 2.0 Kod Akışını Tetikleyici Etme sayfasına göz atın.
Süresi dolmuş veya iptal edilmiş bir erişim jetonuna nasıl yanıt verileceği hakkında daha fazla bilgi edinmek için aşağıdaki Jeton işleme bölümüne bakın.
Jeton işleme
Süresi dolmuş veya iptal edilmiş bir erişim jetonu kullanıldığında başarısız Google API çağrılarını algılamak, yeni ve geçerli bir erişim jetonu istemek için hata işleme ekleme.
Süresi dolmuş veya iptal edilmiş bir erişim jetonu kullanıldığında Google API'leri tarafından 401 Unauthorized
ve invalid_token
hata mesajından oluşan bir HTTP durum kodu döndürülür. Örnek için Geçersiz jeton yanıtı bölümüne bakın.
Süresi dolmuş jetonlar
Erişim jetonları kısa ömürlüdür ve genellikle yalnızca birkaç dakika için geçerlidir.
Jeton iptali
Google Hesabı sahibi önceden verilen izni istediği zaman iptal edebilir. Aksi takdirde mevcut erişim jetonları ve yenileme jetonları geçersiz hale gelir. İptal işlemi, revoke()
kullanılarak veya bir Google Hesabı aracılığıyla platformunuzdan tetiklenebilir.
Google ile Oturum Açma JavaScript istemci referanslarını Google Kimlik Hizmetleri ile değiştirin:
Yöntemler:
google.accounts.oauth2.revoke()
ilegetAuthInstance().disconnect()
google.accounts.oauth2.revoke()
ileGoogleUser.disconnect()
Bir kullanıcı, platformunuzdaki hesabını sildiğinde veya uygulamanızla veri paylaşma iznini kaldırmak istediğinde revoke
numaralı telefonu arayın.
Kullanıcı izni istemi
Web uygulamanız veya arka uç platformunuz erişim jetonu istediğinde Google, kullanıcıya bir rıza mesajı gösterir. Google tarafından kullanıcılara gösterilen örnek izin iletişim kutuları'na bakın.
Uygulamanıza erişim jetonu yayınlamadan önce, kullanıcı izni istemek ve sonucu kaydetmek için mevcut ve etkin bir Google oturumu gerekir. Mevcut bir oturum henüz oluşturulmadıysa kullanıcının bir Google Hesabı'nda oturum açması gerekebilir.
Kullanıcı oturumu açma
Kullanıcılar bir Google Hesabı'nda ayrı bir tarayıcı sekmesinde veya yerel olarak bir tarayıcı ya da işletim sistemi üzerinden oturum açabilir. Kullanıcı uygulamanızı ilk kez açtığında Google Hesabı ile tarayıcı arasında etkin bir oturum başlatmak için sitenize Google ile Oturum Aç'ı eklemenizi öneririz. Bu, aşağıdaki avantajları sağlar:
- Kullanıcının oturum açması gereken sayısını en aza indirir. Erişim jetonu isteme, etkin bir oturum yoksa Google Hesabı'nda oturum açma işlemini başlatır.
CodeClientConfig
veyaTokenClientConfig
nesnelerindelogin_hint
parametresinin değeri olarak doğrudan JWT Kimlik Jetonu kimlik bilgisiemail
alanını kullanın. Bu, özellikle platformunuzda kullanıcı hesabı yönetim sistemi bulunmuyorsa kullanışlıdır.- Bir Google Hesabı'nı platformunuzdaki mevcut bir yerel kullanıcı hesabıyla arayıp ilişkilendirin. Böylece, platformunuzda yinelenen hesapları en aza indirebilirsiniz.
- Yeni bir yerel hesap oluşturulduğunda, kaydolma iletişim kutularınız ve akışınız kullanıcı kimlik doğrulama iletişim kutularından ve akışlarından net bir şekilde ayrılabilir. Böylece gereken adım sayısı azalır ve ayrılma oranı iyileşir.
Kullanıcılar oturum açtıktan sonra ve erişim jetonu verilmeden önce istenen kapsamlar için uygulamanıza izin vermelidir.
Jeton ve izin yanıtı
İzin verildikten sonra, kullanıcı tarafından onaylanan veya reddedilen kapsamların listesiyle birlikte bir erişim jetonu döndürülür.
Ayrıntılı izinler, kullanıcıların kapsamları tek tek onaylamasına veya reddetmesine olanak tanır. Birden fazla kapsama erişim istenirken her kapsam, diğer kapsamlardan bağımsız olarak verilir veya reddedilir. Uygulamanız, kullanıcı seçimine göre belirli bir kapsama bağlı özellikleri ve işlevleri seçerek etkinleştirir.
Örtülü akış
Google ile Oturum Açma JavaScript istemci referanslarını Google Kimlik Hizmetleri ile değiştirin:
Nesneler:
TokenClient.TokenResponse
ilegapi.auth2.AuthorizeResponse
TokenClient.TokenResponse
ilegapi.auth2.AuthResponse
Yöntemler:
google.accounts.oauth2.hasGrantedAllScopes()
ileGoogleUser.hasGrantedScopes()
google.accounts.oauth2.hasGrantedAllScopes()
ileGoogleUser.getGrantedScopes()
Google ile Oturum Açma JavaScript istemci referanslarını kaldırın:
Yöntemler:
GoogleUser.getAuthResponse()
Bu ayrıntılı izinler örneğini uygulayarak web uygulamanızı hasGrantedAllScopes()
ve hasGrantedAnyScope()
ile güncelleyin.
Yetkilendirme kodu akışı
Kimlik doğrulama kodu işleme bölümündeki talimatları uygulayarak arka uç platformunuza bir yetkilendirme kodu uç noktasını güncelleyin veya ekleyin.
İsteği doğrulamak, erişim jetonu ve yenileme jetonu almak için Kod Modelini Kullanma kılavuzunda açıklanan adımları uygulamak için platformunuzu güncelleyin.
Artımlı yetkilendirme talimatlarını uygulayarak ve kullanıcı tarafından verilen erişim kapsamlarını inceleyerek, platformunuzu kullanıcının onayladığı bireysel kapsamlara göre özellikleri ve işlevleri seçerek etkinleştirecek veya devre dışı bırakacak şekilde güncelleyin.
Örtük akış örnekleri
Eski yöntem
GAPI İstemci Kitaplığı
Kullanıcı rızası için pop-up iletişim kutusu kullanılarak tarayıcıda çalışan JavaScript için Google API İstemci Kitaplığı örneği.
gapi.auth2
modülü, gapi.client.init()
tarafından otomatik olarak yüklenip kullanıldığı için gizlidir.
<!DOCTYPE html>
<html>
<head>
<script src="https://apis.google.com/js/api.js"></script>
<script>
function start() {
gapi.client.init({
'apiKey': 'YOUR_API_KEY',
'clientId': 'YOUR_CLIENT_ID',
'scope': 'https://www.googleapis.com/auth/cloud-translation',
'discoveryDocs': ['https://www.googleapis.com/discovery/v1/apis/translate/v2/rest'],
}).then(function() {
// Execute an API request which is returned as a Promise.
// The method name language.translations.list comes from the API discovery.
return gapi.client.language.translations.list({
q: 'hello world',
source: 'en',
target: 'de',
});
}).then(function(response) {
console.log(response.result.data.translations[0].translatedText);
}, function(reason) {
console.log('Error: ' + reason.result.error.message);
});
};
// Load the JavaScript client library and invoke start afterwards.
gapi.load('client', start);
</script>
</head>
<body>
<div id="results"></div>
</body>
</html>
JS İstemci Kitaplığı
Kullanıcı izni için bir pop-up iletişim kutusu kullanarak tarayıcıda çalışan İstemci Tarafı Web Uygulamaları için OAuth 2.0.
gapi.auth2
modülü manuel olarak yüklenir.
<!DOCTYPE html>
<html><head></head><body>
<script>
var GoogleAuth;
var SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly';
function handleClientLoad() {
// Load the API's client and auth2 modules.
// Call the initClient function after the modules load.
gapi.load('client:auth2', initClient);
}
function initClient() {
// In practice, your app can retrieve one or more discovery documents.
var discoveryUrl = 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';
// Initialize the gapi.client object, which app uses to make API requests.
// Get API key and client ID from API Console.
// 'scope' field specifies space-delimited list of access scopes.
gapi.client.init({
'apiKey': 'YOUR_API_KEY',
'clientId': 'YOUR_CLIENT_ID',
'discoveryDocs': [discoveryUrl],
'scope': SCOPE
}).then(function () {
GoogleAuth = gapi.auth2.getAuthInstance();
// Listen for sign-in state changes.
GoogleAuth.isSignedIn.listen(updateSigninStatus);
// Handle initial sign-in state. (Determine if user is already signed in.)
var user = GoogleAuth.currentUser.get();
setSigninStatus();
// Call handleAuthClick function when user clicks on
// "Sign In/Authorize" button.
$('#sign-in-or-out-button').click(function() {
handleAuthClick();
});
$('#revoke-access-button').click(function() {
revokeAccess();
});
});
}
function handleAuthClick() {
if (GoogleAuth.isSignedIn.get()) {
// User is authorized and has clicked "Sign out" button.
GoogleAuth.signOut();
} else {
// User is not signed in. Start Google auth flow.
GoogleAuth.signIn();
}
}
function revokeAccess() {
GoogleAuth.disconnect();
}
function setSigninStatus() {
var user = GoogleAuth.currentUser.get();
var isAuthorized = user.hasGrantedScopes(SCOPE);
if (isAuthorized) {
$('#sign-in-or-out-button').html('Sign out');
$('#revoke-access-button').css('display', 'inline-block');
$('#auth-status').html('You are currently signed in and have granted ' +
'access to this app.');
} else {
$('#sign-in-or-out-button').html('Sign In/Authorize');
$('#revoke-access-button').css('display', 'none');
$('#auth-status').html('You have not authorized this app or you are ' +
'signed out.');
}
}
function updateSigninStatus() {
setSigninStatus();
}
</script>
<button id="sign-in-or-out-button"
style="margin-left: 25px">Sign In/Authorize</button>
<button id="revoke-access-button"
style="display: none; margin-left: 25px">Revoke access</button>
<div id="auth-status" style="display: inline; padding-left: 25px"></div><hr>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script async defer src="https://apis.google.com/js/api.js"
onload="this.onload=function(){};handleClientLoad()"
onreadystatechange="if (this.readyState === 'complete') this.onload()">
</script>
</body></html>
OAuth 2.0 Uç Noktaları
Kullanıcı izni için Google'a yönlendirmeleri kullanarak tarayıcıda çalışan İstemci Tarafı Web Uygulamaları için OAuth 2.0.
Bu örnekte, kullanıcının tarayıcısından Google'ın OAuth 2.0 uç noktalarına yapılan doğrudan çağrılar gösterilmektedir. gapi.auth2
modülü veya JavaScript kitaplığı kullanılmamaktadır.
<!DOCTYPE html>
<html><head></head><body>
<script>
var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE';
var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE';
var fragmentString = location.hash.substring(1);
// Parse query string to see if page request is coming from OAuth 2.0 server.
var params = {};
var regex = /([^&=]+)=([^&]*)/g, m;
while (m = regex.exec(fragmentString)) {
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
}
if (Object.keys(params).length > 0) {
localStorage.setItem('oauth2-test-params', JSON.stringify(params) );
if (params['state'] && params['state'] == 'try_sample_request') {
trySampleRequest();
}
}
// If there's an access token, try an API request.
// Otherwise, start OAuth 2.0 flow.
function trySampleRequest() {
var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
if (params && params['access_token']) {
var xhr = new XMLHttpRequest();
xhr.open('GET',
'https://www.googleapis.com/drive/v3/about?fields=user&' +
'access_token=' + params['access_token']);
xhr.onreadystatechange = function (e) {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.response);
} else if (xhr.readyState === 4 && xhr.status === 401) {
// Token invalid, so prompt for user permission.
oauth2SignIn();
}
};
xhr.send(null);
} else {
oauth2SignIn();
}
}
/*
* Create form to request access token from Google's OAuth 2.0 server.
*/
function oauth2SignIn() {
// Google's OAuth 2.0 endpoint for requesting an access token
var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';
// Create element to open OAuth 2.0 endpoint in new window.
var form = document.createElement('form');
form.setAttribute('method', 'GET'); // Send as a GET request.
form.setAttribute('action', oauth2Endpoint);
// Parameters to pass to OAuth 2.0 endpoint.
var params = {'client_id': YOUR_CLIENT_ID,
'redirect_uri': YOUR_REDIRECT_URI,
'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
'state': 'try_sample_request',
'include_granted_scopes': 'true',
'response_type': 'token'};
// Add form parameters as hidden input values.
for (var p in params) {
var input = document.createElement('input');
input.setAttribute('type', 'hidden');
input.setAttribute('name', p);
input.setAttribute('value', params[p]);
form.appendChild(input);
}
// Add form to page and submit it to open the OAuth 2.0 endpoint.
document.body.appendChild(form);
form.submit();
}
</script>
<button onclick="trySampleRequest();">Try sample request</button>
</body></html>
Yeni yöntem
Yalnızca Coğrafi Bilgi Sistemi
Bu örnekte yalnızca jeton modelini kullanan Google Kimlik Hizmeti JavaScript kitaplığı ve kullanıcı izni için pop-up iletişim kutusu gösterilmektedir. Bu görselde bir istemciyi yapılandırmak, erişim jetonu istemek ve almak ve bir Google API'sini çağırmak için gereken minimum adım sayısını göstermek amaçlanmıştır.
<!DOCTYPE html>
<html>
<head>
<script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
</head>
<body>
<script>
var client;
var access_token;
function initClient() {
client = google.accounts.oauth2.initTokenClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly \
https://www.googleapis.com/auth/contacts.readonly',
callback: (tokenResponse) => {
access_token = tokenResponse.access_token;
},
});
}
function getToken() {
client.requestAccessToken();
}
function revokeToken() {
google.accounts.oauth2.revoke(access_token, () => {console.log('access token revoked')});
}
function loadCalendar() {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://www.googleapis.com/calendar/v3/calendars/primary/events');
xhr.setRequestHeader('Authorization', 'Bearer ' + access_token);
xhr.send();
}
</script>
<h1>Google Identity Services Authorization Token model</h1>
<button onclick="getToken();">Get access token</button><br><br>
<button onclick="loadCalendar();">Load Calendar</button><br><br>
<button onclick="revokeToken();">Revoke token</button>
</body>
</html>
GAPI eşzamansız/beklemede
Bu örnekte, jeton modelini kullanarak Google Kimlik Hizmeti kitaplığının nasıl ekleneceği, gapi.auth2
modülünün nasıl kaldırılacağı ve JavaScript için Google API İstemci Kitaplığı'nı kullanarak bir API'nin nasıl çağrılacağı gösterilmektedir.
Kitaplık yükleme sırasını zorunlu kılmak ve yetkilendirme hatalarını yakalayıp yeniden denemek için Promise'ler, eşzamansız ve beklemedeki modlar kullanılır. API çağrısı yalnızca geçerli bir erişim jetonu kullanılabilir olduğunda yapılır.
Kullanıcıların, sayfa ilk yüklendiğinde veya erişim jetonunun süresi dolduktan sonra erişim jetonu eksik olduğunda "Takvimi Göster" düğmesine basması beklenir.
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>GAPI with GIS async/await</h1>
<button id="showEventsBtn" onclick="showEvents();">Show Calendar</button><br><br>
<button id="revokeBtn" onclick="revokeToken();">Revoke access token</button>
<script>
const gapiLoadPromise = new Promise((resolve, reject) => {
gapiLoadOkay = resolve;
gapiLoadFail = reject;
});
const gisLoadPromise = new Promise((resolve, reject) => {
gisLoadOkay = resolve;
gisLoadFail = reject;
});
var tokenClient;
(async () => {
document.getElementById("showEventsBtn").style.visibility="hidden";
document.getElementById("revokeBtn").style.visibility="hidden";
// First, load and initialize the gapi.client
await gapiLoadPromise;
await new Promise((resolve, reject) => {
// NOTE: the 'auth2' module is no longer loaded.
gapi.load('client', {callback: resolve, onerror: reject});
});
await gapi.client.init({
// NOTE: OAuth2 'scope' and 'client_id' parameters have moved to initTokenClient().
})
.then(function() { // Load the Calendar API discovery document.
gapi.client.load('https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest');
});
// Now load the GIS client
await gisLoadPromise;
await new Promise((resolve, reject) => {
try {
tokenClient = google.accounts.oauth2.initTokenClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
prompt: 'consent',
callback: '', // defined at request time in await/promise scope.
});
resolve();
} catch (err) {
reject(err);
}
});
document.getElementById("showEventsBtn").style.visibility="visible";
document.getElementById("revokeBtn").style.visibility="visible";
})();
async function getToken(err) {
if (err.result.error.code == 401 || (err.result.error.code == 403) &&
(err.result.error.status == "PERMISSION_DENIED")) {
// The access token is missing, invalid, or expired, prompt for user consent to obtain one.
await new Promise((resolve, reject) => {
try {
// Settle this promise in the response callback for requestAccessToken()
tokenClient.callback = (resp) => {
if (resp.error !== undefined) {
reject(resp);
}
// GIS has automatically updated gapi.client with the newly issued access token.
console.log('gapi.client access token: ' + JSON.stringify(gapi.client.getToken()));
resolve(resp);
};
tokenClient.requestAccessToken();
} catch (err) {
console.log(err)
}
});
} else {
// Errors unrelated to authorization: server errors, exceeding quota, bad requests, and so on.
throw new Error(err);
}
}
function showEvents() {
// Try to fetch a list of Calendar events. If a valid access token is needed,
// prompt to obtain one and then retry the original request.
gapi.client.calendar.events.list({ 'calendarId': 'primary' })
.then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
.catch(err => getToken(err)) // for authorization errors obtain an access token
.then(retry => gapi.client.calendar.events.list({ 'calendarId': 'primary' }))
.then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
.catch(err => console.log(err)); // cancelled by user, timeout, etc.
}
function revokeToken() {
let cred = gapi.client.getToken();
if (cred !== null) {
google.accounts.oauth2.revoke(cred.access_token, () => {console.log('Revoked: ' + cred.access_token)});
gapi.client.setToken('');
}
}
</script>
<script async defer src="https://apis.google.com/js/api.js" onload="gapiLoadOkay()" onerror="gapiLoadFail(event)"></script>
<script async defer src="https://accounts.google.com/gsi/client" onload="gisLoadOkay()" onerror="gisLoadFail(event)"></script>
</body>
</html>
GAPI geri çağırma
Bu örnekte, jeton modelini kullanarak Google Kimlik Hizmeti kitaplığının nasıl ekleneceği, gapi.auth2
modülünün nasıl kaldırılacağı ve JavaScript için Google API İstemci Kitaplığı'nı kullanarak bir API'nin nasıl çağrılacağı gösterilmektedir.
Değişkenler, kitaplık yükleme sırasını zorunlu kılmak için kullanılır. GAPI çağrıları, geçerli bir erişim jetonu döndürüldükten sonra geri çağırma içinden yapılır.
Kullanıcıların, sayfa ilk yüklendiğinde Takvimi Göster düğmesine basması ve Takvim bilgilerini yenilemek istediklerinde tekrar basmaları beklenir.
<!DOCTYPE html>
<html>
<head>
<script async defer src="https://apis.google.com/js/api.js" onload="gapiLoad()"></script>
<script async defer src="https://accounts.google.com/gsi/client" onload="gisInit()"></script>
</head>
<body>
<h1>GAPI with GIS callbacks</h1>
<button id="showEventsBtn" onclick="showEvents();">Show Calendar</button><br><br>
<button id="revokeBtn" onclick="revokeToken();">Revoke access token</button>
<script>
let tokenClient;
let gapiInited;
let gisInited;
document.getElementById("showEventsBtn").style.visibility="hidden";
document.getElementById("revokeBtn").style.visibility="hidden";
function checkBeforeStart() {
if (gapiInited && gisInited){
// Start only when both gapi and gis are initialized.
document.getElementById("showEventsBtn").style.visibility="visible";
document.getElementById("revokeBtn").style.visibility="visible";
}
}
function gapiInit() {
gapi.client.init({
// NOTE: OAuth2 'scope' and 'client_id' parameters have moved to initTokenClient().
})
.then(function() { // Load the Calendar API discovery document.
gapi.client.load('https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest');
gapiInited = true;
checkBeforeStart();
});
}
function gapiLoad() {
gapi.load('client', gapiInit)
}
function gisInit() {
tokenClient = google.accounts.oauth2.initTokenClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
callback: '', // defined at request time
});
gisInited = true;
checkBeforeStart();
}
function showEvents() {
tokenClient.callback = (resp) => {
if (resp.error !== undefined) {
throw(resp);
}
// GIS has automatically updated gapi.client with the newly issued access token.
console.log('gapi.client access token: ' + JSON.stringify(gapi.client.getToken()));
gapi.client.calendar.events.list({ 'calendarId': 'primary' })
.then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
.catch(err => console.log(err));
document.getElementById("showEventsBtn").innerText = "Refresh Calendar";
}
// Conditionally ask users to select the Google Account they'd like to use,
// and explicitly obtain their consent to fetch their Calendar.
// NOTE: To request an access token a user gesture is necessary.
if (gapi.client.getToken() === null) {
// Prompt the user to select a Google Account and asked for consent to share their data
// when establishing a new session.
tokenClient.requestAccessToken({prompt: 'consent'});
} else {
// Skip display of account chooser and consent dialog for an existing session.
tokenClient.requestAccessToken({prompt: ''});
}
}
function revokeToken() {
let cred = gapi.client.getToken();
if (cred !== null) {
google.accounts.oauth2.revoke(cred.access_token, () => {console.log('Revoked: ' + cred.access_token)});
gapi.client.setToken('');
document.getElementById("showEventsBtn").innerText = "Show Calendar";
}
}
</script>
</body>
</html>
Yetkilendirme kodu akışı örnekleri
Google Kimlik Hizmeti kitaplığı pop-up kullanıcı deneyimi, doğrudan arka uç jeton uç noktanıza yetkilendirme kodu döndürmek için bir URL yönlendirmesi veya kullanıcının tarayıcısında çalışan ve platformunuza yanıt proxy'si yapan bir JavaScript geri çağırma işleyicisi kullanabilir. Her iki durumda da arka uç platformunuz, geçerli bir yenileme ve erişim jetonu almak için OAuth 2.0 akışını tamamlar.
Eski yöntem
Sunucu Taraflı Web Uygulamaları
Kullanıcı izni için Google'a yönlendirme kullanarak arka uç platformunda çalışan sunucu tarafı uygulamaları için Google ile Oturum Açma.
<!DOCTYPE html>
<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script>
<script>
function start() {
gapi.load('auth2', function() {
auth2 = gapi.auth2.init({
client_id: 'YOUR_CLIENT_ID',
api_key: 'YOUR_API_KEY',
discovery_docs: ['https://www.googleapis.com/discovery/v1/apis/translate/v2/rest'],
// Scopes to request in addition to 'profile' and 'email'
scope: 'https://www.googleapis.com/auth/cloud-translation',
});
});
}
function signInCallback(authResult) {
if (authResult['code']) {
console.log("sending AJAX request");
// Send authorization code obtained from Google to backend platform
$.ajax({
type: 'POST',
url: 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URL',
// Always include an X-Requested-With header to protect against CSRF attacks.
headers: {
'X-Requested-With': 'XMLHttpRequest'
},
contentType: 'application/octet-stream; charset=utf-8',
success: function(result) {
console.log(result);
},
processData: false,
data: authResult['code']
});
} else {
console.log('error: failed to obtain authorization code')
}
}
</script>
</head>
<body>
<button id="signinButton">Sign In With Google</button>
<script>
$('#signinButton').click(function() {
// Obtain an authorization code from Google
auth2.grantOfflineAccess().then(signInCallback);
});
</script>
</body>
</html>
Yönlendirme kullanarak HTTP/REST
Kullanıcının tarayıcısından arka uç platformunuza yetkilendirme kodu göndermek için Web Sunucusu Uygulamaları için OAuth 2.0'ı kullanma. Kullanıcı izni, kullanıcının tarayıcısı Google'a yönlendirilerek işlenir.
/\*
\* Create form to request access token from Google's OAuth 2.0 server.
\*/
function oauthSignIn() {
// Google's OAuth 2.0 endpoint for requesting an access token
var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';
// Create <form> element to submit parameters to OAuth 2.0 endpoint.
var form = document.createElement('form');
form.setAttribute('method', 'GET'); // Send as a GET request.
form.setAttribute('action', oauth2Endpoint);
// Parameters to pass to OAuth 2.0 endpoint.
var params = {'client\_id': 'YOUR_CLIENT_ID',
'redirect\_uri': 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URL',
'response\_type': 'token',
'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
'include\_granted\_scopes': 'true',
'state': 'pass-through value'};
// Add form parameters as hidden input values.
for (var p in params) {
var input = document.createElement('input');
input.setAttribute('type', 'hidden');
input.setAttribute('name', p);
input.setAttribute('value', params[p]);
form.appendChild(input);
}
// Add form to page and submit it to open the OAuth 2.0 endpoint.
document.body.appendChild(form);
form.submit();
}
Yeni yöntem
Coğrafi Bilgi Sistemi Pop-up Kullanıcı Deneyimi
Bu örnekte yalnızca, Google'dan yetkilendirme kodunu almak için kullanıcı rızası ve geri çağırma işleyicisinin bulunduğu bir pop-up iletişim kutusu olmak üzere yetkilendirme kodu modelini kullanan Google Kimlik Hizmeti JavaScript kitaplığı gösterilmektedir. Bu şablon, bir istemciyi yapılandırmak, izin almak ve arka uç platformunuza yetkilendirme kodu göndermek için gereken minimum adım sayısını göstermek üzere sağlanmıştır.
<!DOCTYPE html>
<html>
<head>
<script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
</head>
<body>
<script>
var client;
function initClient() {
client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
ux_mode: 'popup',
callback: (response) => {
var code_receiver_uri = 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URI',
// Send auth code to your backend platform
const xhr = new XMLHttpRequest();
xhr.open('POST', code_receiver_uri, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onload = function() {
console.log('Signed in as: ' + xhr.responseText);
};
xhr.send('code=' + response.code);
// After receipt, the code is exchanged for an access token and
// refresh token, and the platform then updates this web app
// running in user's browser with the requested calendar info.
},
});
}
function getAuthCode() {
// Request authorization code and obtain user consent
client.requestCode();
}
</script>
<button onclick="getAuthCode();">Load Your Calendar</button>
</body>
</html>
Coğrafi Bilgi Sistemi Yönlendirme Kullanıcı Deneyimi
Yetkilendirme kodu modeli, platformunuz tarafından barındırılan uç noktaya kullanıcı başına yetkilendirme kodu göndermek için pop-up ve yönlendirme kullanıcı deneyimi modlarını destekler. Yönlendirme kullanıcı deneyimi modu burada gösterilir:
<!DOCTYPE html>
<html>
<head>
<script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
</head>
<body>
<script>
var client;
function initClient() {
client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly \
https://www.googleapis.com/auth/photoslibrary.readonly',
ux_mode: 'redirect',
redirect_uri: 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URI'
});
}
// Request an access token
function getAuthCode() {
// Request authorization code and obtain user consent
client.requestCode();
}
</script>
<button onclick="getAuthCode();">Load Your Calendar</button>
</body>
</html>
JavaScript kitaplıkları
Google Kimlik Hizmetleri, birden fazla farklı kitaplık ve modülde bulunan özellikleri ve işlevleri birleştirip değiştiren, kullanıcı kimlik doğrulaması ve yetkilendirme için kullanılan tek bir JavaScript kitaplığıdır:
Kimlik Hizmetleri'ne taşıma sırasında yapılması gerekenler:
Mevcut JS kitaplığı | Yeni JS kitaplığı | Notlar |
---|---|---|
apis.google.com/js/api.js |
accounts.google.com/gsi/client |
Yeni kitaplık ekleyin ve dolaylı akışı izleyin. |
apis.google.com/js/client.js |
accounts.google.com/gsi/client |
Yeni kitaplık ve yetkilendirme kodu akışını ekleyin. |
Kitaplık hızlı başvuru
Eski Google ile Oturum Açma JavaScript istemcisi kitaplığı ile Yeni Google Kimlik Hizmetleri kitaplığı ile Notlar arasında ek bilgiler ve taşıma sırasında gerçekleştirilecek işlemleri içeren nesne ve yöntem karşılaştırması.
Önceki | Yeni | Notlar |
---|---|---|
GoogleAuth nesnesi ve ilişkili yöntemler: | ||
GoogleAuth.attachClickHandler() | Kaldır | |
GoogleAuth.currentUser.get() | Kaldır | |
GoogleAuth.currentUser.listen() | Kaldır | |
GoogleAuth.disconnect() | google.accounts.oauth2.revoke | Eskiyi yenisiyle değiştir. İptal işlemi https://myaccount.google.com/permissions adresinden de yapılabilir. |
GoogleAuth.grantÇevrimdışıAccess() | Kaldırıp yetkilendirme kodu akışını izleyin. | |
GoogleAuth.isSignIn.get() | Kaldır | |
GoogleAuth.isSignIn.listen() | Kaldır | |
GoogleAuth.signIn() | Kaldır | |
GoogleAuth.signOut() | Kaldır | |
GoogleAuth.then() | Kaldır | |
GoogleUser nesnesi ve ilişkili yöntemler: | ||
GoogleKullanıcısı.disconnect() | google.accounts.id.revoke | Eskiyi yenisiyle değiştir. İptal işlemi https://myaccount.google.com/permissions adresinden de yapılabilir. |
GoogleUser.getAuthResponse() | requestCode() veya requestAccessToken() | Eskileri yenisiyle değiştir |
GoogleUser.getBasicProfile() | Kaldır. Bunun yerine Kimlik Jetonu kullanın. Google ile Oturum Açma özelliğinden taşıma başlıklı makaleyi inceleyin. | |
GoogleUser.getGrantedScopes() | hasGrantedAnyScope() | Eskileri yenisiyle değiştir |
GoogleUser.getBarındırılanAlan() | Kaldır | |
GoogleKullanıcısı.getId() | Kaldır | |
GoogleUser.grantÇevrimdışıAccess() | Kaldırıp yetkilendirme kodu akışını izleyin. | |
GoogleKullanıcısı.grant() | Kaldır | |
GoogleUser.hasGrantedScopes() | hasGrantedAnyScope() | Eskileri yenisiyle değiştir |
GoogleKullanıcısı.issignIn() | Kaldır | |
GoogleUser.reloadAuthResponse() | requestAccessToken() | Süresi dolmuş veya iptal edilmiş erişim jetonunu değiştirmek için eski ve yeniyi çağırın. |
gapi.auth2 nesnesi ve ilişkili yöntemler: | ||
gapi.auth2.AuthorizeConfig nesnesi | TokenClientConfig veya CodeClientConfig | Eskileri yenisiyle değiştir |
gapi.auth2.AuthorizeResponse nesnesi | Kaldır | |
gapi.auth2.AuthResponse nesnesi | Kaldır | |
gapi.auth2.authorized() | requestCode() veya requestAccessToken() | Eskileri yenisiyle değiştir |
gapi.auth2.ClientConfig() | TokenClientConfig veya CodeClientConfig | Eskileri yenisiyle değiştir |
gapi.auth2.getAuthInstance() | Kaldır | |
gapi.auth2.init() | initTokenClient() veya initCodeClient() | Eskileri yenisiyle değiştir |
gapi.auth2.offlineAccessOptions nesnesi | Kaldır | |
gapi.auth2.SignInOptions nesnesi | Kaldır | |
gapi.signin2 nesnesi ve ilişkili yöntemler: | ||
gapi.signin2.render() | Kaldır. g_id_signin öğesinin veya google.accounts.id.renderButton için JS çağrısının HTML DOM'uyla yüklenmesi, kullanıcının Google Hesabında oturum açmasını tetikler. |
Örnek kimlik bilgileri
Mevcut kimlik bilgileri
Google ile Oturum Açma platform kitaplığı, JavaScript için Google API İstemci Kitaplığı veya Google Auth 2.0 uç noktalarına doğrudan yapılan çağrılar tek yanıtta hem OAuth 2.0 erişim jetonu hem de OpenID Connect ID Token döndürür.
Hem access_token
hem de id_token
içeren örnek yanıt:
{
"token_type": "Bearer",
"access_token": "ya29.A0ARrdaM-SmArZaCIh68qXsZSzyeU-8mxhQERHrP2EXtxpUuZ-3oW8IW7a6D2J6lRnZrRj8S6-ZcIl5XVEqnqxq5fuMeDDH_6MZgQ5dgP7moY-yTiKR5kdPm-LkuPM-mOtUsylWPd1wpRmvw_AGOZ1UUCa6UD5Hg",
"scope": "https://www.googleapis.com/auth/calendar.readonly",
"login_hint": "AJDLj6I2d1RH77cgpe__DdEree1zxHjZJr4Q7yOisoumTZUmo5W2ZmVFHyAomUYzLkrluG-hqt4RnNxrPhArd5y6p8kzO0t8xIfMAe6yhztt6v2E-_Bb4Ec3GLFKikHSXNh5bI-gPrsI",
"expires_in": 3599,
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjkzNDFhYmM0MDkyYjZmYzAzOGU0MDNjOTEwMjJkZDNlNDQ1MzliNTYiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXpwIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXVkIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwic3ViIjoiMTE3NzI2NDMxNjUxOTQzNjk4NjAwIiwiaGQiOiJnb29nbGUuY29tIiwiZW1haWwiOiJkYWJyaWFuQGdvb2dsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXRfaGFzaCI6IkJBSW55TjN2MS1ZejNLQnJUMVo0ckEiLCJuYW1lIjoiQnJpYW4gRGF1Z2hlcnR5IiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hLS9BT2gxNEdnenAyTXNGRGZvbVdMX3VDemRYUWNzeVM3ZGtxTE5ybk90S0QzVXNRPXM5Ni1jIiwiZ2l2ZW5fbmFtZSI6IkJyaWFuIiwiZmFtaWx5X25hbWUiOiJEYXVnaGVydHkiLCJsb2NhbGUiOiJlbiIsImlhdCI6MTYzODk5MTYzOCwiZXhwIjoxNjM4OTk1MjM4LCJqdGkiOiI5YmRkZjE1YWFiNzE2ZDhjYmJmNDYwMmM1YWM3YzViN2VhMDQ5OTA5In0.K3EA-3Adw5HA7O8nJVCsX1HmGWxWzYk3P7ViVBb4H4BoT2-HIgxKlx1mi6jSxIUJGEekjw9MC-nL1B9Asgv1vXTMgoGaNna0UoEHYitySI23E5jaMkExkTSLtxI-ih2tJrA2ggfA9Ekj-JFiMc6MuJnwcfBTlsYWRcZOYVw3QpdTZ_VYfhUu-yERAElZCjaAyEXLtVQegRe-ymScra3r9S92TA33ylMb3WDTlfmDpWL0CDdDzby2asXYpl6GQ7SdSj64s49Yw6mdGELZn5WoJqG7Zr2KwIGXJuSxEo-wGbzxNK-mKAiABcFpYP4KHPEUgYyz3n9Vqn2Tfrgp-g65BQ",
"session_state": {
"extraQueryParams": {
"authuser": "0"
}
},
"first_issued_at": 1638991637982,
"expires_at": 1638995236982,
"idpId": "google"
}
Google Kimlik Hizmetleri kimlik bilgisi
Google Kimlik Hizmetleri kitaplığı şunları döndürür:
yetkilendirme için kullanıldığında bir erişim jetonu olabilir:
{ "access_token": "ya29.A0ARrdaM_LWSO-uckLj7IJVNSfnUityT0Xj-UCCrGxFQdxmLiWuAosnAKMVQ2Z0LLqeZdeJii3TgULp6hR_PJxnInBOl8UoUwWoqsrGQ7-swxgy97E8_hnzfhrOWyQBmH6zs0_sUCzwzhEr_FAVqf92sZZHphr0g", "token_type": "Bearer", "expires_in": 3599, "scope": "https://www.googleapis.com/auth/calendar.readonly" }
veya kimlik doğrulama için kullanıldığında bir kimlik jetonu:
{ "clientId": "538344653255-758c5h5isc45vgk27d8h8deabovpg6to.apps.googleusercontent.com", "credential": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxODkyZWI0OWQ3ZWY5YWRmOGIyZTE0YzA1Y2EwZDAzMjcxNGEyMzciLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYmYiOjE2MzkxNTcyNjQsImF1ZCI6IjUzODM0NDY1MzI1NS03NThjNWg1aXNjNDV2Z2syN2Q4aDhkZWFib3ZwZzZ0by5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInN1YiI6IjExNzcyNjQzMTY1MTk0MzY5ODYwMCIsIm5vbmNlIjoiZm9vYmFyIiwiaGQiOiJnb29nbGUuY29tIiwiZW1haWwiOiJkYWJyaWFuQGdvb2dsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXpwIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwibmFtZSI6IkJyaWFuIERhdWdoZXJ0eSIsInBpY3R1cmUiOiJodHRwczovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vYS0vQU9oMTRHZ3pwMk1zRkRmb21XTF91Q3pkWFFjc3lTN2RrcUxOcm5PdEtEM1VzUT1zOTYtYyIsImdpdmVuX25hbWUiOiJCcmlhbiIsImZhbWlseV9uYW1lIjoiRGF1Z2hlcnR5IiwiaWF0IjoxNjM5MTU3NTY0LCJleHAiOjE2MzkxNjExNjQsImp0aSI6IjRiOTVkYjAyZjU4NDczMmUxZGJkOTY2NWJiMWYzY2VhYzgyMmI0NjUifQ.Cr-AgMsLFeLurnqyGpw0hSomjOCU4S3cU669Hyi4VsbqnAV11zc_z73o6ahe9Nqc26kPVCNRGSqYrDZPfRyTnV6g1PIgc4Zvl-JBuy6O9HhClAK1HhMwh1FpgeYwXqrng1tifmuotuLQnZAiQJM73Gl-J_6s86Buo_1AIx5YAKCucYDUYYdXBIHLxrbALsA5W6pZCqqkMbqpTWteix-G5Q5T8LNsfqIu_uMBUGceqZWFJALhS9ieaDqoxhIqpx_89QAr1YlGu_UO6R6FYl0wDT-nzjyeF5tonSs3FHN0iNIiR3AMOHZu7KUwZaUdHg4eYkU-sQ01QNY_11keHROCRQ", "select_by": "user" }
Geçersiz jeton yanıtı
Süresi dolmuş, iptal edilmiş veya geçersiz bir erişim jetonu kullanarak API isteği yapmaya çalıştığınızda Google'dan gelen örnek yanıt:
HTTP Yanıt Başlıkları
www-authenticate: Bearer realm="https://accounts.google.com/", error="invalid_token"
Yanıt metni
{
"error": {
"code": 401,
"message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
"errors": [
{
"message": "Invalid Credentials",
"domain": "global",
"reason": "authError",
"location": "Authorization",
"locationType": "header"
}
],
"status": "UNAUTHENTICATED"
}
}