গুগল OAuth রিফ্রেশ টোকেন না পেয়ে


270

আমি গুগল থেকে অ্যাক্সেস টোকেন পেতে চাই। গুগল এপিআই বলেছে যে অ্যাক্সেস টোকেন পেতে, কোড এবং অন্যান্য পরামিতি টোকেন উত্পন্ন পৃষ্ঠাতে প্রেরণ করুন, এবং প্রতিক্রিয়াটি 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/perifications
  2. তৃতীয় পক্ষের অ্যাপ্লিকেশন মেনুতে আপনার অ্যাপ্লিকেশনটি চয়ন করুন।
  3. অ্যাক্সেস সরান ক্লিক করুন এবং তারপরে নিশ্চিত করতে ওকে ক্লিক করুন
  4. পরবর্তী আপনার OAuth2 অনুরোধটি একটি ফেরত দেবে refresh_token(এটি সরবরাহ করে যে এটিতে 'অ্যাক্সেস_ টাইপ = অফলাইন' কোয়েরি প্যারামিটার রয়েছে।

বিকল্পভাবে, আপনি prompt=consent&access_type=offlineওউথ পুনঃনির্দেশে ক্যোয়ারী প্যারামিটারগুলি যুক্ত করতে পারেন ( ওয়েব সার্ভার অ্যাপ্লিকেশন পৃষ্ঠার জন্য গুগলের OAuth 2.0 দেখুন )।

এটি ব্যবহারকারীকে পুনরায় আবেদনটি অনুমোদনের জন্য অনুরোধ জানাবে এবং সর্বদা একটি প্রদান করবে refresh_token


20
এটি আমার পক্ষে কার্যকর হয়নি, তবে "অ্যাক্সেস_ টাইপ = অফলাইন" প্যারাম যুক্ত করা কৌশলটি দেখে মনে হয়েছে: developers.google.com/accounts/docs/OAuth2WebServer#offline
জেসি

87
আপনি access_type=offlineচাইলে সব ক্ষেত্রে আপনার প্রয়োজন refresh_token
ড্যানএইচ

5
তবে এই ক্ষেত্রে টোকেনটির মেয়াদ শেষ হওয়ার পরে কীভাবে তা রিফ্রেশ করব?
বিবেক_জোনাম

5
@ বিবেক_জোনাম রিফ্রেশ টোকেন এবং সমাপ্তির তারিখ সংরক্ষণ করুন। এটির মেয়াদ শেষ হয়ে গেলে আপনি রিফ্রেশ টোকেনটি ব্যবহার করে একটি নতুন টোকেনের জন্য অনুরোধ করবেন। এখানে দেখুন: developers.google.com/accounts/docs/OAuth2WebServer#refresh
gelviis

4
আমি এটি সঙ্গে কাজ পেয়েছিলাম $client->setAccessType('offline')function setApprovalPrompt()ইতিমধ্যেই পাস করা হয়েছে force, ডিফল্ট দ্বারা।
মোয়ে

57

রিফ্রেশ টোকেন পেতে আপনাকে উভয়ই যোগ করতে হবে approval_prompt=forceএবং access_type="offline" আপনি যদি গুগলের সরবরাহিত জাভা ক্লায়েন্ট ব্যবহার করছেন তবে এটি দেখতে এরকম হবে:

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

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

নোডে: var authUrl = oauth2Client.generateAuthUrl ({অ্যাক্সেস_ টাইপ: 'অফলাইন', সুযোগ: এসকোপেস, অনুমোদন_প্রম্পট: 'বল'});
জরিস ম্যানস

2
এটা বিস্ময়কর যে গুগল তাদের ডকুমেন্টেশনে এটিকে সম্বোধন করে নি বা কমপক্ষে পিএইচপি বা শপথ 2 নথি যা আমি hours ঘন্টা ধরে ঘুরে বেড়াচ্ছি not বিশ্বে কেন তাদের দস্তাবেজগুলিতে এটি বড় সাহসী পাঠ্যে নেই
কলিন রিকেলস

ধন্যবাদ! এখানে দস্তাবেজগুলি ( github.com/googlesults/apps-script-oauth2 ) এই প্যারামিটারটি সম্পর্কে খুব বিভ্রান্তিকর। আমি যখন অনুমোদন_প্রম্পট = বল যোগ করেছি তখন অবশেষে আমি একটি রিফ্রেশ টোকন পেয়েছি।
অ্যালেক্স ঝেভজিক

28

আমি দীর্ঘ রাত অনুসন্ধান করেছি এবং এটি কৌশলটি করছে:

অ্যাডমিন- sdk থেকে ব্যবহারকারী-উদাহরণ.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
আমার একটি সিএমএস রয়েছে যেখানে বিভিন্ন ব্যবহারকারী বিশ্লেষণ এপিআইতে সংযোগ রাখতে বিভিন্ন গুগল অ্যাকাউন্ট ব্যবহার করেন। যাইহোক, কখনও কখনও বেশ কয়েকটি ব্যবহারকারী একই কর্পোরেট গুগল অ্যাকাউন্ট ব্যবহার করে সংযোগ করতে পারে তবে প্রতিটি পৃথক বিশ্লেষণ অ্যাকাউন্টে অ্যাক্সেস পেতে চায়। কেবলমাত্র প্রথমটি রিফ্রেশ টোকনটি গ্রহণ করে, অন্যরা সবাই এভাবে প্রতি ঘণ্টায় পুনরায় সংযোগ করতে হয়। ঘন্টাখানেকের মধ্যে শেষ হওয়া কেবল অ্যাক্সেস_ টোকেনের পরিবর্তে পরবর্তী প্রমাণীকরণের জন্য সেম রিফ্রেশ টোকেন পাওয়ার কোনও উপায় নেই?
এসএসজিস্টি

1
এপিআই মনে হয় ঠিক একবার রিফ্রেশ টোকেন উত্পাদন করে । টোকেনের যে কোনও "ভাগ করে নেওয়া" আপনার কোডে ঘটতে হবে। যদিও আপনাকে দুর্ঘটনাক্রমে ব্যবহারকারীদের নতুন অ্যাক্সেসের সুযোগ না দেওয়ার বিষয়ে সতর্কতা অবলম্বন করতে হবে। এটি করার একটি সহজ উপায় হ'ল অ্যাপ্লিকেশনটির নিজস্ব স্টোরেজে রিফ্রেশ টোকেন এবং সম্পর্কিত অ্যাকাউন্টগুলি ট্র্যাক রাখা (এসকিউএলিসে পৃথক 'টেবিল') রাখা উচিত। তারপরে, আপনি যখন একটি নতুন অ্যাক্সেস টোকেন পেতে চান তখন আপনি সেখান থেকে সম্ভবত এটি সাধারণ টোকেনটি পরীক্ষা করে ব্যবহার করেন। একটি নির্দিষ্ট উপায়ে প্রয়োগ করা হয়েছে, আপনার কোডটি আসলে টোকনটি কে পেয়েছে তা জানা দরকার নেই।
জেটিয়ন

1
আমি জানি না যে আমি কীভাবে সতেজ টোকেনটি সনাক্ত করতে পারি যে আমার সবেমাত্র একটি নতুন অ্যাক্সেস টোকেন যুক্ত হয়েছিল। লগইন করে এমন বিভিন্ন ব্যবহারকারী রয়েছেন এবং তাদের মধ্যে সাধারণ জিনিসটি হ'ল তারা এপিআই-র সাথে সংযোগ রাখতে একই Google অ্যাকাউন্ট (ই-মেইল) ব্যবহার করে। তবে গুগল অ্যাকাউন্টের কোনও আইডি বা ই-মেইল ফেরত পাঠায় না, এটি কেবল একটি টোকেনটি প্রেরণ করে। সুতরাং আমি কীভাবে 2 টি পৃথক সিএমএস ব্যবহারকারীকে সংযুক্ত করতে জানি না ...
এসএসজকোস্টি

: আমি সম্পূর্ণরূপে এখানে আমার সমস্যা ব্যাখ্যা stackoverflow.com/questions/30217524/...
SsjCosty

ইউটিউব oAuth2 রিফ্রেশ_ টোকেন কেবল যখন ব্যবহৃত শক্তি ব্যবহৃত হয় তা দেখানো হয়।
দিমিত্রি পোলুশকিন

7

রিচ সাটন এর উত্তর পরিশেষে, আমার জন্য কাজ পরে আমি বুঝতে পারি যে যোগ করার পদ্ধতি access_type=offlineসম্পন্ন হবে সামনে শেষ একটি অনুমোদন কোডের জন্য ক্লায়েন্টের অনুরোধ, না ফিরে শেষ অনুরোধ এক্সচেঞ্জ যে ACCESS_TOKEN কোড। রিফ্রেশ টোকেন সম্পর্কে আরও তথ্যের জন্য আমি তার উত্তরে একটি মন্তব্য এবং এই লিঙ্কটিতে গুগলে যুক্ত করেছি ।

পিএস যদি আপনি স্যাটেলাইটার ব্যবহার করে থাকেন তবে অ্যাঙ্গুলারজেএস-এ option authProvider.google এ সেই বিকল্পটি কীভাবে যুক্ত করবেন তা এখানে রয়েছে


খুব ছোটখাট বিবরণ তবে গুরুত্বপূর্ণ। আমাকে বাঁচিয়েছে! ধন্যবাদ :)
ডেক্সটার

