मैं Google प्रमाणीकरण API एक्सेस टोकन को कैसे सत्यापित कर सकता हूं?


134

मैं Google प्रमाणीकरण एक्सेस टोकन को कैसे सत्यापित कर सकता हूं?

मुझे Google को किसी तरह से क्वेरी करने और पूछने की आवश्यकता है: क्या [example@example.com] Google खाते के लिए वैध है?

लघु संस्करण :
यह स्पष्ट है कि Google प्रमाणीकरण Api :: OAuth प्रमाणीकरण के माध्यम से वेब अनुप्रयोगों के लिए आपूर्ति की गई टोकन का उपयोग तब Google सेवाओं की एक श्रृंखला से डेटा का अनुरोध करने के लिए किया जा सकता है। यह स्पष्ट नहीं है कि किसी दिए गए टोकन को किसी दिए गए Google खाते के लिए मान्य है या नहीं, यह कैसे जांचें। मैं जानना चाहूंगा कि कैसे।

लंबा संस्करण :
मैं एक एपीआई विकसित कर रहा हूं जो टोकन-आधारित प्रमाणीकरण का उपयोग करता है। एक टोकन मान्य उपयोगकर्ता नाम + पासवर्ड के प्रावधान पर या किसी तीसरे पक्ष के से किसी एक से टोकन के प्रावधान पर लौटा दी जाएगी एन निरीक्षण सेवाएं।

तृतीय-पक्ष सेवाओं में से एक Google होगी, एक उपयोगकर्ता को अपने Google खाते का उपयोग करके मेरी सेवा के खिलाफ प्रमाणित करने की अनुमति होगी। यह बाद में याहू खातों, विश्वसनीय ओपनआईडी प्रदाताओं और इतने पर शामिल करने के लिए बढ़ाया जाएगा।

Google- आधारित पहुँच का योजनाबद्ध उदाहरण:

alt text http://webignition.net/images/figures/auth_figure002.png

'एपीआई' इकाई मेरे पूर्ण नियंत्रण में है। 'सार्वजनिक इंटरफ़ेस' इकाई किसी भी वेब या डेस्कटॉप-आधारित ऐप है। कुछ सार्वजनिक इंटरफेस मेरे नियंत्रण में हैं, अन्य नहीं होंगे और अन्य अभी भी मेरे बारे में कभी नहीं जान सकते हैं।

इसलिए मैं चरण 3 में एपीआई के लिए आपूर्ति की गई टोकन पर भरोसा नहीं कर सकता। यह इसी Google खाते के ईमेल पते के साथ आपूर्ति की जाएगी।

मुझे Google को किसी तरह से क्वेरी करने और पूछने की आवश्यकता है: क्या यह एक्सेस टोकन example@example.com के लिए वैध है ?

इस मामले में, example@example.com Google खाता अद्वितीय पहचानकर्ता है - वह ईमेल पता जिसे कोई व्यक्ति अपने Google खाते में लॉग इन करने के लिए उपयोग करता है। इसे Gmail पता नहीं माना जा सकता है - किसी के पास Gmail खाता न होने पर Google खाता हो सकता है।

Google प्रलेखन स्पष्ट रूप से बताता है कि कैसे, एक एक्सेस टोकन के साथ, डेटा को कई Google सेवाओं से पुनर्प्राप्त किया जा सकता है। यह बताने के लिए कुछ भी नहीं है कि यदि आप दिए गए टोकन को पहली जगह में वैध मानते हैं तो आप कैसे जांच सकते हैं।

अपडेट N Google सेवाओं के लिए टोकन मान्य है। मैं Google सेवा के विरुद्ध एक टोकन के रूप में इसे सत्यापित करने का प्रयास नहीं कर सकता क्योंकि मुझे नहीं पता होगा कि Google की सभी सेवाओं का उपसमुच्चय जो वास्तव में उपयोग करता है।

