अमान्य_grant Google से oAuth टोकन प्राप्त करने का प्रयास कर रहा है


120

मुझे invalid_grantउनके कॉन्टैक्ट्स एपी से कनेक्ट करने के लिए Google से एक ऊह टोकन प्राप्त करने की कोशिश करने में त्रुटि हो रही है । सभी जानकारी सही है और मैंने इस तरह की स्टंप की जाँच की है।

क्या किसी को पता है कि इस मुद्दे का क्या कारण हो सकता है? मैंने इसके लिए एक अलग क्लाइंट आईडी स्थापित करने की कोशिश की है, लेकिन मुझे एक ही परिणाम मिलता है, मैंने कई अलग-अलग तरीकों को जोड़ने की कोशिश की है जिसमें बल प्रमाणीकरण की कोशिश करना शामिल है, लेकिन फिर भी एक ही परिणाम है।


मेरे लिए समस्या Google क्रेडेंशियल पेज पर थी ... मैंने एक और बनाया ... और समस्या का समाधान किया ....
costamatrix

जवाबों:


59

मैं इस समस्या में भाग गया जब मैंने OAuth को उपयोगकर्ता को भेजते समय "ऑफ़लाइन" पहुंच का स्पष्ट रूप से अनुरोध नहीं किया था "क्या आप इस ऐप को अपना सामान छूने की अनुमति देना चाहते हैं?" पृष्ठ।

सुनिश्चित करें कि आप अपने अनुरोध में access_type = ऑफ़लाइन निर्दिष्ट करते हैं।

यहाँ विवरण: https://developers.google.com/accounts/docs/OAuth2WebServer#offline

(यह भी मुझे लगता है कि Google ने 2011 के अंत में यह प्रतिबंध जोड़ा था। यदि आपके पास पहले से पुराने टोकन हैं, तो आपको ऑफ़लाइन उपयोग को अधिकृत करने के लिए अपने उपयोगकर्ताओं को अनुमति पृष्ठ पर भेजने की आवश्यकता होगी।)


9
@ मैं सहमत हूँ। मैं सेट access_typeकरता हूं offline, यह त्रुटि अभी भी होती है।
स्लाइड शो 2

यह स्वीकृत उत्तर नहीं होना चाहिए।
किशन सोलंकी

इस डेवलपर्स के माध्यम से जाओ।
Googleandroid

70

मैं access_typeअपने अनुरोध में "ऑफ़लाइन" को निर्दिष्ट करने के बावजूद बोनकिडॉग के उत्तर के अनुसार इसी समस्या में भाग गया । लंबी कहानी छोटी मैंने पाया कि यहाँ वर्णित समाधान ने मेरे लिए काम किया:

https://groups.google.com/forum/#!topic/google-analytics-data-export-api/4uNaJtquxCs