@ জ্যাকমরিস তাই .. আপনি কি বলতে চাইছেন যে অ্যাক্সেস টোকেন ব্যবহার করে আমি ব্যাকএন্ড থেকে রিফ্রেশ_ টোকেন পেতে পারি না?
নেভারমোর

অ্যাক্সেস_ টোকেন থেকে আপনি এখনই রিফ্রেশ_ টোকেন পেতে পারবেন না। আপনি যদি চান যে আপনার সার্ভারটি রিফ্রেশগুলি পরিচালনা করতে পারে, তবে আপনাকে প্রথমবার আপনার ডাটাবেসে রিফ্রেশ_ টোকেন সংরক্ষণ করতে হবে। এছাড়াও যদি আপনি সামনের প্রান্তে ক্লায়েন্ট OAuth প্রবাহ করছেন, তবে ব্যবহারকারীরা সার্ভারটি তাদের জন্য রিফ্রেশ করতে চাইলে তাদের রিফ্রেশ_ টোকেনটি পিছনের প্রান্তে প্রেরণ করতে হবে।
জ্যাক মরিস

4

পাওয়ার জন্য refresh_tokenআপনাকে access_type=offlineOAuth অনুরোধ URL এ অন্তর্ভুক্ত করতে হবে । যখন কোনও ব্যবহারকারী প্রথমবারের জন্য প্রমাণীকরণ করবে আপনি একটি অ-শূন্য ও সেই সাথে মেয়াদ শেষ হওয়া refresh_tokenএকটি ফিরে পাবেন access_token

