Google OAuth ताज़ा टोकन प्राप्त नहीं कर रहा है


270

मैं Google से एक्सेस टोकन प्राप्त करना चाहता हूं। Google API का कहना है कि एक्सेस टोकन प्राप्त करने के लिए, कोड और अन्य मापदंडों को टोकन जनरेटिंग पेज पर भेजें, और प्रतिक्रिया एक JSON ऑब्जेक्ट की तरह होगी:

{
"access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}

हालाँकि, मैं ताज़ा टोकन प्राप्त नहीं कर रहा हूँ। मेरे मामले में प्रतिक्रिया है:

{
 "access_token" : "ya29.sddsdsdsdsds_h9v_nF0IR7XcwDK8XFB2EbvtxmgvB-4oZ8oU",
"token_type" : "Bearer",
"expires_in" : 3600
}

मेरा भी इसी तरह का मुद्दा रहा है। यहाँ
अरथरण

जवाबों:


675

refresh_tokenकेवल उपयोगकर्ता से पहले प्राधिकरण पर प्रदान की जाती है। बाद के प्राधिकरण, जैसे कि OAuth2 एकीकरण का परीक्षण करते समय आप जिस तरह से बनाते हैं, वह refresh_tokenफिर से वापस नहीं आएगा । :)

  1. : आपके खाते तक पहुंच वाले ऐप्स दिखा पृष्ठ पर जाएं https://myaccount.google.com/u/0/permissions
  2. थर्ड-पार्टी ऐप्स मेनू के तहत, अपना ऐप चुनें।
  3. पहुंच निकालें पर क्लिक करें और फिर पुष्टि करने के लिए ओके पर क्लिक करें
  4. आपके द्वारा किया गया अगला OAuth2 अनुरोध एक लौटाएगा refresh_token(बशर्ते कि इसमें 'access_type = offline' क्वेरी पैरामीटर भी शामिल हो।

वैकल्पिक रूप से, आप क्वेरी पैरामीटर prompt=consent&access_type=offlineको OAuth रीडायरेक्ट में जोड़ सकते हैं ( वेब सर्वर एप्लिकेशन के लिए Google का OAuth 2.0 देखें) पेज के )।

यह उपयोगकर्ता को एप्लिकेशन को फिर से अधिकृत करने के लिए संकेत देगा और हमेशा ए वापस करेगा refresh_token


20
यह मेरे लिए काम नहीं करता था, लेकिन ट्राम को करने के लिए परम "एक्सेस_टाइप = ऑफलाइन" को जोड़कर देखा गया: डेवलपर्स.
Jesse

87
आप access_type=offlineसभी मामलों में जब आप चाहते हैं की जरूरत है refresh_token
दानह

5
लेकिन मैं इस मामले में इसकी समाप्ति के बाद टोकन को कैसे ताज़ा करूं?
vivek_jonam

5
@vivek_jonam ताज़ा टोकन और समाप्ति की तारीख को स्टोर करें। जब यह समाप्त हो जाता है तो आप ताज़ा टोकन का उपयोग करके नए टोकन का अनुरोध करते हैं। यहाँ देखें: Developers.google.com/accounts/docs/OAuth2WebServer#refresh
gelviis

4
मैंने इसके साथ काम किया $client->setAccessType('offline')function setApprovalPrompt()पहले से ही में पारित हो जाता है force, डिफ़ॉल्ट रूप से।
मोय

57

ताज़ा टोकन प्राप्त करने के लिए आपको दोनों को जोड़ना होगा approval_prompt=forceऔर access_type="offline" यदि आप Google द्वारा प्रदान किए गए जावा क्लाइंट का उपयोग कर रहे हैं तो यह इस तरह दिखाई देगा:

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            HTTP_TRANSPORT, JSON_FACTORY, getClientSecrets(), scopes)
            .build();

AuthorizationCodeRequestUrl authorizationUrl =
            flow.newAuthorizationUrl().setRedirectUri(callBackUrl)
                    .setApprovalPrompt("force")
                    .setAccessType("offline");

नोड में: var schemUrl = oauth2Client.generateAuthUrl ({access_type: 'offline', गुंजाइश: SCOPES, approval_prompt: 'force'});
जोरिस मैंस

