Bir Google kimlik doğrulama API erişim jetonunu nasıl doğrulayabilirim?


134

Bir Google kimlik doğrulama erişim jetonunu nasıl doğrulayabilirim?

Bir şekilde Google'ı sorgulamam ve şunu sormam gerekiyor: [erişim belirteci verildi], [example@example.com] Google hesabı için geçerli mi?

Kısa versiyon : Google Authentication Api :: OAuth Authentication for Web Applications
aracılığıyla sağlanan bir erişim jetonunun daha sonra çeşitli Google hizmetlerinden veri talep etmek için nasıl kullanılabileceği açıktır . Belirli bir erişim jetonunun belirli bir Google hesabı için geçerli olup olmadığının nasıl kontrol edileceği açık değildir. Nasıl olduğunu bilmek isterim.

Uzun sürüm :
Belirteç tabanlı kimlik doğrulama kullanan bir API geliştiriyorum. Bir belirteç, geçerli bir kullanıcı adı + parola sağlanması veya N doğrulanabilir hizmetin herhangi birinden bir üçüncü taraf belirtecinin sağlanması üzerine iade edilecektir .

Üçüncü taraf hizmetlerinden biri Google olacak ve bir kullanıcının kendi Google hesabını kullanarak hizmetim için kimlik doğrulaması yapmasına izin verecek. Bu daha sonra Yahoo hesaplarını, güvenilir OpenID sağlayıcılarını ve benzerlerini içerecek şekilde genişletilecektir.

Google tabanlı erişimin şematik örneği:

alternatif metin http://webignition.net/images/figures/auth_figure002.png

'API' varlığı tam kontrolüm altında. "Genel arayüz" varlığı, herhangi bir web veya masaüstü tabanlı uygulamadır. Bazı halka açık arayüzler benim kontrolüm altında, diğerleri olmayacak ve diğerleri hala hiç bilmeyeceğim.

Bu nedenle, 3. adımda API'ye sağlanan jetona güvenemiyorum. Bu, ilgili Google hesabı e-posta adresiyle birlikte sağlanacaktır.

Bir şekilde Google'ı sorgulamalı ve şunu sormam gerekiyor: Bu erişim jetonu example@example.com için geçerli mi?

Bu durumda, example@example.com, Google hesabının benzersiz tanımlayıcısıdır - birinin Google hesabına giriş yapmak için kullandığı e-posta adresi. Bunun bir Gmail adresi olduğu varsayılamaz - birisi Gmail hesabı olmadan da bir Google hesabına sahip olabilir.

Google dokümanları, bir erişim jetonuyla verilerin bir dizi Google hizmetinden nasıl alınabileceğini açıkça belirtir. Verilen bir erişim belirtecinin ilk etapta geçerli olup olmadığını nasıl kontrol edebileceğinizi hiçbir şey belirtmiyor gibi görünüyor.

Güncelleme Jeton, N Google hizmeti için geçerlidir. Belirli bir kullanıcının gerçekte hangi Google hizmetlerinin hangi alt kümesini kullandığını bilemeyeceğim için, bir Google hizmetine karşı bir jetonu doğrulama aracı olarak deneyemiyorum.

Ayrıca, herhangi bir Google hizmetine erişmek için Google kimlik doğrulama erişim jetonunu asla kullanmayacağım, yalnızca sözde bir Google kullanıcısının gerçekte söylediği kişi olduğunu doğrulamanın bir yolu olarak. Bunu yapmanın başka bir yolu varsa, denemekten mutluluk duyarım.


Bu soru hangi özel kimlik doğrulama hizmetiyle ilgili (OAuth, AuthSub, Yüklü Uygulamalar, ...)? Lütfen daha ayrıntılı bir bağlantı sağlayın.
Martin / Löwis

@Martin v. Löwis: 'Web Uygulamaları için OAuth Kimlik Doğrulaması' hizmeti - Sorunun başlangıcını bunu yansıtacak şekilde güncelledim. Bunu işaret ettiğiniz için teşekkürler!
Jon Cram

google anahtar doğrulamasıyla ilgili ilginç makale daha fazla bilgi sağlayabilir. groups.google.com/group/Google-Maps-API/msg/f9e3c5ad3cbda4d7
dotjoe

Yanıtlar:


138

Kullanıcı kontrolü için, erişim jetonunu accessToken olarak alın ve gönderin ve yanıtı alın

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=accessToken

tarayıcılarda adres çubuğunda da deneyebilirsiniz, java'da httppost ve response'u da kullanabilirsiniz

cevap gibi olacak

{
     "issued_to": "xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "audience": "xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "user_id": "xxxxxxxxxxxxxxxxxxxxxxx",
     "scope": "https://www.googleapis.com/auth/userinfo.profile https://gdata.youtube.com",
     "expires_in": 3340,
     "access_type": "offline"
    }