আপনার যদি এমন পরিস্থিতি হয় যেখানে কোনও ব্যবহারকারী কোনও অ্যাকাউন্টের পুনরায় প্রমাণীকরণ করতে পারে আপনার কাছে ইতিমধ্যে একটি প্রমাণীকরণ টোকেন রয়েছে (যেমন @ এসএসজকোস্টির উপরে উল্লিখিত রয়েছে), আপনি কোন অ্যাকাউন্টে টোকেনের জন্য তা গুগলের কাছ থেকে তথ্য ফিরে পাওয়া দরকার। এটি করতে, 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"
)

নোট করুন যে স্কোপটিতে দুটি স্পেস-ডিলিমিট এন্ট্রি রয়েছে, একটি গুগল অ্যানালিটিকসে পঠনযোগ্য অ্যাক্সেসের জন্য এবং অন্যটি হ'ল profile, যা ওপেনআইডি কানেক্ট স্ট্যান্ডার্ড।

এই Google এর ফলে নামক একটি অতিরিক্ত বৈশিষ্ট্য প্রদানের হবে id_tokenমধ্যে get_tokenপ্রতিক্রিয়া। আইডি_ টোকেনের বাইরে তথ্য পেতে, গুগল ডক্সে এই পৃষ্ঠাটি দেখুন । গুগল-সরবরাহিত কয়েকটি গ্রন্থাগার রয়েছে যা আপনার জন্য এটি "ডিকোড" বৈধ করে দেবে (আমি রুবি গুগল-আইডি-টোকেন রত্ন ব্যবহার করেছি )। আপনি একবার এটি বিশ্লেষণ করে নিলে subপ্যারামিটারটি কার্যকরভাবে অনন্য Google অ্যাকাউন্ট আইডি।

