टेस्टर्स के लिए OAuth 2.0 कॉन्सेप्ट्स
OAuth 2.0 (RFC 6749) किसी application को user का password देखे बिना API तक सीमित access पाने देता है। User एक भरोसेमंद server पर sign in करता है और मंज़ूर करता है कि application क्या कर सकता है; फिर application को एक access token मिलता है जिसमें सिर्फ़ वही permission होती है। RFC का अपना उदाहरण: एक printing service किसी photo-sharing site पर रखी आपकी photos पढ़ती है, वहाँ का आपका password कभी जाने बिना।
यह क्यों ज़रूरी है
OAuth के defects security defects होते हैं। जो redirect URI exact match न हो, वह codes किसी attacker तक पहुँचा सकता है; state check न हो तो जाली sign-in स्वीकार हो जाता है; जिस scope को API enforce न करे, वह read access को write access बना देता है; और कभी expire न होने वाला refresh token खोए हुए phone को signed in रखता है। RFC 9700, यानी OAuth security की मौजूदा best practice, इन attacks और उनसे बचाव का वर्णन करता है।
Tester के लिए, एक sign-in browser, client, authorization server और API, चारों से होकर गुज़रता है। Roles और messages की समझ "login काम नहीं करता" को उस exact step और error में बदल देती है जहाँ गड़बड़ हुई।
चार roles और उनके बीच का लेन-देन
RFC 6749 चार roles परिभाषित करता है: resource owner (आम तौर पर user), client (वह application जिसे access चाहिए), authorization server (user को sign in कराता है, consent माँगता है, tokens जारी करता है) और resource server (API)। Confidential client, जैसे back end वाला web app, secret सुरक्षित रख सकता है; public client, जैसे single-page या mobile app, नहीं रख सकता।
- Authorization code: कम उम्र वाला और सिर्फ़ एक बार इस्तेमाल होने वाला, browser के ज़रिए लौटता है; RFC 6749 अधिकतम 10 मिनट की सलाह देता है।
- Access token: API को भेजा जाता है, आम तौर पर Bearer token के रूप में, जैसा API authentication वाले lesson में देखा। OAuth इसका format तय नहीं करता: यह JWT भी हो सकता है और opaque string भी।
- Refresh token: optional और ज़्यादा लंबी उम्र वाला; नए access tokens के लिए सिर्फ़ authorization server को भेजा जाता है, API को कभी नहीं।
- Scope:
appointments.readजैसी permissions। Server माँगे गए से कम scope दे सकता है, और तब उसे दिया गया scope लौटाना ज़रूरी है।
आज़माएँ: OAuth टोकन डिकोडर आज़माएँ: Mock ऑथेंटिकेशन रिस्पॉन्स
Client credentials, refresh और expiry
जब कोई user शामिल न हो, जैसे रात में चलने वाला reporting job, तो confidential client, client credentials grant इस्तेमाल करता है: वह अपने ही credentials से authenticate करता है और अपनी ही permissions के लिए access token पाता है, आम तौर पर बिना refresh token के।
Access tokens कम उम्र के रखे जाते हैं, ताकि leak हुआ token थोड़ी ही देर काम आए। Expiry पर client grant_type=refresh_token भेजता है, और ऐसा scope नहीं पा सकता जिसे user ने कभी मंज़ूर नहीं किया। Public clients के लिए RFC 9700 ज़रूरी करता है कि refresh tokens sender-constrained हों (यानी cryptographically उसी client instance से बँधे हों, ताकि copy किया हुआ token अकेले बेकार रहे) या rotate हों: rotation में हर refresh एक नया refresh token लौटाता है और पुराने को invalid कर देता है।
# Basic credentials = Base64 of client_id:client_secret (example values from RFC 6749)
POST /token HTTP/1.1
Host: auth.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&scope=reports.read
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{"access_token":"2YotnFZFEjr1zCsicMWpAA","token_type":"Bearer",
"expires_in":900,"scope":"reports.read"}OpenID Connect संक्षेप में
OAuth 2.0 client को बताता है कि वह किस चीज़ तक पहुँच सकता है, यह नहीं कि user कौन है। OpenID Connect (OIDC) identity जोड़ता है: scope openid के साथ token response में एक ID token भी आता है, यानी client के लिए एक JWT जो बताता है कि किसने sign in किया। इसमें iss, sub (उस issuer पर user की id), aud (client का अपना client_id), exp और, अगर client ने भेजा हो, nonce जैसे claims होते हैं।
Client ID token को वैसे ही validate करता है जैसे JWT गाइड में बताया गया है और उसे अपने पास रखता है; API को सिर्फ़ access token जाता है।
Worked example: booking app का sign-in टेस्ट करना
एक clinic booking app public client है और PKCE व OIDC के साथ authorization code flow इस्तेमाल करता है; उसकी API को appointments की list के लिए appointments.read और booking के लिए appointments.write चाहिए। आप integration को test environment में test users और test client registration के साथ टेस्ट करते हैं, identity provider के अपने product को नहीं। Token endpoint अपनी error value JSON body में लौटाता है; API उसे WWW-Authenticate challenge में लौटाती है (RFC 6750)। ज़्यादातर conditions negative हैं:
- Sign in करें, approve करें और appointments की list देखें →
200; दिया गयाscopeवही है जो user ने approve किया। - Callback में
stateबदलें → app उसे reject करता है और कोई session नहीं बनाता। redirect_uriको किसी दूसरे host पर ले जाएँ → error page, कोई redirect नहीं।- एक code दो बार redeem करें, या गलत
code_verifierभेजें →400औरinvalid_grant। - Consent deny करें → app
error=access_deniedको साफ़ message के साथ handle करता है। - Read-only token से booking करें →
403औरinsufficient_scope। - Expired access token या ID token से API call करें →
401औरinvalid_token। - Rotation चालू होने पर पुराना refresh token दोबारा इस्तेमाल करें →
400औरinvalid_grant, और RFC 9700 के अनुसार सबसे नया refresh token भी revoke हो जाना चाहिए।
आज़माएँ: API ऑथेंटिकेशन टेस्टर आज़माएँ: JWT एक्सपायरेशन चेकर
आम गलतियाँ
- Access token को इस बात का सबूत मानना कि user कौन है। Identity validate किए गए OIDC ID token से आती है।
- सिर्फ़ browser में happy path टेस्ट करना, और token endpoint को कभी reused code, गलत verifier या बदले हुए
redirect_uriके साथ call न करना। - यह जाँचना कि API valid tokens स्वीकार करती है, पर यह नहीं कि वह expired tokens, किसी दूसरी API के लिए जारी tokens या ज़रूरी scope के बिना वाले tokens reject करती है।
- असली tokens या client secrets को tickets, chats या screenshots में redact किए बिना paste करना।
- अपने integration की बजाय किसी third-party identity provider पर बिना लिखित अनुमति के security testing करना।
QA का नज़रिया
शुरुआत design review से करें। हर client के लिए पूछें: कौन-सा grant, public या confidential, क्या PKCE enforce होता है, कौन-से redirect URIs registered हैं, किस endpoint को कौन-सा scope चाहिए, tokens कितनी देर valid रहते हैं, और क्या refresh tokens rotate होते हैं। ये जवाब आपका test basis हैं; जिस सवाल का जवाब न मिले, वह खुद एक finding है।
कई expected results code नहीं, configuration होते हैं, इसलिए developers और authorization server के administrator के साथ काम करें। client_id, grant, माँगे गए और दिए गए scopes, endpoint, status, OAuth की error value और request id record करें, और हर token व secret redact करें।
अभ्यास
PKCE pair और token response जाँचें
Test environment में booking app ने नीचे दिए PKCE pair के साथ scope=openid appointments.read माँगा और उसके नीचे वाला token response पाया। Pair verify करें, response review करें और token endpoint के लिए चार negative test conditions लिखें।
code_verifier: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
code_challenge: E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM (method S256)
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ...",
"token_type": "Bearer",
"expires_in": 900,
"refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
"scope": "openid appointments.read appointments.write profile"
}- SHA-256 जनरेटर में Base64url output के साथ
code_verifierका hash निकालें और उसेcode_challengeसे मिलाएँ। - दिए गए
scopeकी तुलना माँगे गए scope से करें। - देखें कि
openidमाँगने पर OpenID Connect response में क्या ज़रूरी करता है। - Token endpoint के लिए चार conditions लिखें, हर एक के expected status और
errorvalue के साथ।
मॉडल उत्तर दिखाएँ
Hash challenge के बराबर है, इसलिए pair valid है (यह RFC 7636, Appendix B का उदाहरण है)।
appointments.write और profile दिए गए, जबकि न वे माँगे गए थे न approve हुए थे: यह least privilege का defect है, जब तक कोई documented server policy इसे न समझाए।
openid माँगने के बावजूद id_token नहीं लौटा, इसलिए client नहीं जान सकता कि किसने sign in किया; OpenID Connect इस response में इसे ज़रूरी करता है। expires_in (15 मिनट) और Cache-Control: no-store अपेक्षा के अनुसार हैं।
हर condition में 400, invalid_grant और कोई token न मिलना अपेक्षित है: एक code दो बार redeem करना (फिर जाँचें कि पहले exchange के tokens revoke हुए, जहाँ server यह support करता हो); गलत code_verifier; authorization request से अलग redirect_uri; expired code।
अक्सर पूछे जाने वाले सवाल
क्या OAuth 2.0 एक authentication protocol है?
नहीं। OAuth 2.0 delegated authorization का framework है: यह client को API के लिए access token पाने देता है। यह तय नहीं करता कि client user की पहचान कैसे जाने। OpenID Connect यह काम ID token के ज़रिए जोड़ता है, इसीलिए sign-in features सिर्फ़ OAuth 2.0 पर नहीं, OIDC पर बनने चाहिए।
जब client के पास पहले से client secret है, तो PKCE क्यों?
Secret client को authenticate करता है, पर किसी खास authorization code को उस request से नहीं बाँधता जिससे वह बना। PKCE यह करता है, जिससे attacker चोरी किया हुआ code inject भी नहीं कर पाता। इसलिए RFC 9700 public clients के लिए PKCE अनिवार्य करता है और confidential clients के लिए भी इसकी सलाह देता है।
क्या implicit और password grants अब भी स्वीकार्य हैं?
RFC 9700 कहता है कि implicit grant इस्तेमाल नहीं किया जाना चाहिए और resource owner password credentials grant बिल्कुल इस्तेमाल नहीं किया जाना चाहिए। अगर आपका product अब भी इनमें से किसी पर निर्भर है, तो इसे risk के रूप में record करें और team से PKCE वाले authorization code grant पर migration का plan माँगें।
क्या मैं ये tests किसी public identity provider पर practice कर सकता हूँ?
सिर्फ़ उतना ही जितना वह provider developers को करने देता है, और attack जैसे या भारी volume वाले tests कभी नहीं। Negative और security tests अपने test environment में, test users और test client registration के साथ, या उन systems पर चलाएँ जिन्हें टेस्ट करने की आपके पास लिखित अनुमति है।
संदर्भ
- RFC 6749: The OAuth 2.0 Authorization FrameworkOAuth 2.0 की भूमिकाएँ, ग्रांट टाइप और टोकन एंडपॉइंट जो एक्सेस और रिफ़्रेश टोकन जारी करते हैं।
- RFC 9700: Best Current Practice for OAuth 2.0 SecurityOAuth 2.0 के लिए वर्तमान सुरक्षा मार्गदर्शन: पब्लिक क्लाइंट के लिए PKCE, सटीक रीडायरेक्ट मिलान, सेंडर-कंस्ट्रेन्ड टोकन।
- RFC 7636: Proof Key for Code Exchange by OAuth Public ClientsPKCE: code_verifier और code_challenge (S256) जो OAuth authorization code को उसे माँगने वाले client से बाँधते हैं, ताकि code interception नाकाम हो।
- OpenID Connect Core 1.0 incorporating errata set 2OAuth 2.0 के ऊपर identity layer: ID Token और उसका validation, authentication flows, standard claims और UserInfo endpoint।
Mutqan tools से अभ्यास करें
OAuth 2.0 / OpenID Connect एक्सेस और ID टोकन डिकोड करें और स्कोप, audience तथा लाइफ़टाइम समझें।
mock login/token रिस्पॉन्स बनाएँ: access token, refresh token, expiry, यूज़र प्रोफ़ाइल और OAuth2/OIDC ढाँचे।
टेक्स्ट का SHA-256 हैश बनाएँ — अखंडता जाँच और सिग्नेचर का मानक।
किसी endpoint पर Bearer, Basic, API-key और कस्टम-हेडर प्रमाणीकरण टेस्ट करें और अधिकृत बनाम अनधिकृत रिस्पॉन्स की तुलना करें।
जाँचें कि कोई JWT एक्सपायर हो चुका है, अभी वैध नहीं है, या एक्सपायरी में कितना समय बचा है।
और गहराई से
इस topic में आपकी प्रगति
प्रगति ट्रैक करने के लिए साइन इन करें
Topics पूर्ण चिह्नित करें, जहाँ छोड़ा था वहीं से जारी रखें और specialisation परीक्षाएँ खोलें।