इसके अलावा, मैं किसी भी Google सेवाओं तक पहुँचने के लिए Google प्रमाणीकरण एक्सेस टोकन का उपयोग कभी नहीं करूंगा, केवल एक कथित Google उपयोगकर्ता को सत्यापित करने के साधन के रूप में जो वे कहते हैं कि वे वास्तव में हैं। अगर ऐसा करने का एक और तरीका है, तो मुझे कोशिश करने में खुशी होगी।


(OAuth, AuthSub, Installed Apps, ...) के बारे में यह विशिष्ट विशिष्ट सेवा क्या है? कृपया अधिक विस्तृत लिंक प्रदान करें।
मार्टिन वी। लोविस

@ मर्टिन वी। लोविस: 'वेब अनुप्रयोगों के लिए OAuth प्रमाणीकरण' सेवा - मैंने इसे प्रतिबिंबित करने के लिए प्रश्न की शुरुआत को अपडेट किया है। इस पर ध्यान दिलाने के लिए धन्यवाद!
जॉन क्रैम

के बारे में महत्वपूर्ण सत्यापन गूगल दे सकता है और अधिक जानकारी दिलचस्प लेख groups.google.com/group/Google-Maps-API/msg/f9e3c5ad3cbda4d7
dotjoe

जवाबों:


138

उपयोगकर्ता की जांच के लिए, बस पहुंच टोकन को एक्सेसटोकन के रूप में प्राप्त करें और इसे पोस्ट करें और प्रतिक्रिया प्राप्त करें

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

आप ब्राउज़र में एड्रेस बार में भी कोशिश कर सकते हैं, जावा में भी रिस्पॉन्स और प्रतिक्रिया का उपयोग कर सकते हैं

प्रतिक्रिया की तरह होगा

{
     "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"
    }

स्कोप एक्सेसटोकन की दी गई अनुमति है। आप में गुंजाइश आईडी की जांच कर सकते हैं इस लिंक

अद्यतन: नीचे के रूप में नई एपीआई पोस्ट

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

प्रतिक्रिया इस प्रकार होगी

 {
 // 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"
}

अधिक जानकारी के लिए, https://developers.google.com/identity/sign-in/android/backend-auth


11
Google के oauth2 - v3 के लिए एक नया संस्करण है। यहाँ उदाहरण देखें: Developers.google.com/identity/sign-in/android/backend-auth
AlikElzin-kilaka

30

आप इस समापन बिंदु का उपयोग करके Google प्रमाणीकरण पहुंच टोकन सत्यापित कर सकते हैं:

https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=<access_token>

यह Google V3 OAuth AccessToken मान्य समापन बिंदु है, आप नीचे दिए गए Google दस्तावेज़ से उल्लेख कर सकते हैं: ( OAUTH 2.0 ENDPOINTSटैब में)

https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token


बैकएंड प्रलेखन के लिए - प्रलेखन स्रोत यहां है
eton_ceb

26

ठीक है, अधिकांश उत्तर मान्य हैं लेकिन काफी सही नहीं हैं। JWT का विचार यह है कि आप जारीकर्ता से हर बार संपर्क करने की आवश्यकता के बिना टोकन को मान्य कर सकते हैं। आपको आईडी की जांच करनी चाहिए और टोकन पर हस्ताक्षर करने के लिए उपयोग किए गए प्रमाणपत्र Google की ज्ञात सार्वजनिक कुंजी के साथ टोकन के हस्ताक्षर को सत्यापित करना होगा।

अगली पोस्ट देखें कि ऐसा क्यों और कैसे करना है।

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


3
अधिक upvotes कृपया! The idea of JWT is that you can validate the token without the need to contact the issuer everytime.
मोरित्ज़ श्मिट्ज वी। हुलस्ट

हाँ! ppl ddos-ing google हैं यदि वे टोकन जानकारी के लिए सिर्फ google कहते हैं
datdinhquoc

आप Google पहुंच टोकन के साथ ऐसा नहीं कर सकते क्योंकि वे JWT नहीं हैं। चेक stackoverflow.com/questions/48623656/...
DanielJaramillo

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
यह उत्तर लगभग अभी भी मान्य है। हालांकि अभी तक सेट नहीं किया गया है। Developers.google.com/accounts/docs/…
frostymarvelous