লক্ষণীয় বিষয়, আপনি যদি সুযোগটি পরিবর্তন করেন তবে আপনি ইতিমধ্যে মূল স্কোপ দিয়ে প্রমাণীকরণকারী ব্যবহারকারীদের জন্য আবার একটি রিফ্রেশ টোকেন পাবেন। এটি দরকারী যদি বলুন, আপনার কাছে ইতিমধ্যে বেশ কিছু ব্যবহারকারী রয়েছেন এবং তাদের সকলকে গুগলে অ্যাপ-আন-প্রমাণিত করতে না চান।

ওহ, এবং একটি চূড়ান্ত নোট: আপনার প্রয়োজন নেই prompt=select_account , তবে এটি দরকারী যদি আপনার কোনও পরিস্থিতি এমন হয় যেখানে আপনার ব্যবহারকারীরা একাধিক গুগল অ্যাকাউন্ট দিয়ে প্রমাণীকরণ করতে চান (যেমন, আপনি সাইন ইন / প্রমাণীকরণের জন্য এটি ব্যবহার করছেন না) ।


আমি মনে করি কোনও ব্যক্তিগত তথ্য সংরক্ষণ না করেই ব্যবহারকারীদের সনাক্তকরণের অংশটি মূল is এটি উল্লেখ করার জন্য ধন্যবাদ, আমি সে সম্পর্কে গুগল ডক্সে কোনও রেফারেন্স দেখিনি।
ড্যানিয়েলো 515

3

1. 'রিফ্রেশ_ টোকেন' কীভাবে পাবেন?

সমাধান: অ্যান্টিউআরএল তৈরি করার সময় অ্যাক্সেস_ টাইপ = 'অফলাইন' বিকল্পটি ব্যবহার করা উচিত। উত্স: ওয়েব সার্ভার অ্যাপ্লিকেশনগুলির জন্য OAuth 2.0 ব্যবহার করা

২. তবে 'অ্যাক্সেস_ টাইপ = অফলাইন' থাকা সত্ত্বেও আমি 'রিফ্রেশ_ টোকেন' পাচ্ছি না?

সমাধান: দয়া করে নোট করুন যে আপনি এটি কেবল প্রথম অনুরোধে পাবেন, সুতরাং আপনি যদি এটি কোথাও সংরক্ষণ করে থাকেন এবং পূর্ববর্তী মেয়াদ শেষ হওয়ার পরে নতুন অ্যাক্সেস_ টোকেন পাওয়ার সময় আপনার কোডে এটি ওভাররাইট করার বিধান রয়েছে, তবে এই মানটি ওভাররাইট না করার বিষয়ে নিশ্চিত হন।

গুগল অথথ ডক থেকে: (এই মান = অ্যাক্সেস_ টাইপ)

