Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
SMART on FHIR के साथ रोगी सहमति कैसे लागू करें
ट्यूटोरियल: चरण दर चरण OAuth 2.1 और PKCE के साथ SMART on FHIR - डिस्कवरी, ऐप पंजीकरण, सहमति स्क्रीन, टोकन एक्सचेंज, लागू स्कोप, रीफ़्रेश रोटेशन और निरसन - और एंफ़ेरोस क्या लागू करता है।
SMART on FHIR एक व्यक्ति के FHIR रिकॉर्ड तक पहुँचने के लिए किसी व्यक्ति की अनुमति प्राप्त करने का मानक तरीका है: प्राधिकरण के लिए OAuth 2.1 PKCE के साथ, स्कोप जो ठीक से बताते हैं कि क्या पढ़ा या लिखा जा सकता है, और एक डिस्कवरी दस्तावेज़ जो एप्लिकेशन को बताता है कि कहाँ जाना है। यह ट्यूटोरियल Anpheros के विरुद्ध पूरे प्रवाह को चरण दर चरण curl के साथ चलाता है: डिस्कवरी, एक एप्लिकेशन पंजीकृत करना, व्यक्ति को सहमति स्क्रीन पर भेजना, कोड का आदान-प्रदान करना, अनुमत स्कोप के भीतर API को कॉल करना, रीफ़्रेश करना, और जब व्यक्ति पहुँच को निरस्त करता है तो क्या होता है। Anpheros SMART on FHIR बैकएंड है: यह प्राधिकरण सर्वर, सहमति स्क्रीन और FHIR R4 सर्वर को होस्ट करता है, इसलिए आप अपना कोई लॉगिन या सहमति UI नहीं लिखते हैं।
सहमति क्यों, सिर्फ एपीआई कुंजी क्यों नहीं
एपीआई कुंजी आपके प्रोजेक्ट द्वारा बनाए गए रोगियों तक पहुँचती है। किसी व्यक्ति का मौजूदा रिकॉर्ड (उनका अपना डेटा, जो अन्य ऐप्स, क्लीनिकों और प्रयोगशालाओं द्वारा एकत्र किया गया है) साझा करने के लिए उनका है। SMART on FHIR के साथ:
- व्यक्ति अपनी भाषा में देखता है कि कौन सा एप्लिकेशन पूछ रहा है, वह क्या पढ़ना या लिखना चाहता है, किस उद्देश्य से और कितनी देर के लिए;
- आपके एप्लिकेशन को केवल वे संसाधन प्रकार और क्रियाएं मिलती हैं, और केवल उस एक रिकॉर्ड के लिए;
- हर एक्सेस लॉग किया जाता है और व्यक्ति को दिखाई देता है, जो इसे कभी भी रद्द कर सकता है;
- अनुदान को FHIR
Consentसंसाधन के रूप में भी संग्रहीत किया जाता है।
इसके पीछे का मॉडल सहमति के साथ हेल्थकेयर एपीआई और सहमति और एक्सेस मॉडल में वर्णित है।
चरण 1: डिस्कवरी
curl https://platform.anpheros.com/fhir/R4/.well-known/smart-configuration
प्रतिक्रिया सर्वर द्वारा समर्थित एंडपॉइंट्स और सुविधाओं को सूचीबद्ध करती है (संक्षिप्त):
{"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: अपना एप्लिकेशन पंजीकृत करें
डैशबोर्ड में, अपना प्रोजेक्ट खोलें और अपने रीडायरेक्ट URI के साथ एक एप्लिकेशन जोड़ें। या एडमिन API के माध्यम से:
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"
}'
{"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 जोड़ी बनाएँ। वेरिफ़ायर आपके पास रहता है; केवल उसका हैश यात्रा करता है:
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: कोड को टोकन के लिए एक्सचेंज करें
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
{"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 को कॉल करें
curl "https://platform.anpheros.com/fhir/R4/Observation?patient=$PATIENT&category=laboratory" -H "Authorization: Bearer $ACCESS_TOKEN"
लैब परिणाम सामान्य रूप से वापस आते हैं। अनुदान के बाहर किसी चीज़ के लिए पूछें, जैसे दवाएं:
curl "https://platform.anpheros.com/fhir/R4/MedicationStatement?patient=$PATIENT" -H "Authorization: Bearer $ACCESS_TOKEN"
{"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 समान स्कोप लागू करते हैं।
चरण 6: रीफ़्रेश
एक्सेस टोकन 30 मिनट तक चलते हैं। रीफ़्रेश टोकन 30 दिनों तक चलते हैं और हर उपयोग पर रोटेट होते हैं:
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 से आपकी पहुँच को निरस्त कर सकता है, और आप स्वयं भी इसे निरस्त कर सकते हैं, उदाहरण के लिए जब वे आपके ऐप में डिस्कनेक्ट होते हैं:
curl -X POST https://platform.anpheros.com/oauth/revoke -d token=$REFRESH_TOKEN -d client_id=client_Hg6CknNkYlMgN190
तब से, उस ग्रांट के साथ हर कॉल 401 का जवाब देगी। इसे व्यक्ति को यह दिखाकर संभालें कि कनेक्शन समाप्त हो गया है और फिर से कनेक्ट करने की पेशकश करें। consent.revoked वेबहुक की सदस्यता लें ताकि असफल कॉल की प्रतीक्षा किए बिना पता चल सके।
SDKs के साथ
TypeScript और Dart SDKs आपके लिए 3 से 6 तक के चरण करते हैं: OAuthFlow.authorizeUrl एक जेनरेटेड PKCE जोड़ी के साथ, exchange कॉलबैक पर, और रोटेशन के साथ स्वचालित रीफ़्रेश। पूर्ण उदाहरण: FHIR बैकएंड के साथ AI हेल्थकेयर ऐप कैसे बनाएं (TypeScript) और 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)।
अभी क्या उपलब्ध नहीं है
- EHR लॉन्च (एप्लिकेशन जो लॉन्च कॉन्टेक्स्ट के साथ किसी अस्पताल प्रणाली के अंदर से खोला जाता है)।
- बैकएंड सेवाओं के लिए
system/स्कोप; संगठन इसके बजाय API कुंजियों का उपयोग करते हैं। - बल्क डेटा निर्यात (
$export); किसी मरीज़ पर$everythingउपलब्ध है।
ये संस्करण और अवमूल्यन में बाकी के साथ सूचीबद्ध हैं, और क्षमता कथन (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: API कुंजियाँ, टोकन और जीवनकाल का विस्तृत विवरण
- रोगी की सहमति के साथ हेल्थकेयर API: आपकी एप्लिकेशन के डिज़ाइन में सहमति से क्या बदलाव आता है
- सहमति और पहुँच मॉडल
- FHIR प्लेटफ़ॉर्म
- एक हेल्थकेयर ऐप बनाएँ
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card