2
यह अपमानजनक है कि Google ने अपने दस्तावेज़ में इसे संबोधित नहीं किया है या कम से कम php या oath2 प्रलेखन में नहीं है जिसे मैं 7 घंटे से घूर रहा हूं। क्यों दुनिया में यह उनके डॉक्स में बड़े बोल्ड पाठ में नहीं है
कॉलिन रिकल्स

धन्यवाद! यहां डॉक्स ( github.com/googlesamples/apps-script-oauth2 ) इस पैरामीटर के बारे में बहुत भ्रामक हैं। जब मैंने अनुमोदन_प्रमाण = बल जोड़ा तो मुझे अंततः एक ताज़ा टोकन मिला।
बजे एलेक्स जेविज़िक

28

मैंने एक लंबी रात की खोज की और यह चाल है:

व्यवस्थापक- sdk से संशोधित उपयोगकर्ता-example.php

$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$authUrl = $client->createAuthUrl();
echo "<a class='login' href='" . $authUrl . "'>Connect Me!</a>";

फिर आपको कोड को रीडायरेक्ट url और कोड के साथ प्रमाणित करने और ताज़ा टोकन प्राप्त करने की सुविधा मिलती है

$client()->authenticate($_GET['code']);
echo $client()->getRefreshToken();

आपको इसे अभी संग्रहित करना चाहिए;)

जब आपके अभिगम का समय बस हो जाए

$client->refreshToken($theRefreshTokenYouHadStored);

परफेक्ट @ नोर्बर्ट, यह वही था जिसकी मुझे ज़रूरत थी।
इमैनुएल

धन्यवाद! मेरे सवाल का @Norbert के लिए सटीक जवाब
वरुण तेजा-MVT

16

इससे मुझे कुछ भ्रम हो गया है इसलिए मैंने सोचा कि मैं वह साझा करूँगा जो मैं कठिन तरीके से सीखने आया हूँ:

जब आप access_type=offlineऔर approval_prompt=forceमापदंडों का उपयोग करने का अनुरोध करते हैं, तो आपको एक्सेस टोकन और ताज़ा टोकन दोनों प्राप्त करना चाहिए । पहुंच तुरंत बाद टोकन समाप्त हो जाता है और आपको इसे रीफ्रेश करना होगा।

आपने नए एक्सेस टोकन प्राप्त करने के लिए सही तरीके से अनुरोध किया और प्रतिक्रिया प्राप्त की जिसमें आपका नया एक्सेस टोकन है। मैं इस तथ्य से भी भ्रमित था कि मुझे एक नया ताज़ा टोकन नहीं मिला । हालाँकि, यह इस तरह से है क्योंकि आप एक ही ताज़ा टोकन का उपयोग बार-बार कर सकते हैं ।

मुझे लगता है कि कुछ अन्य उत्तर यह मान लेते हैं कि आप किसी कारण से अपने आप को एक नया ताज़ा टोकन प्राप्त करना चाहते थे और इस बात से निराश थे कि आप उपयोगकर्ता को फिर से अधिकृत करते हैं, लेकिन वास्तविक रूप से, आपको तब तक ताज़ा करने की आवश्यकता नहीं है जब तक आपके पास काम होगा। उपयोगकर्ता द्वारा निरस्त किया गया।


1
मेरे पास एक सीएमएस है जहां विभिन्न उपयोगकर्ता एनालिटिक्स एप से जुड़ने के लिए विभिन्न Google खातों का उपयोग करते हैं। हालाँकि, कभी-कभी कई उपयोगकर्ता एक ही कॉर्पोरेट Google खाते का उपयोग करके जुड़ सकते हैं, लेकिन प्रत्येक एक अलग Analytics खाते तक पहुंच चाहता है। केवल पहला ही ताज़ा टोकन प्राप्त करता है, जबकि अन्य सभी नहीं करते हैं और इस तरह हर घंटे को फिर से जोड़ना पड़ता है। क्या घंटे के भीतर समाप्त होने वाले सिर्फ access_token के बजाय इसके बाद के प्रमाणीकरण के लिए SAME ताज़ा टोकन प्राप्त करने का कोई तरीका नहीं है?
SsjCosty

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

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