আপনার মানটি প্রথমবার টোকেনের জন্য কোনও অনুমোদনের কোডের বিনিময় করলে এই মানটি গুগল অনুমোদনের সার্ভারকে রিফ্রেশ টোকেন এবং একটি অ্যাক্সেস টোকেনকে নির্দেশ দেয়।

আপনার যদি আবার 'রিফ্রেশ_ টোকেন' দরকার হয়, তবে আপনাকে রিচ সাটনের উত্তরে লেখা পদক্ষেপগুলি অনুসরণ করে আপনার অ্যাপ্লিকেশনটির অ্যাক্সেস সরিয়ে ফেলতে হবে ।


2

এটি সেট করার ফলে রিফ্রেশ টোকেন প্রতিবার পাঠানো হবে:

$client->setApprovalPrompt('force');

নীচে একটি উদাহরণ দেওয়া হয়েছে (পিএইচপি):

$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

আমার জন্য আমি CalendarSampleServletগুগল সরবরাহের চেষ্টা করছিলাম । 1 ঘন্টা পরে অ্যাক্সেস_কি সময় শেষ হয়ে যায় এবং সেখানে 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

এখন গুগল আমার অনুরোধে এই প্যারামিটারগুলি অস্বীকার করেছিল (অ্যাক্সেস_ টাইপ, প্রম্পট) ... :( এবং কোনও "এক্সেস প্রত্যাহার করুন" বোতামটি মোটেও নেই my আমার রিফ্রেশ_ টোকেন লোল ফিরে পেয়ে আমি হতাশ

আপডেট: আমি এখানে উত্তরটি পেয়েছি: ডি আপনি একটি অনুরোধের মাধ্যমে রিফ্রেশ টোকেনটি ফিরে পেতে পারেন 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

আমার সমাধানটি কিছুটা অদ্ভুত ছিল ... আমি ইন্টারনেটে পাওয়া প্রতিটি সমাধান চেষ্টা করেছিলাম এবং কিছুই না। আশ্চর্যরূপে এটি কাজ করেছে: শংসাপত্রগুলি মুছে দিন j নতুন শংসাপত্রগুলি। জসন ফাইলটিতে রিফ্রেশ টোকন থাকবে। এই ফাইলটি কোথাও ব্যাকআপ করুন। তারপরে পুনরায় রিফ্রেশ টোকেন ত্রুটি না আসা পর্যন্ত আপনার অ্যাপ্লিকেশনটি ব্যবহার করা চালিয়ে যান। এখন কেবল একটি ত্রুটি বার্তা (এইটি আমার ক্ষেত্রে প্রযোজ্য) দিয়ে রয়েছে এমন ক্রেডিটিয়েটালস.জসন ফাইলটি মুছুন, তারপরে ফোল্ডারে আপনার পুরানো শংসাপত্র ফাইলটি পেস্ট করুন, এটি হয়ে গেছে! Ive এটি করার পরে 1 সপ্তাহ হয়ে গেছে এবং এর পরে আর কোনও সমস্যা হয়নি।


0

প্রমাণীকরণের সময় প্রতিবার নতুন রিফ্রেশ_ টোকেন পেতে ড্যাশবোর্ডে তৈরি OAuth 2.0 শংসাপত্রগুলির ধরণটি "অন্যান্য" হওয়া উচিত। উপরে যেমন উল্লিখিত হয়েছে অ্যাক্সেস_ টাইপ = 'অফলাইন' বিকল্পটি লেখক তৈরি করার সময় ব্যবহার করা উচিত।

"ওয়েব অ্যাপ্লিকেশন" টাইপের শংসাপত্রগুলি ব্যবহার করার সময় প্রম্পট / অনুমোদনের_প্রম্পট ভেরিয়েবলগুলির কোনও সংমিশ্রণ কাজ করবে না - আপনি কেবল প্রথম অনুরোধেই রিফ্রেশ_ টোকন পাবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.