# SMART on FHIR के साथ रोगी की सहमति कैसे लागू करें

> ट्यूटोरियल: SMART on FHIR OAuth 2.1 और PKCE के साथ चरण दर चरण — डिस्कवरी, ऐप पंजीकरण, सहमति स्क्रीन, टोकन एक्सचेंज, स्कोप लागू, रीफ़्रेश रोटेशन और निरस्तीकरण — और Anpheros क्या लागू करता है।

Source: https://developers.anpheros.com/hi/guides/smart-on-fhir-backend

**SMART on FHIR एक व्यक्ति के FHIR रिकॉर्ड तक पहुँचने के लिए किसी व्यक्ति की अनुमति प्राप्त करने का मानक तरीका है: प्राधिकरण के लिए OAuth 2.1 PKCE के साथ, स्कोप जो ठीक से बताते हैं कि क्या पढ़ा या लिखा जा सकता है, और एक डिस्कवरी दस्तावेज़ जो एप्लिकेशन को बताता है कि कहाँ जाना है।** यह ट्यूटोरियल Anpheros के विरुद्ध पूरे प्रवाह को चरण दर चरण `curl` के साथ चलाता है: डिस्कवरी, एक एप्लिकेशन पंजीकृत करना, व्यक्ति को सहमति स्क्रीन पर भेजना, कोड का आदान-प्रदान करना, अनुमत स्कोप के भीतर API को कॉल करना, रीफ़्रेश करना, और जब व्यक्ति पहुँच को निरस्त करता है तो क्या होता है। Anpheros SMART on FHIR बैकएंड है: यह प्राधिकरण सर्वर, सहमति स्क्रीन और FHIR R4 सर्वर को होस्ट करता है, इसलिए आप अपना कोई लॉगिन या सहमति UI नहीं लिखते हैं।

## सहमति क्यों, सिर्फ एपीआई कुंजी क्यों नहीं

एपीआई कुंजी आपके प्रोजेक्ट द्वारा बनाए गए रोगियों तक पहुँचती है। किसी व्यक्ति का मौजूदा रिकॉर्ड (उनका अपना डेटा, जो अन्य ऐप्स, क्लीनिकों और प्रयोगशालाओं द्वारा एकत्र किया गया है) साझा करने के लिए उनका है। SMART on FHIR के साथ:

- व्यक्ति अपनी भाषा में देखता है कि कौन सा एप्लिकेशन पूछ रहा है, वह क्या पढ़ना या लिखना चाहता है, किस उद्देश्य से और कितनी देर के लिए;
- आपके एप्लिकेशन को केवल वे संसाधन प्रकार और क्रियाएं मिलती हैं, और केवल उस एक रिकॉर्ड के लिए;
- हर एक्सेस लॉग किया जाता है और व्यक्ति को दिखाई देता है, जो इसे कभी भी रद्द कर सकता है;
- अनुदान को FHIR `Consent` संसाधन के रूप में भी संग्रहीत किया जाता है।