मैंने अपने मुद्दे को यहाँ पूरी तरह समझाया है: stackoverflow.com/questions/30217524/…
SsjCosty

बल प्रयोग करते समय YouTube oAuth2 ताज़ा_टोकन दिखाया गया।
दिमित्री पॉलुस्किन

7

रिच सौटन के जवाब ने आखिरकार मेरे लिए काम किया, जब मुझे एहसास हुआ कि ऐड access_type=offlineकरना है एक प्राधिकरण कोड के लिए फ्रंट एंड क्लाइंट के अनुरोध , कि बैक एंड अनुरोध जो एक एक्सेस_टोकन के लिए उस कोड का आदान-प्रदान करता है। मैंने उनके उत्तर के लिए एक टिप्पणी और Google पर इस लिंक को टोकन ताज़ा करने के बारे में अधिक जानकारी के लिए जोड़ा है ।

PS यदि आप Satellizer का उपयोग कर रहे हैं, तो यहां बताया गया है कि AngularJS में $ odProvider.google में वह विकल्प कैसे जोड़ें


बहुत मामूली विवरण लेकिन महत्वपूर्ण एक। मुझे बचाया ! धन्यवाद :)
Dexter

@ZackMorris तो .. क्या आपका यह कहने का मतलब है कि मैं टोकन का उपयोग करके बैकएंड से रिफ्रेश_टोकन प्राप्त नहीं कर सकता?
नेवरमोर

@Nevermore आप access_token से ही एक ताज़ा नहीं कर सकते। यदि आप चाहते हैं कि आपका सर्वर रीफ़्रेश हो जाए, तो आपको पहली बार अपने डेटाबेस में रिफ्रेश_टोकन को स्टोर करना होगा। इसके अलावा अगर आप सामने के छोर पर एक ग्राहक OAuth प्रवाह कर रहे हैं, तो उपयोगकर्ताओं को अपने रिफ्रेश_टोकन को पीछे के अंत में भेजना होगा यदि वे चाहते हैं कि सर्वर उनके लिए ताज़ा करे।
ज़ैक मॉरिस

4

पाने के लिए refresh_token आपको access_type=offlineOAuth अनुरोध URL में शामिल करने की आवश्यकता है । जब कोई उपयोगकर्ता पहली बार प्रमाणित करता है तो आपको एक गैर-शून्य के refresh_tokenसाथ-साथ एक access_tokenसमय सीमा समाप्त हो जाएगी।

यदि आपके पास एक ऐसी स्थिति है जहां कोई उपयोगकर्ता आपके द्वारा पहले से ही प्रमाणित टोकन के लिए किसी खाते को फिर से प्रमाणित कर सकता है (जैसे @SsjCosty उल्लेख ऊपर), तो आपको Google से वापस जानकारी प्राप्त करनी होगी कि किस खाते के लिए टोकन है। ऐसा करने के लिए, profileअपनी स्कॉप्स में जोड़ें । OAuth2 रूबी रत्न का उपयोग करते हुए, आपका अंतिम अनुरोध कुछ इस तरह दिखाई दे सकता है:

client = OAuth2::Client.new(
  ENV["GOOGLE_CLIENT_ID"],
  ENV["GOOGLE_CLIENT_SECRET"],
  authorize_url: "https://accounts.google.com/o/oauth2/auth",
  token_url: "https://accounts.google.com/o/oauth2/token"
)

# Configure authorization url
client.authorize_url(
  scope: "https://www.googleapis.com/auth/analytics.readonly profile",
  redirect_uri: callback_url,
  access_type: "offline",
  prompt: "select_account"
)

ध्यान दें कि स्कोप में दो स्पेस-सीमांकित प्रविष्टियां हैं, एक Google Analytics में केवल-पढ़ने के लिए पहुंच है, और दूसरा बस है profile, जो एक OpenID कनेक्ट मानक है।