संक्षेप में, जब आप अपने Google API के कंसोल में एक OAuth2 क्लाइंट जोड़ते हैं, तो Google आपको "क्लाइंट आईडी" और "ईमेल पता" देगा (यह मानते हुए कि आप "ग्राहक प्रकार के रूप में" वेबप "चुनें)। और Google के भ्रामक नामकरण सम्मेलनों के बावजूद, client_idजब आप उनके OAuth2 API का उपयोग करते हैं, तो आपको "ईमेल पता" को पैरामीटर के मान के रूप में भेजने की अपेक्षा करते हैं ।

यह इन दोनों URL के कॉल करने पर लागू होता है:

ध्यान दें कि पहले URL पर कॉल तब सफल होगी जब आप उसे अपने "ईमेल पते" के बजाय अपने "क्लाइंट आईडी" से कॉल करेंगे। हालाँकि, दूसरे URL से वाहक टोकन प्राप्त करने का प्रयास करते समय उस अनुरोध से लौटे कोड का उपयोग करने से काम नहीं चलेगा। इसके बजाय आपको एक 'त्रुटि 400' और एक "अमान्य_ संदेश" संदेश मिलेगा।


66
पूरी तरह से हास्यास्पद: विशेष रूप से वह हिस्सा जहां यह क्लाइंट_ड के साथ काम करता है अगर आपको शुरुआती ताज़ा टोकन मिलता है। Googles API और उनका प्रलेखन एक गड़बड़ है।
Traubenfuchs

7
मैं इस मुद्दे पर इतने घंटों से अपना सिर पीट रहा था। मैंने कभी यह उम्मीद नहीं की थी कि 'client_id' वह नहीं था जो 'client_id' क्षेत्र के लिए अपेक्षित था। सामयिक समय को छोड़कर जब आपको रिफ्रेश_टोकन मिलता है और यह काम करता है। मुझे यकीन है कि इस समय मेरे पास Google के लिए शब्द एसओ पर नहीं कहे जा सकते।
जस्टिन

6
नमस्ते वहाँ .. मुझे लगता है कि "ईमेल" पता आप लोगों के बारे में बात कर रहे हैं खोजने में असमर्थ। मेरे कंसोल में यही है -> pbs.twimg.com/media/CVVcEBWUwAAIiCy.png:large
omarojo

4
वह ईमेल एड्रेस कहां है? मैं एक ही मुद्दा रहा हूँ
Isma Haro

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

56

यद्यपि यह एक पुराना प्रश्न है, लेकिन ऐसा लगता है कि कई अभी भी इसका सामना कर रहे हैं - हमने खुद को नीचे ट्रैक करने में दिन बिताए।

OAuth2 कल्पना में, "अमान्य_grant" अमान्य / समाप्त / निरस्त टोकन (संबंधित अनुदान या ताज़ा टोकन) से संबंधित सभी त्रुटियों के लिए एक कैच-ऑल है।

हमारे लिए, समस्या दो गुना थी:

  1. उपयोगकर्ता ने सक्रिय रूप से हमारे ऐप पर पहुंच को रद्द कर दिया
    है, लेकिन यह समझ में आता है: निरस्त होने के 12 घंटे बाद, Google उनकी प्रतिक्रिया में त्रुटि संदेश भेजना बंद कर देता है : “error_description” : “Token has been revoked.”
    यह बल्कि भ्रामक है क्योंकि आप मान लेंगे कि त्रुटि संदेश हर समय है जो नहीं है मुकदमा। आप जांच सकते हैं कि क्या आपके ऐप में अभी भी एप्लिकेशन अनुमति पृष्ठ पर पहुंच है या नहीं ।

  2. उपयोगकर्ता ने अपना Google पासवर्ड रीसेट / पुनर्प्राप्त किया है
    दिसंबर 2015 में, Google ने अपना डिफ़ॉल्ट व्यवहार बदल दिया , ताकि गैर-Google Apps उपयोगकर्ताओं के लिए पासवर्ड रीसेट स्वचालित रूप से सभी उपयोगकर्ता के ऐप्स ताज़ा टोकन को रद्द कर दे। निरस्तीकरण पर, त्रुटि संदेश पहले के मामले के समान नियम का पालन करता है, इसलिए आपको केवल पहले 12 घंटों में "error_description" मिलेगा। यह जानने का कोई तरीका प्रतीत नहीं होता है कि उपयोगकर्ता मैन्युअल रूप से एक्सेस (जानबूझकर) निरस्त करता है या यह पासवर्ड रीसेट (साइड-इफेक्ट) के कारण हुआ है।

उन के अलावा, अन्य संभावित कारणों का एक असंख्य है जो त्रुटि को ट्रिगर कर सकता है:

  1. सर्वर घड़ी / समय सिंक से बाहर है
  2. ऑफ़लाइन पहुँच के लिए अधिकृत नहीं है
  3. Google द्वारा थ्रॉटल किया गया
  4. एक्सपायर्ड ताज़ा टोकन का उपयोग करना
  5. उपयोगकर्ता 6 महीने से निष्क्रिय है
  6. क्लाइंट आईडी के बजाय सेवा कार्यकर्ता ईमेल का उपयोग करें
  7. बहुत कम समय में बहुत पहुँच टोकन
  8. क्लाइंट SDK पुराना हो सकता है
  9. गलत / अपूर्ण ताज़ा टोकन

मैंने अपराधी को खोजने में मदद करने के लिए कुछ डिबगिंग मार्गदर्शन के साथ प्रत्येक आइटम को संक्षिप्त करते हुए एक छोटा लेख लिखा है । आशा करता हूँ की ये काम करेगा।


1
एक अन्य परिदृश्य यह है कि यदि आप कई बार टोकन प्राप्त करने का प्रयास करते हैं तो समान कोड बनाते हैं।
ज्ञातव्य

यह वास्तव में मेरी समस्या थी, बस दुर्घटना से ऐप को रद्द करना। फिर एक और प्राधिकरण कोड जनरेट करने के लिए टर्मिनल के माध्यम से रिफ्रेशटॉकेन.php को रीयर करना था और फिर इस क्लायंटआईडी के लिए रिफ्रेशटोकन को हर जगह बदल दिया।
रॉबर्ट सिंक्लेयर

7

मैंने उसी समस्या का सामना किया। मेरे लिए, मैंने क्लाइंट एड्रेस के लिए क्लाइंट आईडी के बजाय ईमेल एड्रेस (स्ट्रिंग जो कि समाप्त होता है ... @ developer.gserviceaccount.com) का उपयोग करके इसे ठीक किया। Google द्वारा निर्धारित नामकरण यहां भ्रमित कर रहा है।


6
यह एक ही उत्तर एक वर्ष से भी अधिक पहले दिया गया है
ब्रायन ऐश

3

मेरा मुद्दा यह था कि मैंने इस URL का उपयोग किया था:

https://accounts.google.com/o/oauth2/token

जब मुझे इस URL का उपयोग करना चाहिए था:

https://www.googleapis.com/oauth2/v4/token

यह एक सेवा खाते का परीक्षण कर रहा था जो भंडारण इंजन में ऑफ़लाइन पहुंच चाहता था ।


2

मेरे पास एक ही त्रुटि संदेश ' अमान्य_ग्रांट' था और यह इसलिए था क्योंकि ग्राहक की ओर से जावास्क्रिप्ट ['कोड'] भेजना सर्वर पर सही ढंग से नहीं मिला था।

यह सही है और खाली स्ट्रिंग नहीं है यह देखने के लिए सर्वर से इसे वापस आउटपुट करने का प्रयास करें।


1

यदि आप मुंशी पुस्तकालय का उपयोग कर रहे हैं, तो बस ऑफ़लाइन मोड सेट करें, जैसे कि बोनडायड ने सुझाव दिया है कि यह कोड है:

OAuthService service = new ServiceBuilder().provider(Google2Api.class).apiKey(clientId).apiSecret(apiSecret)
                .callback(callbackUrl).scope(SCOPE).offline(true)
                .build();

https://github.com/codolutions/scribe-java/


1

Android clientId (no client_secret) का उपयोग करके मुझे निम्नलिखित त्रुटि प्रतिक्रिया मिल रही थी:

{
 "error": "invalid_grant",
 "error_description": "Missing code verifier."
}

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

मैं अपने एंड्रॉइड क्लाइंट में प्राधिकरण अनुरोध के लिए AppAuth का उपयोग कर रहा हूं जिसमें एक setCodeVerifier()फ़ंक्शन है।

AuthorizationRequest authRequest = new AuthorizationRequest.Builder(
                                    serviceConfiguration,
                                    provider.getClientId(),
                                    ResponseTypeValues.CODE,
                                    provider.getRedirectUri()
                            )
                            .setScope(provider.getScope())
                            .setCodeVerifier(null)
                            .build();

यहाँ नोड में एक उदाहरण टोकन अनुरोध है:

request.post(
  'https://www.googleapis.com/oauth2/v4/token',
  { form: {
    'code': '4/xxxxxxxxxxxxxxxxxxxx',
    'code_verifier': null,
    'client_id': 'xxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
    'client_secret': null,
    'redirect_uri': 'com.domain.app:/oauth2redirect',
    'grant_type': 'authorization_code'
  } },
  function (error, response, body) {
    if (!error && response.statusCode == 200) {
      console.log('Success!');
    } else {
      console.log(response.statusCode + ' ' + error);
    }

    console.log(body);
  }
);

मैंने परीक्षण किया और यह दोनों के साथ काम करता है https://www.googleapis.com/oauth2/v4/tokenऔर https://accounts.google.com/o/oauth2/token

यदि आप GoogleAuthorizationCodeTokenRequestइसके बजाय उपयोग कर रहे हैं :

final GoogleAuthorizationCodeTokenRequest req = new GoogleAuthorizationCodeTokenRequest(
                    TRANSPORT,
                    JSON_FACTORY,
                    getClientId(),
                    getClientSecret(),
                    code,
                    redirectUrl
);
req.set("code_verifier", null);          
GoogleTokenResponse response = req.execute();

1

यह एक मूर्खतापूर्ण जवाब है, लेकिन मेरे लिए समस्या यह थी कि मैं महसूस करने में विफल रहा कि मुझे पहले से ही अपने Google उपयोगकर्ता के लिए एक सक्रिय oAuth टोकन जारी किया गया था जिसे मैं स्टोर करने में विफल रहा था। इस मामले में समाधान एपीआई कंसोल पर जाना और क्लाइंट रहस्य को रीसेट करना है।

SO पर इस आशय के कई अन्य उत्तर हैं उदाहरण के लिए Reset Client Secret OAuth2 - क्या ग्राहकों को पुनः अनुदान की आवश्यकता है?


1

आपको बासी / अमान्य OAuth प्रतिक्रिया को निकालना पड़ सकता है।

क्रेडिट: node.js google oauth2 नमूना ने अमान्य_ग्रांट काम करना बंद कर दिया

नोट : यदि प्रारंभिक प्राधिकरण में उपयोग किया गया पासवर्ड बदल दिया गया है तो एक OAuth प्रतिक्रिया भी अमान्य हो जाएगी।

यदि एक बाश वातावरण में, आप बासी प्रतिक्रिया को हटाने के लिए निम्नलिखित का उपयोग कर सकते हैं:

rm /Users/<username>/.credentials/<authorization.json>


1

अमान्य_ग्रन्थ त्रुटि के दो प्रमुख कारण हैं जिन्हें आपको टोकन और एक्सेस टोकन के लिए POST अनुरोध से पहले ध्यान रखना है।

  1. अनुरोध शीर्षलेख में "सामग्री-प्रकार: अनुप्रयोग / x-www-form-urlencoded" होना चाहिए
  2. आपका अनुरोध पेलोड url एनकोडेड फॉर्म डेटा होना चाहिए, जोसन ऑब्जेक्ट के रूप में न भेजें।

RFC 6749 OAuth 2.0 ने अमान्य_ grant को इस रूप में परिभाषित किया: प्रदान किया गया प्राधिकरण अनुदान (जैसे, प्राधिकरण कोड, संसाधन स्वामी क्रेडेंशियल) या ताज़ा टोकन अमान्य, समाप्त, निरस्त किया गया है, प्राधिकरण अनुरोध में उपयोग किए गए पुनर्निर्देशन URI से मेल नहीं खाता है, या किसी अन्य क्लाइंट को जारी किया गया था ।

मुझे एक और अच्छा लेख मिला, यहां आपको इस त्रुटि के कई अन्य कारण मिलेंगे।

https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35


क्या आपके पास दो लगभग समान उत्तरों को पोस्ट करने का मतलब है? आप इसे हटाना चाहते हैं क्योंकि दूसरे में एक अतिरिक्त लाइन है।
ब्लास्टफर्नस

0

इस साइट में कंसोल .developers.google.com

यह कंसोल बोर्ड आपके प्रोजेक्ट इनपुट को शपथ यूआरएल का चयन करता है। oauth कॉलबैक url, oauth सफलता के बाद पुनर्निर्देशित हो जाएगा


0

यहां अन्य सभी तरीकों पर विचार करने और प्रयास करने के बाद, यहां मैंने googleapisमॉड्यूल के साथ संयोजन के साथ नोडज में समस्या को हल किया है request, जो मैंने प्रदान की getToken()विधि के बजाय टोकन प्राप्त करने के लिए इस्तेमाल किया :

const request = require('request');

//SETUP GOOGLE AUTH
var google = require('googleapis');
const oAuthConfigs = rootRequire('config/oAuthConfig')
const googleOAuthConfigs = oAuthConfigs.google

//for google OAuth: https://github.com/google/google-api-nodejs-client
var OAuth2 = google.auth.OAuth2;
var googleOAuth2Client = new OAuth2(
    process.env.GOOGLE_OAUTH_CLIENT_ID || googleOAuthConfigs.clientId, 
    process.env.GOOGLE_OAUTH_CLIENT_SECRET || googleOAuthConfigs.clientSecret, 
    process.env.GOOGLE_OAUTH_CLIENT_REDIRECT_URL || googleOAuthConfigs.callbackUrl);

/* generate a url that asks permissions for Google+ and Google Calendar scopes
https://developers.google.com/identity/protocols/googlescopes#monitoringv3*/
var googleOAuth2ClientScopes = [
    'https://www.googleapis.com/auth/plus.me',
    'https://www.googleapis.com/auth/userinfo.email'
];

var googleOAuth2ClientRedirectURL = process.env.GOOGLE_OAUTH_CLIENT_REDIRECT_URL || googleOAuthConfigs.callbackUrl; 

var googleOAuth2ClientAuthUrl = googleOAuth2Client.generateAuthUrl({
  access_type: 'offline', // 'online' (default) or 'offline' (gets refresh_token)
  scope: googleOAuth2ClientScopes // If you only need one scope you can pass it as string
});

//AFTER SETUP, THE FOLLOWING IS FOR OBTAINING TOKENS FROM THE AUTHCODE


        const ci = process.env.GOOGLE_OAUTH_CLIENT_ID || googleOAuthConfigs.clientId
        const cs = process.env.GOOGLE_OAUTH_CLIENT_SECRET || googleOAuthConfigs.clientSecret
        const ru = process.env.GOOGLE_OAUTH_CLIENT_REDIRECT_URL || googleOAuthConfigs.callbackUrl
        var oauth2Client = new OAuth2(ci, cs, ru);

        var hostUrl = "https://www.googleapis.com";
        hostUrl += '/oauth2/v4/token?code=' + authCode + '&client_id=' + ci + '&client_secret=' + cs + '&redirect_uri=' + ru + '&grant_type=authorization_code',
        request.post({url: hostUrl}, function optionalCallback(err, httpResponse, data) {
            // Now tokens contains an access_token and an optional refresh_token. Save them.
            if(!err) {
                //SUCCESS! We got the tokens
                const tokens = JSON.parse(data)
                oauth2Client.setCredentials(tokens);

                //AUTHENTICATED PROCEED AS DESIRED.
                googlePlus.people.get({ userId: 'me', auth: oauth2Client }, function(err, response) {
                // handle err and response
                    if(!err) {
                        res.status(200).json(response);
                    } else {
                        console.error("/google/exchange 1", err.message);
                        handleError(res, err.message, "Failed to retrieve google person");
                    }
                });
            } else {
                console.log("/google/exchange 2", err.message);
                handleError(res, err.message, "Failed to get access tokens", err.code);
            }
        });

मैं requestयहां बताए अनुसार HTTP के माध्यम से एपीआई अनुरोध करने के लिए उपयोग करता हूं : https://developers.google.com/identity/protocols/OAuth2WebServer#offline

POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
redirect_uri=https://oauth2.example.com/code&
grant_type=authorization_code


0

भविष्य के लोगों के लिए ... मैंने कई लेख और ब्लॉग पढ़े लेकिन नीचे समाधान के साथ किस्मत थी ...

GoogleTokenResponse tokenResponse =
      new GoogleAuthorizationCodeTokenRequest(
          new NetHttpTransport(),
          JacksonFactory.getDefaultInstance(),
          "https://www.googleapis.com/oauth2/v4/token",
          clientId,
          clientSecret,
          authCode,
          "") //Redirect Url
     .setScopes(scopes)
     .setGrantType("authorization_code")
     .execute();

इस ब्लॉग में अलग-अलग मामलों को दर्शाया गया है जिसमें "अमान्य_ग्रेंट" त्रुटि आती है।

का आनंद लें!!!


0

मेरे लिए मुझे यह सुनिश्चित करना था कि redirect_uriडेवलपर कंसोल में एक के लिए एक सटीक मैच है Authorised redirect URIs, जो इसे मेरे लिए तय करता है, मैं डिबग करने में सक्षम था और यह जानता था कि वास्तव में इस से स्विच https://accounts.google.com/o/oauth2/tokenकरने के बाद क्या समस्या थी https://www.googleapis.com/oauth2/v4/token

मुझे एक उचित त्रुटि मिली:

{"error": "redirect_uri_mismatch",  "error_description": "Bad Request"}

0

Google कंसोल पर एक नई सेवा एपीआई को सक्षम करने और पहले से बने क्रेडेंशियल्स का उपयोग करने की कोशिश करने के बाद मुझे यह समस्या थी।

समस्या को ठीक करने के लिए, मुझे क्रेडेंशियल पेज पर वापस जाना होगा, क्रेडेंशियल नाम पर क्लिक करना होगा, और फिर से "सेव" पर क्लिक करना होगा । उसके बाद, मैं बस ठीक प्रमाणित कर सकता था।


0

मेरे मामले में, मुद्दा मेरे कोड में था। गलती से मैंने एक ही टोकन के साथ क्लाइंट को 2 बार शुरू करने की कोशिश की है। यदि ऊपर दिए गए उत्तरों में से कोई भी मदद नहीं करता है तो सुनिश्चित करें कि आप क्लाइंट के 2 उदाहरण उत्पन्न नहीं करते हैं।

फिक्स से पहले मेरा कोड:

def gc_service
      oauth_client = Signet::OAuth2::Client.new(client_options)
      oauth_client.code = params[:code]
      response = oauth_client.fetch_access_token!
      session[:authorization] = response
      oauth_client.update!(session[:authorization])

      gc_service = Google::Apis::CalendarV3::CalendarService.new
      gc_service.authorization = oauth_client

      gc_service
    end
primary_calendar_id = gc_service.list_calendar_lists.items.select(&:primary).first.id

gc_service.insert_acl(primary_calendar_id, acl_rule_object, send_notifications: false)

जैसे ही मैं इसे बदलूंगा (केवल एक उदाहरण का उपयोग करें):

@gc_service = gc_service
primary_calendar_id = @gc_service.list_calendar_lists.items.select(&:primary).first.id

@gc_service.insert_acl(primary_calendar_id, acl_rule_object, send_notifications: false)

इसने मेरे मुद्दों को अनुदान प्रकार के साथ तय किया।


0

मेरे लिए मेरे प्रोजेक्ट में कई क्लाइंट थे और मुझे पूरा यकीन है कि यह पूरी तरह से ठीक है, लेकिन मैंने उस प्रोजेक्ट के लिए सभी क्लाइंट को डिलीट कर दिया और एक नया निर्माण किया और सभी ने मेरे लिए काम करना शुरू कर दिया (समझ में नहीं आया कि यह WP_SMTP प्लगइन मदद करता है समर्थन मंच) मैं संदर्भ के लिए उस लिंक का पता लगाने में सक्षम नहीं हूं


0

यदि आप उपयोगकर्ता इनपुट को सैनिटाइज कर रहे हैं (उदाहरण के लिए, $_GET["code"]php में) सुनिश्चित करें कि आप गलती से कोड में कुछ नहीं बदलते हैं।

अब मैं जो रेगेक्स का उपयोग कर रहा हूं /[^A-Za-z0-9\/-]/


0

इस https://dev.to/risafj/beginner-s-guide-to-oauth-understanding-access-tokens-and-authorization-codes-2988 को देखें

पहले आपको एक access_token की आवश्यकता है:

$code = $_GET['code'];

$clientid = "xxxxxxx.apps.googleusercontent.com";
$clientsecret = "xxxxxxxxxxxxxxxxxxxxx";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.googleapis.com/oauth2/v4/token");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "client_id=".urlencode($clientid)."&client_secret=".urlencode($clientsecret)."&code=".urlencode($code)."&grant_type=authorization_code&redirect_uri=". urlencode("https://yourdomain.com"));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close ($ch);

$server_output = json_decode($server_output);
$access_token = $server_output->access_token;
$refresh_token = $server_output->refresh_token;
$expires_in = $server_output->expires_in;

एक डेटाबेस में एक्सेस टोकन और रिफ्रेश टोकन और एक्सपायर_इन को सुरक्षित करें। एक्सेस टोकन $ expires_in सेकंड के बाद समाप्त हो रहा है। निम्नलिखित अनुरोध के साथ आपको एक नया एक्सेस टोकन हथियाने की जरूरत है (और इसे डेटाबेस में सुरक्षित करें):

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.googleapis.com/oauth2/v4/token");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "client_id=".urlencode($clientid)."&client_secret=".urlencode($clientsecret)."&refresh_token=".urlencode($refresh_token)."&grant_type=refresh_token");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close ($ch);

$server_output = json_decode($server_output);
$access_token = $server_output->access_token;
$expires_in = $server_output->expires_in;

अपने Google कंसोल में अपने डोमेन में redirect_uri डोमेन को जोड़ने के लिए ध्यान रखें: टैब "OAuth 2.0-Client-ID" में https://console.cloud.google.com/apis/credentials । वहां आपको अपनी क्लाइंट-आईडी और क्लाइंट-सीक्रेट भी मिलते हैं।


0

जब आप पहली बार उपयोगकर्ता को Google प्रमाणीकरण पृष्ठ पर पुनः निर्देशित करते हैं (और एक कोड प्राप्त करते हैं) के बीच एक अनैच्छिक समयबाह्य होता है, और जब आप लौटे कोड लेते हैं और इसे टोकन url पर पोस्ट करते हैं। यह मेरे लिए वास्तविक Google प्रदत्त क्लाइंट_ड के साथ ठीक काम करता है जैसा कि "अनडायरेक्टेड ईमेल एड्रेस" के विपरीत है। मुझे बस फिर से प्रक्रिया शुरू करने की जरूरत थी।


0

यदि आप पोस्टमैन / अनिद्रा में इसका परीक्षण कर रहे हैं और केवल इसे प्राप्त करने की कोशिश कर रहे हैं, तो संकेत: सर्वर ऑर्कुट कोड (कोड पैरामीटर) केवल एक बार अच्छा है। यदि आप अनुरोध में किसी भी अन्य पैरामीटर को भरते हैं और 400 वापस पाते हैं, तो आपको एक नया सर्वर ऑर्ट कोड उपयोग करने की आवश्यकता होगी या आपको केवल एक और 400 प्राप्त करना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.