Kapsam, accessToken için verilen izindir. bu bağlantıdaki kapsam kimliklerini kontrol edebilirsiniz

Güncelleme: Aşağıdaki gibi yeni API yayını

https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123

Yanıt şu şekilde olacaktır:

 {
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile" and
 // "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

Daha fazla bilgi için https://developers.google.com/identity/sign-in/android/backend-auth


11
Google'ın oauth2 - v3 sürümünün daha yeni bir sürümü var. Buradaki örneğe bakın: developers.google.com/identity/sign-in/android/backend-auth
AlikElzin-kilaka


26

Tamam, yanıtların çoğu geçerli ancak tam olarak doğru değil. JWT'nin amacı, her seferinde kartı veren kuruluşla iletişime geçmenize gerek kalmadan belirteci doğrulayabilmenizdir. Kimliği kontrol etmeli ve jetonun imzasını, Google'ın jetonu imzalamak için kullandığı sertifikanın bilinen genel anahtarıyla doğrulamalısınız.

Bunun neden ve nasıl yapılacağını bir sonraki gönderiye görün.

http://ncona.com/2015/02/consuming-a-google-id-token-from-a-server/


3
Daha fazla oy lütfen! The idea of JWT is that you can validate the token without the need to contact the issuer everytime.
Moritz Schmitz / Hülst

Evet! ppl, yalnızca belirteç bilgisi için
google'ı ararlarsa

Bunu Google erişim belirteçleri ile yapamazsınız çünkü bunlar JWT değildir. Stackoverflow.com/questions/48623656/…
adresini

18
function authenticate_google_OAuthtoken($user_id)
{
    $access_token   = google_get_user_token($user_id); // get existing token from DB
    $redirecturl    = $Google_Permissions->redirecturl;
    $client_id      = $Google_Permissions->client_id;
    $client_secret  = $Google_Permissions->client_secret;
    $redirect_uri   = $Google_Permissions->redirect_uri;
    $max_results    = $Google_Permissions->max_results;

    $url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token='.$access_token;
    $response_contacts  =  curl_get_responce_contents($url);
    $response   =   (json_decode($response_contacts));

    if(isset($response->issued_to))
    {
        return true;
    }
    else if(isset($response->error))
    {
        return false;
    }
}

2
Bu cevap neredeyse hala geçerlidir. Ancak, Isaled_to artık ayarlanmıyor gibi görünüyor. developer.google.com/accounts/docs/…
frostymarvelous

6

Google oauth kod akışı yanıtı , ayrıca şifrelenmiş biçimde doğrulama için yararlı bilgiler içeren access_tokendöndürür id_token.

Kimlik belirteçlerini kullanışlı kılan bir şey, 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. Ancak kimlik belirtecindeki bilgileri kullanmadan veya kullanıcının kimliğini doğruladığına dair bir iddia olarak buna güvenmeden önce, onu doğrulamanız gerekir.

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

  • Kimlik jetonunun, uygun bir Google genel anahtarıyla düzgün şekilde imzalanmış bir JWT olduğunu doğrulayın.
  • Kimlik jetonundaki aud değerinin uygulamanızın istemci kimliğine eşit olduğunu doğrulayın.
  • Kimlik belirtecindeki iss değerinin accounts.google.com veya https: //accounts.google.com'a eşit olduğunu doğrulayın .
  • Kimlik belirtecinin sona erme süresinin (sona erme) geçmediğini doğrulayın.
  • İstekte bir hd parametresi ilettiyseniz, kimlik jetonunun Google Apps tarafından barındırılan alanınızla eşleşen bir hd hak talebine sahip olduğunu doğrulayın.

https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken bağlantısında, kimlik simgelerinin doğrulanması için kod örnekleri bulunur.

Ayrıca bkz . Https://security.stackexchange.com/questions/37818/why-use-openid-connect-instead-of-plain-oauth .


1

Bir şekilde Google'ı sorgulamalı ve şunu sormam gerekiyor: Bu erişim jetonu example@example.com için geçerli mi?

Hayır. Tek ihtiyacınız olan, API alanınızdan Google Hesabı Kullanıcıları için Birleşik Giriş ile standart oturum açma talebinde bulunmaktır . Ve ancak bundan sonra "kalıcı kullanıcı kimliği" ni "genel arayüzden" sahip olduğunuzla karşılaştırabilirsiniz.

Bölge değeri, istekte bulunan siteyi kullanıcıya tanıtmak için Google Birleşik Giriş sayfasında kullanılır. Ayrıca, Google tarafından döndürülen kalıcı kullanıcı kimliğinin değerini belirlemek için de kullanılır.

Yani, 'genel arayüz' ile aynı etki alanında olmanız gerekir.

Ve kullanıcının API'nizin güvenilir olduğundan emin olması gerektiğini unutmayın;) Dolayısıyla Google, kullanıcıya kimliğini kontrol etmenize izin verip vermediğini soracaktır.


1

İşte Guzzle kullanan bir örnek :

/**
 * @param string $accessToken JSON-encoded access token as returned by \Google_Client->getAccessToken() or raw access token
 * @return array|false False if token is invalid or array in the form
 * 
 * array (
 *   'issued_to' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'audience' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'scope' => 'https://www.googleapis.com/auth/calendar',
 *   'expires_in' => 3350,
 *   'access_type' => 'offline',
 * )
 */
public static function tokenInfo($accessToken) {
    if(!strlen($accessToken)) {
        return false;
    }

    if($accessToken[0] === '{') {
        $accessToken = json_decode($accessToken)->access_token;
    }

    $guzzle = new \GuzzleHttp\Client();

    try {
        $resp = $guzzle->get('https://www.googleapis.com/oauth2/v1/tokeninfo', [
            'query' => ['access_token' => $accessToken],
        ]);
    } catch(ClientException $ex) {
        return false;
    }

    return $resp->json();
}

0

Jetonunuzu kullanarak https://www.google.com/accounts/AuthSubTokenInfo için OAuth tarafından kimliği doğrulanmış bir istekte bulunmayı deneyin . Bunun yalnızca AuthSub için çalıştığı belgelenmiştir, ancak OAuth için de geçerlidir. Size belirtecin hangi kullanıcı için olduğunu söylemez, ancak size hangi hizmetler için geçerli olduğunu söyler ve belirteç geçersizse veya iptal edilmişse istek başarısız olur.


0

Jetonun anlamı OAuth Core spesifikasyonunun dışında olduğundan, kimlik doğrulama için rastgele bir OAuth erişim jetonu kullanılamaz. Tek bir kullanım veya dar bir son kullanma aralığı için tasarlanabilir veya kullanıcının vermek istemediği erişim sağlayabilir. Aynı zamanda opaktır ve onu elde eden OAuth tüketicisi, herhangi bir kullanıcı tanımlayıcı türünü hiç görmemiş olabilir.

Bir OAuth hizmet sağlayıcısı ve bir veya daha fazla tüketici, doğrulanabilir bir kimlik doğrulama jetonu sağlamak için OAuth'u kolayca kullanabilir ve bunu dışarıda yapmak için öneriler ve fikirler vardır, ancak yalnızca OAuth Çekirdeği konuşan rastgele bir hizmet sağlayıcı bunu başka bir ortak olmadan sağlayamaz. bir tüketici ile koordinasyon. Google'a özgü AuthSubTokenInfo REST yöntemi, kullanıcının tanımlayıcısıyla birlikte yakındır, ancak jetonu geçersiz kılabileceğinden veya jetonun süresi dolabileceğinden uygun değildir.

Google kimliğiniz bir OpenId tanımlayıcısıysa ve 'genel arayüzünüz' bir web uygulamasıysa veya kullanıcının tarayıcısını çağırabiliyorsa, muhtemelen Google'ın OpenID OP'sini kullanmalısınız.

OpenID, yalnızca kullanıcıyı OP'ye göndermekten ve imzalı bir onaylamayı geri almaktan oluşur. Etkileşim yalnızca RP'nin yararınadır. Bir RP'nin bir OP ile bir kullanıcının kimliğini başarıyla doğruladığını belirtmek için kullanılabilecek uzun ömürlü bir simge veya başka bir kullanıcıya özgü tutamaç yoktur.

Bir OpenID tanımlayıcısına karşı önceki bir kimlik doğrulamasını doğrulamanın bir yolu, aynı kullanıcı aracısının kullanıldığını varsayarak, yalnızca kimlik doğrulamasını yeniden gerçekleştirmektir. OP, kullanıcı etkileşimi olmadan (örneğin bir çerezi veya müşteri sertifikasını doğrulayarak) olumlu bir iddia döndürebilmelidir. OP, başka bir kullanıcı etkileşimi gerektirmekte özgürdür ve muhtemelen kimlik doğrulama talebi başka bir etki alanından geliyorsa (OP'm bana gelecekte etkileşimde bulunmadan bu belirli RP'yi yeniden doğrulama seçeneği sunar). Ve Google'ın durumunda, kullanıcının OAuth jetonunu almak için geçtiği kullanıcı arayüzü aynı oturum tanımlayıcısını kullanmayabilir, bu nedenle kullanıcının yeniden kimlik doğrulaması yapması gerekir. Ancak her durumda, kimliğinizi ortaya koyabileceksiniz.


OpenID 2.0, doğrulanabilir kimlik jetonları sağlayan OAuth tabanlı OpenID Connect lehine Google tarafından kullanımdan kaldırıldı ve devre dışı bırakıldı .
Vadzim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.