इसके परिणामस्वरूप Google id_tokenको get_tokenप्रतिक्रिया में एक अतिरिक्त विशेषता प्रदान की जाएगी । Id_token की जानकारी प्राप्त करने के लिए, Google डॉक्स में इस पृष्ठ को देखें। Google द्वारा प्रदान की गई कुछ मुट्ठी भर लाइब्रेरीएँ मान्य होंगी और यह आपके लिए "डिकोड" करेंगी (मैंने रूबी google-id-token gem का उपयोग किया था )। एक बार जब आप इसे प्राप्त कर लेते हैं, तो subपैरामीटर प्रभावी रूप से अद्वितीय Google खाता आईडी होता है।

वर्थ नोटिंग, यदि आप गुंजाइश बदलते हैं , तो आपको उन उपयोगकर्ताओं के लिए फिर से एक ताज़ा टोकन वापस मिलेगा जो पहले से ही मूल दायरे के साथ प्रमाणित कर चुके हैं। यह उपयोगी है, यदि कहते हैं, आपके पास पहले से ही उपयोगकर्ताओं का एक समूह है और वे उन सभी को Google में ऐप नहीं बनाना चाहते हैं।

ओह, और एक अंतिम नोट: आपको इसकी आवश्यकता नहीं हैprompt=select_account , लेकिन यह उपयोगी है यदि आपके पास ऐसी स्थिति है जहां आपके उपयोगकर्ता एक से अधिक Google खाते के साथ प्रमाणित करना चाहते हैं (यानी, आप साइन-इन / प्रमाणीकरण के लिए इसका उपयोग नहीं कर रहे हैं) ।


मुझे लगता है कि किसी भी व्यक्तिगत जानकारी को संग्रहीत किए बिना उपयोगकर्ताओं की पहचान करने के बारे में महत्वपूर्ण हिस्सा है। इसे इंगित करने के लिए धन्यवाद, मैंने उस बारे में Google डॉक्स पर कोई संदर्भ नहीं देखा।
डैनियलो 1515

3

1। 'रिफ्रेश_टोकन' कैसे प्राप्त करें?

समाधान: एक्सेस_टाइप = 'ऑफ़लाइन' विकल्प का उपयोग ऑर्टुरल जेनरेट करते समय किया जाना चाहिए। स्रोत: वेब सर्वर अनुप्रयोगों के लिए OAuth 2.0 का उपयोग करना

2. लेकिन 'access_type = ऑफ़लाइन' के साथ भी, मुझे 'ताज़ा_टोकन' नहीं मिल रहा है?

उपाय: कृपया ध्यान दें कि आप इसे केवल पहले अनुरोध पर प्राप्त करेंगे, इसलिए यदि आप इसे कहीं स्टोर कर रहे हैं और आपके कोड में इसे अधिलेखित करने का प्रावधान है, जब पिछले समाप्ति के बाद नया access_token मिल रहा है, तो सुनिश्चित करें कि यह मान अधिलेखित नहीं करना चाहिए।

Google प्रामाणिक दस्तावेज़ से: (यह मान = access_type)

यह मान Google प्राधिकरण सर्वर को पहली बार एक ताज़ा टोकन और एक एक्सेस टोकन वापस करने का निर्देश देता है, जो आपके आवेदन टोकन के लिए एक प्राधिकरण कोड का आदान-प्रदान करता है।

यदि आपको फिर से you रिफ्रेश_टोकन ’की आवश्यकता है, तो आपको रिच सौटन के उत्तर में लिखे गए चरणों का पालन करके अपने ऐप के लिए पहुंच को हटाने की आवश्यकता है ।


2

इसे सेट करने से हर बार ताज़ा टोकन भेजा जाएगा:

$client->setApprovalPrompt('force');

एक उदाहरण नीचे दिया गया है (php):

$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
$client->addScope("email");
$client->addScope("profile"); 
$client->setAccessType('offline');
$client->setApprovalPrompt('force');

1

मेरे लिए मैं CalendarSampleServletGoogle द्वारा प्रदान किया गया प्रयास कर रहा था । 1 घंटे के बाद access_key बार बाहर और 401 पृष्ठ पर पुनर्निर्देशित होता है। मैंने उपरोक्त सभी विकल्पों की कोशिश की, लेकिन उन्होंने काम नहीं किया। अंत में 'AbstractAuthorizationCodeServlet' के लिए स्रोत कोड की जाँच करने पर , मैं देख सकता था कि क्रेडेंशियल मौजूद होने पर पुनर्निर्देशन अक्षम कर दिया जाएगा, लेकिन आदर्श रूप से इसकी जाँच होनी चाहिए refresh token!=null। मैंने नीचे दिए गए कोड को जोड़ा CalendarSampleServletऔर इसके बाद काम किया। इतने घंटों की हताशा के बाद बड़ी राहत। भगवान का शुक्र है।