6

एन्क्रिप्टेड रूप में सत्यापन जानकारी के लिए उपयोगी access_tokenरिटर्न के अलावा Google oauth कोड प्रवाह प्रतिक्रिया भी है id_token

एक चीज जो आईडी टोकन को उपयोगी बनाती है, वह यह है कि आप उन्हें अपने ऐप के विभिन्न घटकों के आसपास पास कर सकते हैं। ये घटक ऐप और उपयोगकर्ता को प्रमाणित करने वाले हल्के प्रमाणीकरण तंत्र के रूप में एक आईडी टोकन का उपयोग कर सकते हैं। लेकिन इससे पहले कि आप आईडी टोकन में जानकारी का उपयोग कर सकते हैं या उस पर भरोसा कर सकते हैं जो उपयोगकर्ता ने प्रमाणित किया है, आपको इसे सत्यापित करना होगा।

आईडी टोकन की वैधता के लिए कई चरणों की आवश्यकता होती है:

  • सत्यापित करें कि आईडी टोकन एक JWT है जो उचित Google सार्वजनिक कुंजी के साथ ठीक से हस्ताक्षरित है।
  • सत्यापित करें कि आईडी टोकन में ऑड का मूल्य आपके ऐप के क्लाइंट आईडी के बराबर है।
  • सत्यापित करें कि आईडी टोकन में iss का मूल्य खातों के बराबर है ।google.com या https://accounts.google.com
  • सत्यापित करें कि आईडी टोकन का समाप्ति समय (एक्सप) बीत नहीं गया है।
  • यदि आपने अनुरोध में एक HD पैरामीटर पारित किया है, तो सत्यापित करें कि आईडी टोकन में एक एचडी दावा है जो आपके Google Apps होस्ट किए गए डोमेन से मेल खाता है।

https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken लिंक में आईडी टोकन के सत्यापन के लिए कोड नमूने हैं।

Https://security.stackexchange.com/questions/37818/why-use-openid-connect-instead-of-plain-oauth भी देखें


1

मुझे Google को किसी तरह से क्वेरी करने और पूछने की आवश्यकता है: क्या यह एक्सेस टोकन example@example.com के लिए मान्य है?

नहीं, आपको Google खाता उपयोगकर्ताओं के लिए फेडरेटेड लॉगिन के साथ मानक लॉगिन का अनुरोध करना होगा अपने एपीआई डोमेन से । और उसके बाद ही आप "लगातार यूजर आईडी" की तुलना कर सकते हैं, जो आपके पास 'सार्वजनिक इंटरफ़ेस' से है।

उपयोगकर्ता को अनुरोध करने वाली साइट की पहचान करने के लिए Google Federated लॉगिन पृष्ठ पर दायरे का मान उपयोग किया जाता है। इसका उपयोग Google द्वारा लौटाए गए निरंतर उपयोगकर्ता आईडी के मूल्य को निर्धारित करने के लिए भी किया जाता है।

इसलिए आपको 'पब्लिक इंटरफेस' के समान डोमेन से होना चाहिए।

और यह मत भूलो कि उपयोगकर्ता को यह सुनिश्चित करने की आवश्यकता है कि आपके एपीआई पर भरोसा किया जा सकता है;) इसलिए Google उपयोगकर्ता से पूछेगा कि क्या यह आपको उसकी पहचान की जांच करने की अनुमति देता है।


1

यहाँ गुज़ले का उपयोग करके एक उदाहरण दिया गया है :

