2025, Sep 24 05:33
gcloud ADC से लॉगिन पर Calendar events.list में 403: सही OAuth scopes कैसे चुनें
gcloud application-default login के बाद Google Calendar API events.list पर 403 मिलता है? कारण गलत OAuth scopes। calendar.events.readonly जोड़कर इसे ठीक करें.
यदि आप gcloud के जरिए Application Default Credentials के साथ प्रमाणित करते हैं और Google Calendar API के events.list को कॉल करते हैं, तो लॉगिन सफल होने और क्रेडेंशियल फ़ाइल मौजूद होने पर भी 403 मिलना आसान है। वजह टोकन फ़ाइल या calendarId नहीं है, बल्कि आपके लॉगिन पर दिए गए OAuth स्कोप और जिस API मेथड को आप बुला रहे हैं, उनके बीच असंगति है।
समस्या का संदर्भ
आप इस तरह प्रमाणित करते हैं, जहां cloud-platform और एक Calendar स्कोप पास किया जाता है:
gcloud auth application-default login --client-id-file google_oauth_client_id.json --scopes="https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/calendar.calendars.readonly"इसके बाद आप Calendar क्लाइंट बनाते हैं और events.list कॉल करते हैं, लेकिन 403 मिल जाता है। क्रेडेंशियल ऑब्जेक्ट देखने पर कोई स्कोप भरा हुआ नहीं दिखता, जिससे लगता है कि समस्या टोकन लोड होने के तरीके में है। वास्तव में दिक्कत यह है कि दिए गए स्कोप उस खास मेथड को कवर ही नहीं करते जिसे आप कॉल कर रहे हैं।
वह उदाहरण कोड जो असफल होता है
नीचे दिया गया Python स्निपेट दिखाता है कि केवल calendar.calendars.readonly दिए जाने पर 403 कैसे आता है:
from google.auth import default as adc_default
from google.auth.transport.requests import Request as HttpRequest
from googleapiclient.discovery import build as api_build
PERMS = [
    "https://www.googleapis.com/auth/calendar.calendars.readonly"
]
creds_obj, proj_id = adc_default(scopes=PERMS, quota_project_id="my-project-id")
creds_obj.refresh(HttpRequest())
user_token = creds_obj.token
cal_api = api_build("calendar", "v3", credentials=creds_obj)
items = cal_api.events().list(
    calendarId="My Calendar Id",
    maxResults=10,
    singleEvents=True,
    orderBy="startTime"
).execute()
print((creds_obj.scopes, creds_obj.default_scopes, creds_obj.granted_scopes))असल में हो क्या रहा है
जिस Calendar API मेथड को आप कॉल कर रहे हैं, वही तय करता है कि कौन‑कौन से स्कोप स्वीकार्य हैं। events.list के लिए आवश्यक स्कोप में calendar.events.readonly शामिल है। यदि आपने इसके बजाय calendar.calendars.readonly के साथ प्रमाणित किया है, तो एक्सेस टोकन के पास ईवेंट सूचीबद्ध करने की अनुमति नहीं होगी और सर्वर 403 लौटाएगा। यह इस बात से जुड़ा नहीं है कि टोकन फ़ाइल में स्कोप दर्ज हैं या नहीं; अहम बात यह है कि आपका टोकन उसी स्कोप के साथ जारी हुआ है या नहीं जो मेथड से मेल खाता है। आप tokeninfo एंडपॉइंट पर टोकन जाँचकर इसके दावों की पुष्टि कर सकते हैं:
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token={ACCESS_TOKEN}
इसे कैसे ठीक करें
लॉगिन के समय सही स्कोप माँगें। इस मामले में calendar.events.readonly जोड़ें। उदाहरण के लिए:
gcloud auth application-default login \
--scopes=\
https://www.googleapis.com/auth/cloud-platform,\
https://www.googleapis.com/auth/calendar.events.readonlyयदि आप कोड में भी मेथड के स्कोप को प्रतिबिंबित करना चाहते हैं, तो क्रेडेंशियल बनाते समय स्कोप उसी अनुसार निर्धारित करें:
from google.auth import default as adc_default
from google.auth.transport.requests import Request as HttpRequest
from googleapiclient.discovery import build as api_build
PERMS = [
    "https://www.googleapis.com/auth/calendar.events.readonly"
]
creds_obj, proj_id = adc_default(scopes=PERMS, quota_project_id="my-project-id")
creds_obj.refresh(HttpRequest())
user_token = creds_obj.token
cal_api = api_build("calendar", "v3", credentials=creds_obj)
items = cal_api.events().list(
    calendarId="My Calendar Id",
    maxResults=10,
    singleEvents=True,
    orderBy="startTime"
).execute()यह क्यों मायने रखता है
Google API प्राधिकरण को मेथड स्तर पर लागू करती हैं। एक‑जैसे दिखने वाले स्कोप (जैसे calendars.readonly बनाम events.readonly) गड़बड़ाने पर उलझाने वाली 403 त्रुटियाँ मिलती हैं, जो क्लाइंट की स्थानीय स्थिति से स्पष्ट नहीं होतीं। स्कोप को ठीक उसी API मेथड से मिलाना और tokeninfo के जरिए सक्रिय टोकन की जाँच करना समय बचाता है और नाज़ुक प्रमाणीकरण प्रवाहों से बचाता है।
मुख्य बातें
हमेशा अपने OAuth स्कोप को उन विशिष्ट API मेथड से मिलाएँ जिन्हें आप कॉल कर रहे हैं। Calendar API के events.list के लिए इसका मतलब है calendar.events.readonly। यदि आपने इसके बिना प्रमाणित किया है, तो अतिरिक्त स्कोप के साथ gcloud auth application-default login दोबारा चलाएँ, और जरूरत हो तो क्लाइंट बनाते वक्त भी वही स्कोप सेट करें। संदेह होने पर tokeninfo एंडपॉइंट से टोकन के स्कोप की पुष्टि करें और आधिकारिक API संदर्भ में उस मेथड के Authorization अनुभाग से मिला कर देखें।
यह लेख StackOverflow के प्रश्न पर आधारित है, जिसे Ian Burnette ने पूछा, और DazWilkin के उत्तर पर।