if (credential.getRefreshToken() == null) {
    AuthorizationCodeRequestUrl authorizationUrl = authFlow.newAuthorizationUrl();
    authorizationUrl.setRedirectUri(getRedirectUri(req));
    onAuthorization(req, resp, authorizationUrl);
    credential = null;
}

0

अब google ने मेरे अनुरोध में उन मापदंडों को अस्वीकार कर दिया था (एक्सेस_टाइप, प्रॉम्प्ट) ... :(

अद्यतन: मुझे यहाँ जवाब मिला: D आप एक अनुरोध द्वारा ताज़ा टोकन वापस पा सकते हैं https://developers.google.com/identity/protocols/OAuth2WebServer

कर्ल-एच "सामग्री-प्रकार: अनुप्रयोग / x-www-form-urlencoded" \ https://accounts.google.com/o/oauth2/revoke?token= {टोकन}

टोकन एक एक्सेस टोकन या एक ताज़ा टोकन हो सकता है। यदि टोकन एक एक्सेस टोकन है और इसमें संबंधित ताज़ा टोकन है, तो ताज़ा टोकन भी निरस्त कर दिया जाएगा।

यदि निरसन को सफलतापूर्वक संसाधित किया जाता है, तो प्रतिक्रिया की स्थिति कोड 200 है। त्रुटि स्थितियों के लिए, एक त्रुटि कोड के साथ एक स्थिति कोड 400 वापस आ जाता है।


0
    #!/usr/bin/env perl

    use strict;
    use warnings;
    use 5.010_000;
    use utf8;
    binmode STDOUT, ":encoding(utf8)";

    use Text::CSV_XS;
    use FindBin;
    use lib $FindBin::Bin . '/../lib';
    use Net::Google::Spreadsheets::V4;

    use Net::Google::DataAPI::Auth::OAuth2;

    use lib 'lib';
    use Term::Prompt;
    use Net::Google::DataAPI::Auth::OAuth2;
    use Net::Google::Spreadsheets;
    use Data::Printer ;


    my $oauth2 = Net::Google::DataAPI::Auth::OAuth2->new(
         client_id => $ENV{CLIENT_ID},
         client_secret => $ENV{CLIENT_SECRET},
         scope => ['https://www.googleapis.com/auth/spreadsheets'],
    );
    my $url = $oauth2->authorize_url();
    # system("open '$url'");
    print "go to the following url with your browser \n" ;
    print "$url\n" ;
    my $code = prompt('x', 'paste code: ', '', '');
    my $objToken = $oauth2->get_access_token($code);

    my $refresh_token = $objToken->refresh_token() ;

    print "my refresh token is : \n" ;
    # debug p($refresh_token ) ;
    p ( $objToken ) ;


    my $gs = Net::Google::Spreadsheets::V4->new(
            client_id      => $ENV{CLIENT_ID}
         , client_secret  => $ENV{CLIENT_SECRET}
         , refresh_token  => $refresh_token
         , spreadsheet_id => '1hGNULaWpYwtnMDDPPkZT73zLGDUgv5blwJtK7hAiVIU'
    );

    my($content, $res);

    my $title = 'My foobar sheet';

    my $sheet = $gs->get_sheet(title => $title);

    # create a sheet if does not exit
    unless ($sheet) {
         ($content, $res) = $gs->request(
              POST => ':batchUpdate',
              {
                    requests => [
                         {
                              addSheet => {
                                    properties => {
                                         title => $title,
                                         index => 0,
                                    },
                              },
                         },
                    ],
              },
         );

         $sheet = $content->{replies}[0]{addSheet};
    }

    my $sheet_prop = $sheet->{properties};

    # clear all cells
    $gs->clear_sheet(sheet_id => $sheet_prop->{sheetId});

    # import data
    my @requests = ();
    my $idx = 0;

    my @rows = (
         [qw(name age favorite)], # header
         [qw(tarou 31 curry)],
         [qw(jirou 18 gyoza)],
         [qw(saburou 27 ramen)],
    );

    for my $row (@rows) {
         push @requests, {
              pasteData => {
                    coordinate => {
                         sheetId     => $sheet_prop->{sheetId},
                         rowIndex    => $idx++,
                         columnIndex => 0,
                    },
                    data => $gs->to_csv(@$row),
                    type => 'PASTE_NORMAL',
                    delimiter => ',',
              },
         };
    }

    # format a header row
    push @requests, {
         repeatCell => {
              range => {
                    sheetId       => $sheet_prop->{sheetId},
                    startRowIndex => 0,
                    endRowIndex   => 1,
              },
              cell => {
                    userEnteredFormat => {
                         backgroundColor => {
                              red   => 0.0,
                              green => 0.0,
                              blue  => 0.0,
                         },
                         horizontalAlignment => 'CENTER',
                         textFormat => {
                              foregroundColor => {
                                    red   => 1.0,
                                    green => 1.0,
                                    blue  => 1.0
                              },
                              bold => \1,
                         },
                    },
              },
              fields => 'userEnteredFormat(backgroundColor,textFormat,horizontalAlignment)',
         },
    };

    ($content, $res) = $gs->request(
         POST => ':batchUpdate',
         {
              requests => \@requests,
         },
    );

    exit;

    #Google Sheets API, v4

    # Scopes
    # https://www.googleapis.com/auth/drive   View and manage the files in your Google D# # i# rive
    # https://www.googleapis.com/auth/drive.file View and manage Google Drive files and folders that you have opened or created with this app
    # https://www.googleapis.com/auth/drive.readonly   View the files in your Google Drive
    # https://www.googleapis.com/auth/spreadsheets  View and manage your spreadsheets in Google Drive
    # https://www.googleapis.com/auth/spreadsheets.readonly  View your Google Spreadsheets

0

ऑफ़लाइन पहुँच और संकेत का उपयोग करना : सहमति ने मेरे लिए अच्छा काम किया:

   auth2 = gapi.auth2.init({
                    client_id: '{cliend_id}' 
   });

   auth2.grantOfflineAccess({prompt:'consent'}).then(signInCallback); 

0

मेरा समाधान थोड़ा अजीब था..मैंने हर समाधान की कोशिश की जो मुझे इंटरनेट पर मिला और कुछ भी नहीं। आश्चर्यजनक रूप से यह काम किया: क्रेडेंशियल्स को हटाएं, फिर से अपने ऐप को अपने खाते में फिर से जमा करें। नई क्रेडेंशियलजोन फ़ाइल में ताज़ा टोकन होगा। इस फ़ाइल को कहीं पर बैकअप करें। तब तक अपने ऐप का उपयोग करते रहें जब तक कि ताज़ा टोकन त्रुटि दोबारा न आए। अब केवल एक त्रुटि संदेश के साथ crendetials.json फ़ाइल को हटाएं (यह मेरे मामले में hapenned) है, तो आप फ़ोल्डर में पुरानी क्रेडेंशियल फ़ाइल को चिपकाएँ, यह किया गया! इसके 1 सप्ताह हो गए हैं क्योंकि ive ने यह किया है और कोई अधिक समस्या नहीं थी।


0

प्रमाणीकरण पर प्रत्येक बार नया रिफ्रेश_टोकन प्राप्त करने के लिए डैशबोर्ड में निर्मित OAuth 2.0 क्रेडेंशियल का प्रकार "अन्य" होना चाहिए। साथ ही जैसा कि access_type = 'ऑफ़लाइन' विकल्प के ऊपर उल्लिखित है, को ऑर्टुरल बनाते समय इस्तेमाल किया जाना चाहिए।

"वेब एप्लिकेशन" प्रकार के साथ क्रेडेंशियल्स का उपयोग करते समय प्रॉम्प्ट / अनुमोदन_प्रोम्पट चर का कोई संयोजन काम नहीं करेगा - आपको अभी भी रिफ्रेश_टोकन केवल पहले अनुरोध पर मिलेगा।

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