/**
 * @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

Https://www.google.com/accounts/AuthSubTokenInfo पर अपने टोकन का उपयोग करके OAuth- प्रमाणित अनुरोध करने का प्रयास करें । यह केवल AuthSub के लिए काम करने के लिए प्रलेखित है, लेकिन यह OAuth के लिए भी काम करता है। यह आपको नहीं बताएगा कि टोकन किस उपयोगकर्ता के लिए है, लेकिन यह आपको बताएगा कि यह किन सेवाओं के लिए मान्य है, और यदि टोकन अमान्य है या रद्द कर दिया गया है, तो अनुरोध विफल हो जाएगा।


0

प्रमाणीकरण के लिए एक मनमाना OAuth पहुँच टोकन का उपयोग नहीं किया जा सकता है, क्योंकि टोकन का अर्थ OAuth कोर कल्पना से बाहर है। यह एकल उपयोग या संकीर्ण समाप्ति विंडो के लिए अभिप्रेत हो सकता है, या यह एक्सेस प्रदान कर सकता है जो उपयोगकर्ता देना नहीं चाहता है। यह अपारदर्शी भी है, और OAuth उपभोक्ता जो इसे प्राप्त करता है उसने कभी भी किसी प्रकार के उपयोगकर्ता पहचानकर्ता को नहीं देखा होगा।

एक OAuth सेवा प्रदाता और एक या अधिक उपभोक्ता आसानी से OAuth का उपयोग कर एक सत्यापन योग्य प्रमाणीकरण टोकन प्रदान कर सकते हैं, और वहाँ ऐसा करने के लिए प्रस्ताव और विचार हैं, लेकिन केवल OAuth कोर बोलने वाला एक मनमाना सेवा प्रदाता अन्य सह के बिना यह प्रदान नहीं कर सकता है एक उपभोक्ता के साथ समन्वय। उपयोगकर्ता के पहचानकर्ता के साथ Google-विशिष्ट AuthSubTokenInfo REST पद्धति, पास है, लेकिन यह उपयुक्त नहीं है, या तो, क्योंकि यह टोकन अमान्य कर सकता है, या टोकन समाप्त हो सकता है।

यदि आपकी Google ID एक OpenId पहचानकर्ता है, और आपका 'सार्वजनिक इंटरफ़ेस' या तो एक वेब ऐप है या उपयोगकर्ता के ब्राउज़र को कॉल कर सकता है, तो आपको संभवतः Google के OpenID OP का उपयोग करना चाहिए।

OpenID में केवल ओपी को उपयोगकर्ता भेजने और एक हस्ताक्षर किए गए दावे को वापस करना शामिल है। बातचीत पूरी तरह से आरपी के लाभ के लिए है। कोई लंबे समय तक चलने वाला टोकन या अन्य उपयोगकर्ता-विशिष्ट हैंडल नहीं है जिसका उपयोग यह इंगित करने के लिए किया जा सकता है कि एक आरपी ने ओपी के साथ एक उपयोगकर्ता को सफलतापूर्वक प्रमाणित किया है।

ओपनआईडी पहचानकर्ता के खिलाफ पिछले प्रमाणीकरण को सत्यापित करने का एक तरीका सिर्फ प्रमाणीकरण फिर से करना है, यह मानते हुए कि उसी उपयोगकर्ता-एजेंट का उपयोग किया जा रहा है। ओपी को उपयोगकर्ता के इंटरैक्शन के बिना एक सकारात्मक अभिक्रिया वापस करने में सक्षम होना चाहिए (उदाहरण के लिए कुकी या क्लाइंट सर्टिफ़िकेट की पुष्टि करके)। ओपी को एक अन्य उपयोगकर्ता इंटरैक्शन की आवश्यकता होती है, और शायद अगर प्रमाणीकरण अनुरोध किसी अन्य डोमेन से आ रहा है (मेरा ओपी मुझे भविष्य में इंटर किए बिना इस विशेष आरपी को फिर से प्रमाणित करने का विकल्प देता है)। और Google के मामले में, यूआई ने टोकन प्राप्त करने के लिए जिस यूआई के माध्यम से जाना, वह एक ही सत्र पहचानकर्ता का उपयोग नहीं कर सकता है, इसलिए उपयोगकर्ता को फिर से प्रमाणित करना होगा। लेकिन किसी भी मामले में, आप पहचान दर्ज करने में सक्षम होंगे।


OpenID 2.0 को OAuth- आधारित ओपनआईडी कनेक्ट के पक्ष में Google द्वारा पुनर्व्याख्या और अक्षम किया गया था जो सत्यापन योग्य आईडी टोकन प्रदान करता है ।
वडज़िम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.