इसके पीछे का मॉडल [सहमति के साथ हेल्थकेयर एपीआई](https://developers.anpheros.com/hi/guides/healthcare-api-patient-consent) और [सहमति और एक्सेस मॉडल](https://developers.anpheros.com/hi/guides/consent) में वर्णित है।

## चरण 1: डिस्कवरी

```bash
curl https://platform.anpheros.com/fhir/R4/.well-known/smart-configuration
```

प्रतिक्रिया सर्वर द्वारा समर्थित एंडपॉइंट्स और सुविधाओं को सूचीबद्ध करती है (संक्षिप्त):

```json
{"issuer": "https://platform.anpheros.com",
 "authorization_endpoint": "https://platform.anpheros.com/oauth/authorize",
 "token_endpoint": "https://platform.anpheros.com/oauth/token",
 "revocation_endpoint": "https://platform.anpheros.com/oauth/revoke",
 "code_challenge_methods_supported": ["S256"],
 "scopes_supported": ["patient/*.rs", "patient/Patient.r", "patient/Observation.rs", "patient/Observation.rs?category=laboratory",
                      "patient/Observation.rs?category=vital-signs", "patient/Observation.c", "patient/Condition.rs",
                      "patient/MedicationStatement.rs", "patient/DocumentReference.rs", "patient/AllergyIntolerance.rs",
                      "offline_access", "launch/patient", "openid", "fhirUser"],
 "capabilities": ["launch-standalone", "client-public", "client-confidential-symmetric", "permission-patient",
                  "permission-offline", "context-standalone-patient", "sso-openid-connect"]}
```

SMART क्लाइंट लाइब्रेरी इस दस्तावेज़ को पढ़ती हैं और उन्हें किसी अन्य कॉन्फ़िगरेशन की आवश्यकता नहीं होती है।

## चरण 2: अपना एप्लिकेशन पंजीकृत करें

[डैशबोर्ड](https://platform.anpheros.com/dashboard/) में, अपना प्रोजेक्ट खोलें और अपने रीडायरेक्ट URI के साथ एक एप्लिकेशन जोड़ें। या एडमिन API के माध्यम से:

```bash
curl -X POST https://platform.anpheros.com/admin/projects/$PROJECT/applications \
     -H "Authorization: Bearer $FIREBASE_ID_TOKEN" -H "Content-Type: application/json" -d '{
  "name": "CardioAI", "client_type": "public",
  "redirect_uris": ["https://cardio.example/callback"],
  "purpose": "cardiology follow-up", "privacy_url": "https://cardio.example/privacy"
}'
```

```json
{"id": "app_…", "name": "CardioAI", "client_type": "public", "client_id": "client_Hg6CknNkYlMgN190", "client_secret": null,
 "redirect_uris": ["https://cardio.example/callback"], "purpose": "cardiology follow-up", "status": "active", …}
```

मोबाइल और ब्राउज़र ऐप्स के लिए `public` का उपयोग करें, जो सीक्रेट नहीं रख सकते और PKCE पर निर्भर करते हैं। सर्वर के लिए `confidential` का उपयोग करें; इसका `client_secret` एक बार दिखाया जाता है। नाम, उद्देश्य और गोपनीयता लिंक वह हैं जो व्यक्ति सहमति स्क्रीन पर देखता है।

## चरण 3: व्यक्ति को सहमति स्क्रीन पर भेजें

एक PKCE जोड़ी बनाएँ। वेरिफ़ायर आपके पास रहता है; केवल उसका हैश यात्रा करता है:

```bash
VERIFIER=$(openssl rand -base64 64 | tr -d '=+/\n' | cut -c1-64)
CHALLENGE=$(printf %s "$VERIFIER" | openssl dgst -sha256 -binary | openssl base64 | tr '+/' '-_' | tr -d '=')
```

फिर व्यक्ति के ब्राउज़र में यह पता खोलें (पढ़ने के लिए लाइन ब्रेक जोड़े गए हैं):

```
https://platform.anpheros.com/oauth/authorize?response_type=code
  &client_id=client_Hg6CknNkYlMgN190
  &redirect_uri=https://cardio.example/callback
  &scope=openid fhirUser patient/Observation.rs?category=laboratory patient/Condition.rs offline_access
  &state=8c1e…               ← a random value you check on return
  &code_challenge=$CHALLENGE&code_challenge_method=S256
  &purpose=treatment&lang=en
```

जितना आपको चाहिए उतना ही पूछें। यह एप्लिकेशन प्रयोगशाला परिणामों और निदान को पढ़ता है, और कुछ नहीं। `offline_access` एक रिफ्रेश टोकन देता है, इसलिए व्यक्ति को हर 30 मिनट में फिर से अनुमोदन नहीं करना पड़ता है।

व्यक्ति Anpheros में साइन इन करता है, सादे भाषा में अनुरोध पढ़ता है, चुनता है कि कौन सा रिकॉर्ड साझा करना है (उनका अपना, किसी परिवार के सदस्य का जिसकी वे देखभाल करते हैं, या वह जिसे आपके ऐप ने उनके लिए बनाया है) और एक्सेस कितने समय तक रहता है, फिर अनुमति देता है या अस्वीकार करता है। वे आपके रीडायरेक्ट URI पर लौट आते हैं:

```
https://cardio.example/callback?code=…&state=8c1e…
```

जांचें कि `state` वह मान है जिसे आपने कोड का उपयोग करने से पहले भेजा था।

## चरण 4: कोड को टोकन के लिए एक्सचेंज करें

```bash
curl -X POST https://platform.anpheros.com/oauth/token \
  -d grant_type=authorization_code -d client_id=client_Hg6CknNkYlMgN190 \
  -d code=$CODE -d code_verifier=$VERIFIER -d redirect_uri=https://cardio.example/callback
```

```json
{"access_token": "at_…", "token_type": "Bearer", "expires_in": 1800,
 "scope": "patient/Observation.rs?category=laboratory patient/Condition.rs openid fhirUser offline_access",
 "patient": "82bfd321-6a4d-4aea-943a-a62f4d81d419", "grant_id": "grant_…",
 "id_token": "eyJ…", "refresh_token": "rt_…"}
```

- `scope` में वह सूचीबद्ध है जो प्रदान किया गया था। इसे टोकन के साथ रखें और केवल उन सुविधाओं को दिखाएं जिन्हें यह कवर करता है।
- `patient` आपके एप्लिकेशन के लिए रिकॉर्ड की आईडी है। यह जोड़ीदार है: एक अन्य एप्लिकेशन उसी व्यक्ति को एक अलग आईडी के तहत देखता है।
- `id_token` एक OpenID Connect टोकन है जिसका `fhirUser` क्लेम रोगी संसाधन का नाम बताता है।
- कोड एक बार काम करता है, और केवल मिलान `code_verifier` के साथ।

## चरण 5: स्कोप के भीतर API को कॉल करें

```bash
curl "https://platform.anpheros.com/fhir/R4/Observation?patient=$PATIENT&category=laboratory" -H "Authorization: Bearer $ACCESS_TOKEN"
```

लैब परिणाम सामान्य रूप से वापस आते हैं। अनुदान के बाहर किसी चीज़ के लिए पूछें, जैसे दवाएं:

```bash
curl "https://platform.anpheros.com/fhir/R4/MedicationStatement?patient=$PATIENT" -H "Authorization: Bearer $ACCESS_TOKEN"
```

```json
{"resourceType": "OperationOutcome", "issue": [{"severity": "error", "code": "forbidden",
  "diagnostics": "The consent behind this token does not allow 's' on MedicationStatement."}]}
```

यह एक `403` है। अनुदान के भीतर खोजें भी फ़िल्टर की जाती हैं: `Observation.rs?category=laboratory` के साथ, सभी अवलोकनों के लिए एक खोज केवल प्रयोगशाला वाले लौटाती है। इस टोकन के लिए कोई अन्य रोगी मौजूद नहीं है (`404`)। REST दृश्य (`/v1`) और [संदर्भ API](https://developers.anpheros.com/hi/guides/llm-healthcare-data) समान स्कोप लागू करते हैं।

## चरण 6: रीफ़्रेश

एक्सेस टोकन 30 मिनट तक चलते हैं। रीफ़्रेश टोकन 30 दिनों तक चलते हैं और हर उपयोग पर रोटेट होते हैं:

```bash
curl -X POST https://platform.anpheros.com/oauth/token \
  -d grant_type=refresh_token -d client_id=client_Hg6CknNkYlMgN190 -d refresh_token=$REFRESH_TOKEN
```

आपको एक नया एक्सेस टोकन और एक नया रीफ़्रेश टोकन मिलता है। नए वाले को तुरंत स्टोर करें। पुराने रीफ़्रेश टोकन का पुनः उपयोग चोरी के रूप में माना जाता है: यह `400` के साथ विफल हो जाता है और पूरे ग्रांट को रद्द कर देता है।

## चरण 7: निरस्तीकरण

व्यक्ति किसी भी समय Anpheros से आपकी पहुँच को निरस्त कर सकता है, और आप स्वयं भी इसे निरस्त कर सकते हैं, उदाहरण के लिए जब वे आपके ऐप में डिस्कनेक्ट होते हैं:

```bash
curl -X POST https://platform.anpheros.com/oauth/revoke -d token=$REFRESH_TOKEN -d client_id=client_Hg6CknNkYlMgN190
```

तब से, उस ग्रांट के साथ हर कॉल `401` का जवाब देगी। इसे व्यक्ति को यह दिखाकर संभालें कि कनेक्शन समाप्त हो गया है और फिर से कनेक्ट करने की पेशकश करें। `consent.revoked` [वेबहुक](https://developers.anpheros.com/hi/guides/webhooks) की सदस्यता लें ताकि असफल कॉल की प्रतीक्षा किए बिना पता चल सके।

## SDKs के साथ

[TypeScript और Dart SDKs](https://developers.anpheros.com/hi/guides/sdks) आपके लिए 3 से 6 तक के चरण करते हैं: `OAuthFlow.authorizeUrl` एक जेनरेटेड PKCE जोड़ी के साथ, `exchange` कॉलबैक पर, और रोटेशन के साथ स्वचालित रीफ़्रेश। पूर्ण उदाहरण: [FHIR बैकएंड के साथ AI हेल्थकेयर ऐप कैसे बनाएं](https://developers.anpheros.com/hi/guides/build-ai-healthcare-app) (TypeScript) और [Flutter के साथ हेल्थकेयर ऐप कैसे बनाएं](https://developers.anpheros.com/guides/healthcare-app-flutter) (Dart)।

## Anpheros क्या लागू करता है

| SMART का भाग | Anpheros में |
|---|---|
| Discovery | FHIR बेस पर `/.well-known/smart-configuration`, समर्थित एंडपॉइंट्स, स्कोप्स और PKCE विधियों के साथ |
| Launch | स्टैंडअलोन लॉन्च (एप्लिकेशन शुरू होता है, फिर एक्सेस मांगता है); क्लिनिकल सिस्टम के भीतर से EHR लॉन्च की पेशकश नहीं की जाती है |
| Authorisation | PKCE के साथ OAuth 2.1 आवश्यक, ऑथराइज़ेशन कोड फ्लो |
| Scopes | SMART v2 पेशेंट स्कोप्स, कैटेगरी फिल्टर के साथ `patient/<Resource>.<cruds>`, साथ ही `openid` और `fhirUser` |
| Identity | एक OpenID Connect `id_token` जो पेशेंट को FHIR रिसोर्स के रूप में नामित करता है |
| Consent | पेशेंट की भाषा में एक होस्टेड कंसेंट स्क्रीन, पेशेंट द्वारा चुनी गई अवधि के साथ, जिसे FHIR `Consent` के रूप में मिरर किया गया है |
| Tokens | 30-मिनट एक्सेस टोकन, कंसेंट से बंधे रोटेटिंग 30-दिन रिफ्रेश टोकन, रिवोकेशन |
| Conformance | कैपेबिलिटी स्टेटमेंट SMART सुरक्षा सेवा घोषित करता है; Inferno SMART App Launch STU2 टेस्ट किट का "Standalone Launch" ग्रुप 22 में से 22 टेस्ट पास करता है (28 सितंबर 2026 का रन); अन्य Inferno ग्रुप्स और टेस्ट किट नहीं चलाए गए हैं |

लिखना भी इसी तरह काम करता है: स्कोप्स (`patient/Observation.c`, `.u`, `.d`) लिखें, जिससे आपका एप्लिकेशन रिकॉर्ड के भीतर बना, अपडेट या डिलीट कर सके। लिखा गया सब कुछ आपके एप्लिकेशन को लेखक के रूप में ले जाता है, इडेम्पोटेंसी की (idempotency key) के साथ रिट्राई (retry) कभी भी माप को डुप्लिकेट नहीं करते हैं, और डिलीट सॉफ्ट होते हैं और इतिहास रखते हैं ([Medical data API](https://developers.anpheros.com/hi/guides/medical-data-api))।

## अभी क्या उपलब्ध नहीं है

- EHR लॉन्च (एप्लिकेशन जो लॉन्च कॉन्टेक्स्ट के साथ किसी अस्पताल प्रणाली के अंदर से खोला जाता है)।
- बैकएंड सेवाओं के लिए `system/` स्कोप; संगठन इसके बजाय API कुंजियों का उपयोग करते हैं।
- बल्क डेटा निर्यात (`$export`); किसी मरीज़ पर `$everything` उपलब्ध है।

ये [संस्करण और अवमूल्यन](https://developers.anpheros.com/hi/guides/versioning) में बाकी के साथ सूचीबद्ध हैं, और क्षमता कथन (capability statement) हमेशा आधिकारिक स्रोत होता है।

## अक्सर पूछे जाने वाले प्रश्न

### SMART on FHIR क्या है?
एक खुला मानक, जो OAuth 2.0/2.1 और OpenID Connect पर आधारित है, जो परिभाषित करता है कि कोई एप्लिकेशन FHIR रिकॉर्ड तक पहुंच का अनुरोध कैसे करता है, कौन से स्कोप उस पहुंच का वर्णन करते हैं, और सर्वर अपने एंडपॉइंट्स का विज्ञापन कैसे करता है। कोई भी SMART-सक्षम क्लाइंट लाइब्रेरी किसी भी SMART-सक्षम सर्वर का उपयोग कर सकती है।

### क्या मुझे PKCE की आवश्यकता है?
हाँ। Anpheros को सार्वजनिक और गोपनीय दोनों क्लाइंट के लिए, हर प्राधिकरण कोड प्रवाह के साथ `S256` की आवश्यकता होती है। यह एक अवरोधित प्राधिकरण कोड को किसी और द्वारा उपयोग किए जाने से रोकता है।

### यदि व्यक्ति मना कर दे तो क्या होगा?
वे `error=access_denied` और आपके `state` के साथ आपके रीडायरेक्ट URI पर लौट आते हैं, और कोई कोड नहीं। सुविधा की आवश्यकता को समझाएं और उन्हें फिर से प्रयास करने दें; अनुदान के बाहर के कॉल हमेशा `403` का उत्तर देते हैं।

### क्या कोई माता-पिता बच्चे के लिए सहमति दे सकते हैं?
हाँ। सहमति स्क्रीन पर एक व्यक्ति उस रिकॉर्ड को चुन सकता है जिसकी वे परवाह करते हैं, जैसे कि बच्चे का, यदि वह उनके खाते से जुड़ा हुआ है। अनुदान केवल उस रिकॉर्ड पर लागू होता है।

## संबंधित

- [प्रमाणीकरण और OAuth](https://developers.anpheros.com/hi/guides/authentication): API कुंजियाँ, टोकन और जीवनकाल का विस्तृत विवरण
- [रोगी की सहमति के साथ हेल्थकेयर API](https://developers.anpheros.com/hi/guides/healthcare-api-patient-consent): आपकी एप्लिकेशन के डिज़ाइन में सहमति से क्या बदलाव आता है
- [सहमति और पहुँच मॉडल](https://developers.anpheros.com/hi/guides/consent)
- [FHIR प्लेटफ़ॉर्म](https://developers.anpheros.com/hi/guides/fhir)
- [एक हेल्थकेयर ऐप बनाएँ](https://developers.anpheros.com/hi/guides/build-a-healthcare-app)
