docs/hi/docs/tutorial/security/simple-oauth2.md MARKDOWN 290 lines View on github.com → Search inside
1# Password और Bearer के साथ सरल OAuth2 { #simple-oauth2-with-password-and-bearer }23अब पिछले अध्याय से आगे बढ़ते हैं और एक पूरा security flow बनाने के लिए छूटे हुए हिस्से जोड़ते हैं।45## `username` और `password` प्राप्त करें { #get-the-username-and-password }67हम `username` और `password` प्राप्त करने के लिए **FastAPI** security utilities का उपयोग करने वाले हैं।89OAuth2 निर्दिष्ट करता है कि "password flow" (जिसका हम उपयोग कर रहे हैं) का उपयोग करते समय client/user को `username` और `password` fields को form data के रूप में भेजना होगा।1011और spec कहता है कि fields के नाम ऐसे ही होने चाहिए। इसलिए `user-name` या `email` काम नहीं करेगा।1213लेकिन चिंता न करें, frontend में आप इसे अपने अंतिम users को जैसे चाहें दिखा सकते हैं।1415और आपके database models कोई भी दूसरे नाम उपयोग कर सकते हैं जो आप चाहें।1617लेकिन login *path operation* के लिए, हमें spec के साथ compatible होने के लिए इन नामों का उपयोग करना होगा (और उदाहरण के लिए, integrated API documentation system का उपयोग कर पाने के लिए)।1819Spec यह भी बताता है कि `username` और `password` को form data के रूप में भेजा जाना चाहिए (इसलिए, यहाँ कोई JSON नहीं)।2021### `scope` { #scope }2223Spec यह भी कहता है कि client एक और form field "`scope`" भेज सकता है।2425form field का नाम `scope` है (singular में), लेकिन यह वास्तव में spaces से अलग किए गए "scopes" वाली एक लंबी string होती है।2627हर "scope" बस एक string है (बिना spaces के)।2829इनका सामान्यतः विशिष्ट security permissions घोषित करने के लिए उपयोग किया जाता है, उदाहरण के लिए:3031* `users:read` या `users:write` आम उदाहरण हैं।32* `instagram_basic` Facebook / Instagram द्वारा उपयोग किया जाता है।33* `https://www.googleapis.com/auth/drive` Google द्वारा उपयोग किया जाता है।3435/// note | नोट3637OAuth2 में "scope" बस एक string है जो किसी विशिष्ट required permission को घोषित करती है।3839इससे फर्क नहीं पड़ता कि उसमें `:` जैसे अन्य characters हैं या वह URL है।4041वे details implementation specific हैं।4243OAuth2 के लिए वे बस strings हैं।4445///4647## `username` और `password` प्राप्त करने का Code { #code-to-get-the-username-and-password }4849अब इसे संभालने के लिए **FastAPI** द्वारा प्रदान की गई utilities का उपयोग करते हैं।5051### `OAuth2PasswordRequestForm` { #oauth2passwordrequestform }5253पहले, `OAuth2PasswordRequestForm` import करें, और `/token` के *path operation* में `Depends` के साथ इसे dependency के रूप में उपयोग करें:5455{* ../../docs_src/security/tutorial003_an_py310.py hl[4,78] *}5657`OAuth2PasswordRequestForm` एक class dependency है जो एक form body घोषित करती है जिसमें:5859* `username`।60* `password`।61* एक वैकल्पिक `scope` field, एक बड़ी string के रूप में, जो spaces से अलग की गई strings से बनी होती है।62* एक वैकल्पिक `grant_type`।6364/// tip | टिप6566OAuth2 spec वास्तव में fixed value `password` के साथ एक field `grant_type` *required* करता है, लेकिन `OAuth2PasswordRequestForm` इसे enforce नहीं करता।6768अगर आपको इसे enforce करना है, तो `OAuth2PasswordRequestForm` की जगह `OAuth2PasswordRequestFormStrict` का उपयोग करें।6970///7172* एक वैकल्पिक `client_id` (हमारे उदाहरण के लिए हमें इसकी आवश्यकता नहीं है)।73* एक वैकल्पिक `client_secret` (हमारे उदाहरण के लिए हमें इसकी आवश्यकता नहीं है)।7475/// note | नोट7677`OAuth2PasswordRequestForm`, **FastAPI** के लिए कोई विशेष class नहीं है जैसे `OAuth2PasswordBearer` है।7879`OAuth2PasswordBearer` **FastAPI** को बताता है कि यह एक security scheme है। इसलिए इसे OpenAPI में इस तरह जोड़ा जाता है।8081लेकिन `OAuth2PasswordRequestForm` बस एक class dependency है जिसे आप खुद भी लिख सकते थे, या आप सीधे `Form` parameters घोषित कर सकते थे।8283लेकिन क्योंकि यह एक सामान्य use case है, इसे आसान बनाने के लिए **FastAPI** द्वारा सीधे प्रदान किया गया है।8485///8687### form data का उपयोग करें { #use-the-form-data }8889/// tip | टिप9091dependency class `OAuth2PasswordRequestForm` के instance में spaces से अलग की गई लंबी string वाला attribute `scope` नहीं होगा, इसके बजाय, इसमें भेजे गए प्रत्येक scope के लिए actual strings की list वाला `scopes` attribute होगा।9293हम इस उदाहरण में `scopes` का उपयोग नहीं कर रहे हैं, लेकिन यदि आपको इसकी आवश्यकता हो तो functionality उपलब्ध है।9495///9697अब, form field से `username` का उपयोग करके (fake) database से user data प्राप्त करें।9899यदि ऐसा कोई user नहीं है, तो हम "Incorrect username or password" कहते हुए error लौटाते हैं।100101Error के लिए, हम exception `HTTPException` का उपयोग करते हैं:102103{* ../../docs_src/security/tutorial003_an_py310.py hl[3,79:81] *}104105### password जाँचें { #check-the-password }106107इस समय हमारे पास database से user data है, लेकिन हमने password नहीं जाँचा है।108109पहले उस data को Pydantic `UserInDB` model में डालते हैं।110111आपको कभी भी plaintext passwords save नहीं करने चाहिए, इसलिए, हम (fake) password hashing system का उपयोग करेंगे।112113यदि passwords match नहीं करते, तो हम वही error लौटाते हैं।114115#### Password hashing { #password-hashing }116117"Hashing" का मतलब है: कुछ content (इस मामले में password) को bytes की sequence (बस एक string) में convert करना जो बेतरतीब दिखती है।118119जब भी आप बिल्कुल वही content (बिल्कुल वही password) पास करते हैं, तो आपको बिल्कुल वही बेतरतीब string मिलती है।120121लेकिन आप उस बेतरतीब string से वापस password में convert नहीं कर सकते।122123##### Password hashing का उपयोग क्यों करें { #why-use-password-hashing }124125अगर आपका database चोरी हो जाता है, तो चोर के पास आपके users के plaintext passwords नहीं होंगे, केवल hashes होंगे।126127इसलिए, चोर उन same passwords को किसी दूसरे system में उपयोग करने की कोशिश नहीं कर पाएगा (क्योंकि कई users हर जगह वही password उपयोग करते हैं, यह खतरनाक होगा)।128129{* ../../docs_src/security/tutorial003_an_py310.py hl[82:85] *}130131#### `**user_dict` के बारे में { #about-user-dict }132133`UserInDB(**user_dict)` का मतलब है:134135*`user_dict` की keys और values को सीधे key-value arguments के रूप में पास करें, इसके बराबर:*136137```Python138UserInDB(139    username = user_dict["username"],140    email = user_dict["email"],141    full_name = user_dict["full_name"],142    disabled = user_dict["disabled"],143    hashed_password = user_dict["hashed_password"],144)145```146147/// note | नोट148149`**user_dict` की अधिक पूरी explanation के लिए [**Extra Models** के documentation](../extra-models.md#about-user-in-model-dump) में वापस देखें।150151///152153## token लौटाएँ { #return-the-token }154155`token` endpoint का response एक JSON object होना चाहिए।156157इसमें `token_type` होना चाहिए। हमारे मामले में, क्योंकि हम "Bearer" tokens का उपयोग कर रहे हैं, token type "`bearer`" होना चाहिए।158159और इसमें `access_token` होना चाहिए, जिसमें हमारे access token वाली एक string हो।160161इस सरल उदाहरण के लिए, हम बस पूरी तरह insecure रहेंगे और token के रूप में वही `username` लौटाएँगे।162163/// tip | टिप164165अगले अध्याय में, आप password hashing और <abbr title="JSON Web Tokens - JSON वेब टोकन">JWT</abbr> tokens के साथ एक वास्तविक secure implementation देखेंगे।166167लेकिन अभी के लिए, आइए उन specific details पर ध्यान दें जिनकी हमें आवश्यकता है।168169///170171{* ../../docs_src/security/tutorial003_an_py310.py hl[87] *}172173/// tip | टिप174175Spec के अनुसार, आपको `access_token` और `token_type` के साथ एक JSON लौटाना चाहिए, बिल्कुल इस उदाहरण की तरह।176177यह कुछ ऐसा है जो आपको अपने code में स्वयं करना होगा, और सुनिश्चित करना होगा कि आप उन JSON keys का उपयोग करें।178179Specifications के compliant होने के लिए, यह लगभग एकमात्र चीज है जिसे आपको सही तरीके से खुद करना याद रखना होगा।180181बाकी सब **FastAPI** आपके लिए संभालता है।182183///184185## dependencies अपडेट करें { #update-the-dependencies }186187अब हम अपनी dependencies अपडेट करने वाले हैं।188189हम `current_user` को *केवल* तब प्राप्त करना चाहते हैं जब यह user active हो।190191इसलिए, हम एक अतिरिक्त dependency `get_current_active_user` बनाते हैं जो बदले में `get_current_user` को dependency के रूप में उपयोग करती है।192193ये दोनों dependencies बस एक HTTP error लौटाएँगी यदि user मौजूद नहीं है, या inactive है।194195इसलिए, हमारे endpoint में, हमें user केवल तभी मिलेगा जब user मौजूद हो, सही तरीके से authenticated हो, और active हो:196197{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}198199/// note | नोट200201Value `Bearer` के साथ अतिरिक्त header `WWW-Authenticate`, जिसे हम यहाँ लौटा रहे हैं, spec का भी हिस्सा है।202203किसी भी HTTP (error) status code 401 "UNAUTHORIZED" को `WWW-Authenticate` header भी लौटाना चाहिए।204205Bearer tokens (हमारे मामले) में, उस header की value `Bearer` होनी चाहिए।206207आप वास्तव में उस अतिरिक्त header को छोड़ सकते हैं और फिर भी यह काम करेगा।208209लेकिन specifications के compliant होने के लिए इसे यहाँ प्रदान किया गया है।210211साथ ही, ऐसे tools हो सकते हैं जो इसकी अपेक्षा करते हैं और इसका उपयोग करते हैं (अभी या भविष्य में) और यह आपके या आपके users के लिए उपयोगी हो सकता है, अभी या भविष्य में।212213यही standards का लाभ है...214215///216217## इसे काम करते देखें { #see-it-in-action }218219Interactive docs खोलें: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)।220221### Authenticate करें { #authenticate }222223"Authorize" button पर click करें।224225Credentials का उपयोग करें:226227User: `johndoe`228229Password: `secret`230231<img src="/img/tutorial/security/image04.png">232233System में authenticate होने के बाद, आप इसे ऐसे देखेंगे:234235<img src="/img/tutorial/security/image05.png">236237### अपना user data प्राप्त करें { #get-your-own-user-data }238239अब path `/users/me` के साथ operation `GET` का उपयोग करें।240241आपको अपने user का data मिलेगा, जैसे:242243```JSON244{245  "username": "johndoe",246  "email": "johndoe@example.com",247  "full_name": "John Doe",248  "disabled": false,249  "hashed_password": "fakehashedsecret"250}251```252253<img src="/img/tutorial/security/image06.png">254255यदि आप lock icon पर click करके logout करते हैं, और फिर वही operation दोबारा आज़माते हैं, तो आपको HTTP 401 error मिलेगा:256257```JSON258{259  "detail": "Not authenticated"260}261```262263### Inactive user { #inactive-user }264265अब एक inactive user के साथ प्रयास करें, इनके साथ authenticate करें:266267User: `alice`268269Password: `secret2`270271और path `/users/me` के साथ operation `GET` का उपयोग करने का प्रयास करें।272273आपको "Inactive user" error मिलेगा, जैसे:274275```JSON276{277  "detail": "Inactive user"278}279```280281## Recap { #recap }282283अब आपके पास अपनी API के लिए `username` और `password` पर आधारित एक पूरा security system implement करने के tools हैं।284285इन tools का उपयोग करके, आप security system को किसी भी database और किसी भी user या data model के साथ compatible बना सकते हैं।286287एकमात्र detail जो missing है वह यह है कि यह अभी वास्तव में "secure" नहीं है।288289अगले अध्याय में आप देखेंगे कि secure password hashing library और <abbr title="JSON Web Tokens - JSON वेब टोकन">JWT</abbr> tokens का उपयोग कैसे करें।

Findings

✓ No findings reported for this file.

Get this view in your editor

Same data, no extra tab — call code_get_file + code_get_findings over MCP from Claude/Cursor/Copilot.

Generated by searchcode.com · powered by code_get_file + code_get_findings