Mengontrol akses ke resource FHIR di Cloud Healthcare API

Halaman ini menjelaskan cara menggunakan resource Izin FHIR untuk menentukan akses data penyimpanan FHIR di Cloud Healthcare API.

Untuk mengonfigurasi penyimpanan FHIR dengan penerapan izin, selesaikan langkah-langkah berikut:

  1. Buat penyimpanan FHIR jika Anda belum memilikinya.

  2. Tetapkan parameter ConsentConfig penyimpanan FHIR berikut untuk mengaktifkan penerapan izin:

    • version: Menentukan versi penerapan izin yang digunakan untuk FHIR store. Nilai ini hanya dapat ditetapkan satu kali oleh CreateFhirStore atau UpdateFhirStore. Setelah ditetapkan, Anda harus memanggil ApplyConsents atau ApplyAdminConsents untuk mengubah versi.

    • access_enforced: Jika ditetapkan ke true, saat mengakses resource FHIR, header izin yang diberikan akan diverifikasi berdasarkan perintah izin yang diberikan oleh konsumen.

    • consent_header_handling: Jika ditetapkan ke PERMIT_EMPTY_SCOPE (default), server akan mengizinkan permintaan tanpa header X-Consent-Scope (atau kosong). Jika ditetapkan ke REQUIRED_ON_READ dan access_enforced = true, server akan menolak semua permintaan tanpa header X-Consent-Scope (atau kosong).

Menyiapkan penyimpanan FHIR baru dengan ConsentConfig

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{
      'version': 'R4',
      'enableUpdateCreate': true,
      'consentConfig': {
        'version': 'V1',
        'accessEnforced': true
      }
    }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores?fhirStoreId=FHIR_STORE_ID"

Anda akan melihat respons JSON seperti berikut:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID",
  "version": "R4",
  "enableUpdateCreate": true,
  "consentConfig": {
    "version": "V1"
  }
}

Jika Anda sudah memiliki toko, gunakan UpdateFhirStore untuk menetapkan ConsentConfig dengan penerapan izin version sebagai V1 dan tetapkan accessEnforced ke true.

curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{
      'consentConfig': {
        'version': 'V1',
        'accessEnforced': true
      }
    }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"

Kebijakan direpresentasikan melalui Resource izin. Tujuan dan penggunaan kolom resource dijelaskan dalam Dokumen Model Data.

Berikut adalah contoh semua resource yang dapat dibuat untuk contoh khusus ini.

Membuat resource FHIR

Contoh berikut menunjukkan cara menjalankan [paket FHIR](/healthcare-api/docs/how-tos/fhir-bundles) untuk mengisi resource berikut:

  • Referensi Praktisi dengan nama Jeffrey Brown
  • Resource Pasien dengan nama Darcy Smith
  • Resource Pengamatan yang menunjukkan pengukuran hemoglobin Darcy (LOINC718-7) yang dikumpulkan oleh Rumah Sakit Happy
  • Resource Pengamatan yang menampilkan pengukuran glukosa Darcy (LOINC15074-8).
  • Izin dari Darcy untuk mengizinkan Jeffrey Brown menggunakan aplikasi App/123 untuk mengakses datanya yang dikumpulkan oleh Rumah Sakit Happy
  • Izin dari Darcy untuk mengizinkan Jeffrey Brown mengakses datanya untuk perawatan darurat (ETREAT)
  • Izin dari Rumah Sakit Happy untuk mengizinkan Jeffrey Brown mengakses semua data saat melakukan riset biomedis (BIORCH) dengan aplikasi App/golden

cat > bundle.json << 'EOF'
{
  "resourceType": "Bundle",
  "type": "transaction",
  "entry": [
    {
      "request": {"method": "PUT", "url": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"},
      "resource": {
        "active": true,
        "birthDate": "1970-05-23",
        "gender": "male",
        "id": "12942879-f89f-41ae-aa80-0b911b649833",
        "name": [{
            "family": "Brown",
            "given": ["Jeffrey"],
            "use": "official"
        }],
        "resourceType": "Practitioner"
      }
    },
    {
      "request": {"method": "PUT", "url": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"},
      "resource": {
        "active": true,
        "birthDate": "1990-01-01",
        "gender": "female",
        "id": "3c6aa096-c054-4c22-b2b4-1e4a4d203de2",
        "name": [{
            "family": "Smith",
            "given": ["Darcy"],
            "use": "official"
        }],
        "meta": {
          "tag": [{
            "system": "http://terminology.hl7.org/CodeSystem/common-tags",
            "code": "employee"
          }]
        },
        "resourceType": "Patient"
      }
    },
    {
      "request": {"method": "PUT", "url": "Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"},
      "resource": {
        "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
        "meta": {"source": "http://example.com/HappyHospital"},
        "code": {
          "coding": [{
            "code": "718-7",
            "system": "http://loinc.org",
            "display": "Hemoglobin [Mass/volume] in Blood"
          }]
        },
        "effectivePeriod": {"start": "2021-12-10T05:30:10+01:00"},
        "issued": "2021-12-10T13:30:10+01:00",
        "resourceType": "Observation",
        "status": "final",
        "subject": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"},
        "valueQuantity": {
          "code": "g/dL",
          "system": "http://unitsofmeasure.org",
          "unit": "g/dl",
          "value": 7.2
        }
      }
    },
    {
      "request": {"method": "PUT", "url": "Observation/68583624-9921-4158-8754-2a306c689abd"},
      "resource": {
        "id": "68583624-9921-4158-8754-2a306c689abd",
        "code": {
          "coding": [{
            "code": "15074-8",
            "system": "http://loinc.org",
            "display": "Glucose [Moles/volume] in Blood"
          }]
        },
        "effectivePeriod": {"start": "2021-12-01T05:30:10+01:00"},
        "issued": "2021-12-01T13:30:10+01:00",
        "resourceType": "Observation",
        "status": "final",
        "subject": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"},
        "valueQuantity": {
          "code": "mmol/L",
          "system": "http://unitsofmeasure.org",
          "unit": "mmol/l",
          "value": 6.3
        }
      }
    },
    {
      "request": {"method": "PUT", "url": "Consent/10998b60-a252-405f-aa47-0702554ddc8e"},
      "resource": {
        "category": [{
          "coding": [{
            "code": "59284-0",
            "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes"
          }]
        }],
        "id": "10998b60-a252-405f-aa47-0702554ddc8e",
        "patient": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"},
        "policyRule": {
          "coding": [{
            "code": "OPTIN",
            "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
          }]
        },
        "provision": {
          "actor": [
            {
              "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"},
              "role": {
                "coding": [{
                  "code": "GRANTEE",
                  "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode"
                }]
              }
            }
          ],
          "extension": [
            {
              "url": "https://g.co/fhir/medicalrecords/Environment",
              "valueCodeableConcept": {
                "coding": [{
                  "code": "123",
                  "system": "App"
                }]
              }
            },
            {
              "url": "https://g.co/fhir/medicalrecords/DataSource",
              "valueUri": "http://example.com/HappyHospital"
            }
          ],
          "type": "permit"
        },
        "resourceType": "Consent",
        "scope": {
          "coding": [{
            "code": "patient-privacy",
            "system": "http://terminology.hl7.org/CodeSystem/consentscope"
          }]
        },
        "status": "active"
      }
    },
    {
      "request": {"method": "PUT", "url": "Consent/73c54e8d-2789-403b-9dee-13085c5d5e34"},
      "resource": {
        "category": [{
          "coding": [{
            "code": "59284-0",
            "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes"
          }]
        }],
        "id": "73c54e8d-2789-403b-9dee-13085c5d5e34",
        "patient": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"},
        "policyRule": {
          "coding": [{
            "code": "OPTIN",
            "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
          }]
        },
        "provision": {
          "actor": [
            {
              "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"},
              "role": {
                "coding": [{
                  "code": "GRANTEE",
                  "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode"
                }]
              }
            }
          ],
          "purpose": [{
            "code": "ETREAT",
            "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason"
          }],
          "type": "permit"
        },
        "resourceType": "Consent",
        "scope": {
          "coding": [{
            "code": "patient-privacy",
            "system": "http://terminology.hl7.org/CodeSystem/consentscope"
          }]
        },
        "status": "active"
      }
    },
    {
      "request": {"method": "PUT", "url": "Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde"},
      "resource": {
        "category": [{
          "coding": [{
            "code": "57017-6",
            "system": "http://loinc.org"
          }]
        }],
        "id": "5c8e3f8a-9fd5-480d-a08e-f29b89feccde",
        "patient": {},
        "extension": [{
          "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy"
        }],
        "policyRule": {
          "coding": [{
            "code": "OPTIN",
            "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
          }]
        },
        "provision": {
          "actor": [
            {
              "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"},
              "role": {
                "coding": [{
                  "code": "GRANTEE",
                  "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode"
                }]
              }
            }
          ],
          "purpose": [{
            "code": "BIORCH",
            "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason"
          }],
          "extension": [
            {
              "url": "https://g.co/fhir/medicalrecords/Environment",
              "valueCodeableConcept": {
                "coding": [{
                  "code": "golden",
                  "system": "App"
                }]
              }
            }
          ],
          "type": "permit"
        },
        "resourceType": "Consent",
        "scope": {},
        "status": "active"
      }
    }
  ]
}
EOF
curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/fhir+json; charset=utf-8" \
    --data @bundle.json \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir"

Anda akan melihat respons JSON seperti berikut:

{
  "entry": [
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/10998b60-a252-405f-aa47-0702554ddc8e/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/73c54e8d-2789-403b-9dee-13085c5d5e34/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde/_history/VERSION_ID",
        "status": "201 Created"
      }
    }
  ],
  "resourceType": "Bundle",
  "type": "transaction-response"
}

Berikut adalah contoh lain dari Resource izin R4 yang menunjukkan cara kebijakan yang kompleks dapat direpresentasikan.

{
  "resourceType": "Consent",
  "id": "patient-consent-example",
  "patient": {
    "reference": "Patient/f001"
  },
  "category": [
    {
      "coding": [
        {
          "system": "http://loinc.org",
          "code": "59284-0"
        }
      ]
    }
  ],
  "scope": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/consentscope",
        "code": "patient-privacy"
      }
    ]
  },
  "policyRule": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "OPTIN"
      }
    ]
  },
  "status": "active",
  "provision": {
    "type": "permit",
    "actor": [
      {
        "reference": {
          "reference": "Practitioner/f002"
        },
        "role": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode",
              "code": "GRANTEE"
            }
          ]
        }
      }
    ],
    "purpose": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
        "code": "TREAT"
      }
    ],
    "class": [
      {
        "system": "http://hl7.org/fhir/resource-types",
        "code": "Encounter"
      }
    ],
    "data": [
      {
        "meaning": "instance",
        "reference": {
          "reference": "Encounter/e001"
        }
      }
    ],
    "extension": [
      {
        "url": "https://g.co/fhir/medicalrecords/Environment",
        "valueCodeableConcept": {
          "coding": [
            {
              "system": "iso3166-1",
              "code": "CA"
            }
          ]
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "valueCoding": {
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "actionable"
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "extension": [
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "archived"
            }
          },
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "insensitive"
            }
          }
        ]
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataSource",
        "valueUri": "http://somesystem.example.org/foo"
      }
    ],
    "securityLabel": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-Confidentiality",
        "code": "R"
      },
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "PSY"
      }
    ]
  }
}

Contoh sebelumnya mewakili resource Izin pasien tempat pasien f001 memberikan izin kepada praktisi f002 dengan tujuan memberikan perawatan rutin yang diwakili oleh TREAT. Praktisi berasal dari geolokasi iso3166-1/CA. Resource Izin ini mengizinkan praktisi mengakses data pasien jika data memenuhi semua kondisi berikut.

  • Ini adalah jenis Encounter dengan ID Encounter/e001.
  • Data ini berasal dari sumber http://somesystem.example.org/foo.
  • Memenuhi setidaknya salah satu kondisi berikut pada tag (resource dapat diberi tag dengan menetapkan kolom system dan code Meta.tag):
    • Memiliki tag (system = http://terminology.hl7.org/CodeSystem/common-tags dan code = actionable)
    • Memiliki kedua tag (system = http://example.com/custom-tags dan code = archived) dan (system = http://example.com/custom-tags dan code = insensitive)
  • Memiliki setidaknya salah satu label keamanan berikut
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality dan code adalah salah satu dari R, N, M, L, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode dan code = PSY.

Contoh perintah kebijakan admin

{
  "resourceType": "Consent",
  "id": "admin-policy-example",
  "patient": {},
  "extension": [{
    "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy"
  }],
  "category": [
    {
      "coding": [
        {
          "system": "http://loinc.org",
          "code": "57017-6"
        }
      ]
    }
  ],
  "scope": {},
  "policyRule": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "OPTIN"
      }
    ]
  },
  "status": "active",
  "provision": {
    "type": "permit",
    "actor": [
      {
        "reference": {
          "reference": "Practitioner/f002"
        },
        "role": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode",
              "code": "GRANTEE"
            }
          ]
        }
      }
    ],
    "purpose": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
        "code": "TREAT"
      }
    ],
    "class": [
      {
        "system": "http://hl7.org/fhir/resource-types",
        "code": "Encounter"
      }
    ],
    "data": [
      {
        "meaning": "instance",
        "reference": {
          "reference": "Encounter/e001"
        }
      }
    ],
    "extension": [
      {
        "url": "https://g.co/fhir/medicalrecords/Environment",
        "valueCodeableConcept": {
          "coding": [
            {
              "system": "iso3166-1",
              "code": "CA"
            }
          ]
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "valueCoding": {
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "actionable"
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "extension": [
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "archived"
            }
          },
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "insensitive"
            }
          }
        ]
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataSource",
        "valueUri": "http://somesystem.example.org/foo"
      }
    ],
    "securityLabel": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-Confidentiality",
        "code": "R"
      },
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "PSY"
      }
    ]
  }
}

Contoh sebelumnya mewakili resource Izin kebijakan admin yang memberikan izin kepada praktisi f002 dengan tujuan memberikan perlakuan rutin yang diwakili oleh TREAT. Praktisi berasal dari geolokasi iso3166-1/CA. Referensi Izin ini mengizinkan praktikus mengakses data pasien jika data tersebut memenuhi semua kondisi berikut:

  • Ini adalah jenis Encounter dengan ID Encounter/e001.
  • Data ini berasal dari sumber http://somesystem.example.org/foo.
  • Memenuhi setidaknya salah satu kondisi berikut pada tag:
    • Memiliki tag (system = http://terminology.hl7.org/CodeSystem/common-tags dan code = actionable)
    • Memiliki kedua tag (system = http://example.com/custom-tags dan code = archived) dan (system = http://example.com/custom-tags dan code = insensitive)
  • Memiliki setidaknya salah satu label keamanan berikut
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality dan code adalah salah satu dari R, N, M, L, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode dan code = PSY.

Contoh perintah kebijakan cascading admin

{
  "resourceType": "Consent",
  "id": "admin-cascading-policy-example",
  "patient": {},
  "extension": [
    { "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy" },
    { "url": "https://g.co/fhir/medicalrecords/CascadingPolicy" }
  ],
  "category": [
    {
      "coding": [
        {
          "system": "http://loinc.org",
          "code": "57017-6"
        }
      ]
    }
  ],
  "scope": {},
  "policyRule": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "OPTIN"
      }
    ]
  },
  "status": "active",
  "provision": {
    "type": "permit",
    "actor": [
      {
        "reference": {
          "reference": "Practitioner/f002"
        },
        "role": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode",
              "code": "GRANTEE"
            }
          ]
        }
      }
    ],
    "purpose": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
        "code": "TREAT"
      }
    ],
    "class": [
      {
        "system": "http://hl7.org/fhir/resource-types",
        "code": "Patient"
      }
    ],
    "extension": [
      {
        "url": "https://g.co/fhir/medicalrecords/Environment",
        "valueCodeableConcept": {
          "coding": [
            {
              "system": "iso3166-1",
              "code": "CA"
            }
          ]
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "valueCoding": {
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "employee"
        }
      }
    ]
  }
}

Contoh sebelumnya mewakili resource Izin kebijakan cascading admin yang memberikan izin kepada praktisi f002 dengan tujuan memberikan pengobatan rutin yang diwakili oleh TREAT. Praktisi berasal dari geolokasi iso3166-1/CA. Referensi Izin ini memungkinkan praktikus mengakses data kompartemen pasien dengan tag employee. Semua kriteria resource hanya berlaku untuk resource dasar kompartemen, yang berarti resource Pasien, karena mengontrol resource yang akan di-cascade.

Menerapkan izin pasien atau kebijakan admin

Terapkan izin pasien paling lambat ApplyConsents

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{'validateOnly': false}" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"

Anda akan melihat respons JSON seperti berikut:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

Respons berisi nama operasi. Untuk melacak status operasi, Anda dapat menggunakan [Metode `get` Operasi](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

Saat operasi selesai, server akan menampilkan respons dengan status operasi dalam format JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1beta1.fhir.FhirStoreService.ApplyConsents",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL",
    "counter": {
      "success": "2",
      "secondarySuccess": "5"
    }
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.fhir.ApplyConsentsResponse",
    "consentApplySuccess": "2",
    "affectedResources": "5"
  }
}

Respons ini menunjukkan bahwa server berhasil memproses 2 izin dan memperbarui akses konsensual dari 5 resource (1 Pasien, 2 Izin, 2 Pengamatan).

Menerapkan kebijakan admin oleh ApplyAdminConsents

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{
      'validateOnly': false,
      'newConsentsList': {
        'names': ['projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde/_history/VERSION_ID']
      }
    }" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"

Anda akan melihat respons JSON seperti berikut:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

Respons berisi nama operasi. Untuk melacak status operasi, Anda dapat menggunakan [Metode `get` Operasi](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

Saat operasi selesai, server akan menampilkan respons dengan status operasi dalam format JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1beta1.fhir.FhirStoreService.ApplyAdminConsents",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL",
    "counter": {
      "success": "1",
      "secondarySuccess": "7"
    }
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.fhir.ApplyAdminConsentsResponse",
    "consentApplySuccess": "1",
    "affectedResources": "7"
  }
}

Respons ini menunjukkan bahwa server berhasil memproses 1 kebijakan admin dan memperbarui akses konsensual dari 7 resource (1 Praktisi, 1 Pasien, 2 Pengamatan, 2 Izin pasien, dan 1 kebijakan admin).

Penegakan izin yang disimpan dalam penyimpanan FHIR tidak akan berlaku hingga ApplyConsents (untuk izin pasien) atau ApplyAdminConsents (untuk kebijakan admin dan kebijakan cascading admin) dipanggil dan berhasil diselesaikan. Jika menambahkan, mengubah, atau menghapus izin setelah menjalankan ApplyConsents atau ApplyAdminConsents, Anda harus menjalankannya lagi agar izin tersebut disertakan dalam model penegakan.

Resource FHIR diindeks secara asinkron, sehingga mungkin ada sedikit penundaan antara waktu saat ApplyConsents atau ApplyAdminConsents selesai dan saat model penegakan diterapkan dalam hasil penelusuran. Penundaan ini hanya diperkirakan untuk permintaan penelusuran.

Jika ini adalah pertama kalinya Anda menyiapkan penerapan izin di penyimpanan FHIR, tunggu operasi ApplyConsents atau ApplyAdminConsents yang berjalan lama selesai sebelum membuat permintaan yang mempertimbangkan izin.

Untuk memanggil ApplyConsents pada sebagian pasien, Anda dapat menggunakan filter berikut:

  • PatientScope: untuk menjalankan ApplyConsents pada daftar ID pasien dengan maksimal 10.000 pasien

  • TimeRange: untuk menjalankan ApplyConsent pada daftar ID resource Pasien yang resource Izinnya diperbarui selama rentang waktu tertentu

Untuk memanggil ApplyAdminConsents: Anda harus memberikan daftar lengkap semua kebijakan yang ingin diterapkan (bukan daftar inkremental). Akibatnya, daftar kosong akan membatalkan penegakan dari semua kebijakan admin dari Play Store. Setiap kebijakan harus berupa nama versi resource jika penyimpanan FHIR memiliki versi, dan nama resource jika tidak.

Anda dapat menggunakan operations.get untuk mengambil ProgressCounter operasi. Setelah selesai, akan ada ApplyConsentsResponse yang disertakan dalam Operation.response. Penghitung di ProgressCounter dan ApplyConsentsResponse atau ApplyAdminConsentsResponse dijelaskan dalam tabel berikut.

ProgressCounter ApplyConsentsResponse atau ApplyAdminConsentsResponse Deskripsi
success consentApplySuccess Jumlah resource Izin yang berhasil diproses oleh operasi.
failure consentApplyFailure Jumlah resource Izin yang tidak didukung atau tidak valid. Anda dapat melihat log error di Cloud Logging atau saat validateOnly adalah false, periksa status penerapan izin menggunakan CheckConsentEnforcementStatus atau CheckPatientConsentEnforcementStatus untuk mengambil detail error.
secondarySuccess affectedResources Jika validateOnly adalah false, nilai ini menunjukkan jumlah resource FHIR yang berhasil diindeks ulang karena efek perubahan izin.
secondaryFailure failedResources Jika validateOnly adalah false, nilai ini menunjukkan jumlah resource FHIR yang mungkin memiliki perubahan izin, tetapi gagal melakukan pengindeksan ulang. Hal ini dapat memengaruhi penelusuran dengan konteks izin, tetapi tidak memengaruhi metode lainnya. Untuk melihat detail error, Anda dapat melihat log error di Cloud Logging.

Saat resource Izin FHIR diproses, Anda dapat menggunakan API berikut untuk memeriksa status penegakan untuk satu izin atau semua izin dari pasien:

Untuk kebijakan admin, CheckConsentEnforcementStatus hanya dapat digunakan untuk memeriksa status penerapan satu kebijakan admin Izin. Atau, Anda dapat menggunakan fhirStores.get untuk melihat semua kebijakan admin aktif yang diterapkan ke toko.

consent-enforcement-status dapat memiliki salah satu nilai berikut:

  • OFF: mewakili status penerapan default resource Izin baru yang resource Izinnya belum pernah diproses.

  • ENFORCEABLE: status saat resource Izin berhasil diproses.

  • INACTIVE: status tidak aktif saat resource Izin diabaikan.

  • UNSUPPORTED: status resource Izin yang mungkin sesuai dengan spesifikasi FHIR, tetapi tidak dapat diterapkan. Hal ini disebabkan oleh penerapan pembatasan izin FHIR dengan tingkat dukungan fitur saat ini.

  • ENFORCEMENT_LIMIT_EXCEEDED: status saat format resource izin FHIR dan tingkat dukungan untuk resource bebas error, tetapi satu atau beberapa kondisi berikut benar:

    • Pasien memiliki kumpulan besar resource Consent.

    • Ukuran perintah izin di semua izin aktif lebih besar dari ukuran maksimum perintah izin yang diizinkan untuk server FHIR menerapkannya.

Cloud Healthcare API mendukung penelusuran resource FHIR di penyimpanan FHIR tertentu dengan actor, purpose, dan environment sebagai parameter kueri. Respons hanya berisi resource yang diizinkan.

  1. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) menggunakan aplikasi tepercaya App/123 menelusuri semua Pengamatan dengan status=final.
  2. curl -X GET \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?status=final"

    Anda akan melihat respons JSON seperti berikut:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION_ID/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa",
          "resource": {
            "code": {
              "coding": [
                {
                  "code": "718-7",
                  "display": "Hemoglobin [Mass/volume] in Blood",
                  "system": "http://loinc.org"
                }
              ]
            },
            "effectivePeriod": {
              "start": "2021-12-10T05:30:10+01:00"
            },
            "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
            "issued": "2021-12-10T13:30:10+01:00",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "source": "http://example.com/HappyHospital",
              "versionId": "VERSION_ID"
            },
            "resourceType": "Observation",
            "status": "final",
            "subject": {
              "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
            },
            "valueQuantity": {
              "code": "g/dL",
              "system": "http://unitsofmeasure.org",
              "unit": "g/dl",
              "value": 7.2
            }
          },
          "search": {
            "mode": "match"
          }
        }
      ],
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        }
      ],
      "resourceType": "Bundle",
      "total": 1,
      "type": "searchset"
    }
    
  3. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) menggunakan aplikasi App/123 menelusuri semua Pengamatan dari Pasien Darcy.
  4. curl -X GET \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?subject:Patient.name=Darcy"

    Anda akan melihat respons JSON seperti berikut:

    {
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
        }
      ],
      "resourceType": "Bundle",
      "total": 0,
      "type": "searchset"
    }
    

    Kueri sebelumnya adalah penelusuran berantai. Karena skenario izin actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123 ditolak aksesnya untuk resource Darcy Pasien (diidentifikasi oleh Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2), server FHIR tidak menampilkan Observasi dari Pasien seolah-olah Pasien tidak ada.

  5. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) menggunakan aplikasi App/123 menelusuri semua Pengamatan dari Pasien Darcy untuk tujuan perawatan darurat.
  6. curl -X GET \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 purp/v3/ETREAT env/App/123" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?subject:Patient.name=Darcy"

    Anda akan melihat respons JSON seperti berikut:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd",
          "resource": {
            "code": {
              "coding": [
                {
                  "code": "15074-8",
                  "display": "Glucose [Moles/volume] in Blood",
                  "system": "http://loinc.org"
                }
              ]
            },
            "effectivePeriod": {
              "start": "2021-12-01T05:30:10+01:00"
            },
            "id": "68583624-9921-4158-8754-2a306c689abd",
            "issued": "2021-12-01T13:30:10+01:00",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "versionId": "VERSION_ID"
            },
            "resourceType": "Observation",
            "status": "final",
            "subject": {
              "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
            },
            "valueQuantity": {
              "code": "mmol/L",
              "system": "http://unitsofmeasure.org",
              "unit": "mmol/l",
              "value": 6.3
            }
          },
          "search": {
            "mode": "match"
          }
        },
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa",
          "resource": {
            "code": {
              "coding": [
                {
                  "code": "718-7",
                  "display": "Hemoglobin [Mass/volume] in Blood",
                  "system": "http://loinc.org"
                }
              ]
            },
            "effectivePeriod": {
              "start": "2021-12-10T05:30:10+01:00"
            },
            "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
            "issued": "2021-12-10T13:30:10+01:00",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "source": "http://example.com/HappyHospital",
              "versionId": "VERSION_ID"
            },
            "resourceType": "Observation",
            "status": "final",
            "subject": {
              "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
            },
            "valueQuantity": {
              "code": "g/dL",
              "system": "http://unitsofmeasure.org",
              "unit": "g/dl",
              "value": 7.2
            }
          },
          "search": {
            "mode": "match"
          }
        }
      ],
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
        }
      ],
      "resourceType": "Bundle",
      "total": 2,
      "type": "searchset"
    }
    
  7. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) menelusuri Pengamatan dengan status=final untuk dua tujuan, yaitu dan riset pengobatan
  8. curl -X GET \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 purp/v3/TREAT purp/v3/HRESCH" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?status=final"

    Anda akan melihat respons JSON seperti berikut:

    {
      "issue": [
        {
          "code": "security",
          "details": {
            "text": "permission_denied"
          },
          "diagnostics": "the maximum number of allowed consent purpose scopes is 1, got 2",
          "severity": "error"
        }
      ],
      "resourceType": "OperationOutcome"
    }
    

    Dalam hal ini, Praktisi Jeffrey Brown harus menghapus tujuan yang tidak diperlukan dari `X-Consent-Scope` dalam permintaan.

  9. Administrator IT rumah sakit menggunakan bypass untuk menelusuri semua Praktisi di rumah sakit.
  10. curl -X GET \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "X-Consent-Scope: bypass actor/Admin/ef0592c9-6724-467e-878d-f879e537cd15 env/net/HappyNet" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner?"

    Karena bypass diberikan, pemeriksaan izin dilewati. Anda akan menerima respons JSON yang mirip dengan berikut ini:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833",
          "resource": {
            "active": true,
            "birthDate": "1970-05-23",
            "gender": "male",
            "id": "12942879-f89f-41ae-aa80-0b911b649833",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "versionId": "VERSION_ID"
            },
            "name": [
              {
                "family": "Brown",
                "given": [
                  "Jeffrey"
                ],
                "use": "official"
              }
            ],
            "resourceType": "Practitioner"
          },
          "search": {
            "mode": "match"
          }
        }
      ],
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        }
      ],
      "resourceType": "Bundle",
      "total": 1,
      "type": "searchset"
    }
    

Cloud Healthcare API mendukung resource FHIR get di penyimpanan FHIR tertentu dengan actor, purpose, dan environment sebagai parameter kueri. Respons hanya berisi resource yang diizinkan.

  1. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) menggunakan aplikasi App/123 membaca pengukuran hemoglobin Pasien (dalam contoh ini, Observation/7473784b-46a8-470c-b9a6-fe38a01025aa).
  2. curl -X GET \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"

    Karena pemohon diberi izin, responsnya adalah konten resource Pengamatan.

    {
      "code": {
        "coding": [
          {
            "code": "718-7",
            "display": "Hemoglobin [Mass/volume] in Blood",
            "system": "http://loinc.org"
          }
        ]
      },
      "effectivePeriod": {
        "start": "2021-12-10T05:30:10+01:00"
      },
      "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
      "issued": "2021-12-10T13:30:10+01:00",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "source": "http://example.com/HappyHospital",
        "versionId": "VERSION_ID"
      },
      "resourceType": "Observation",
      "status": "final",
      "subject": {
        "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
      },
      "valueQuantity": {
        "code": "g/dL",
        "system": "http://unitsofmeasure.org",
        "unit": "g/dl",
        "value": 7.2
      }
    }
    
  3. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) menggunakan aplikasi yang tidak diketahui App/unknown membaca pengukuran hemoglobin Pasien (dalam contoh ini, Observation/7473784b-46a8-470c-b9a6-fe38a01025aa).
  4. curl -X GET \
      -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
      -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/unknown" \
      "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"

    Karena akses batas peminta (`App/unknown`) tidak diizinkan oleh izin Pasien, permintaan akan ditolak.

    {
      "issue": [
        {
          "code": "security",
          "details": {
            "text": "permission_denied"
          },
          "diagnostics": "Consent access denied or the resource being accessed does not exist",
          "severity": "error"
        }
      ],
      "resourceType": "OperationOutcome"
    }
    
  5. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) yang melakukan riset biomedis menggunakan aplikasi App/golden membaca birthDate Darcy (dalam contoh ini, Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2).
  6. curl -X GET \
      -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
      -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 purp/v3/BIORCH env/App/golden" \
      "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"

    Karena pemohon diberi izin, responsnya adalah konten resource Pasien.

    {
      "active": true,
      "birthDate": "1990-01-01",
      "gender": "female",
      "id": "3c6aa096-c054-4c22-b2b4-1e4a4d203de2",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "versionId": "VERSION_ID",
        "tag": [{
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "employee"
        }]
      },
      "name": [
        {
          "family": "Smith",
          "given": [
            "Darcy"
          ],
          "use": "official"
        }
      ],
      "resourceType": "Patient"
    }
    
  7. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) meminta akses darurat yang tidak sah ke catatan pasien, menggunakan protokol "break-the-glass". (dalam contoh ini, Observation/7473784b-46a8-470c-b9a6-fe38a01025aa).
  8. curl -X GET \
      -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
      -H "X-Consent-Scope: btg actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833" \
      "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"

    Karena metode otorisasi izin adalah btg, server akan melewati pemeriksaan izin. Responsnya adalah konten resource Pengamatan.

    {
      "code": {
        "coding": [
          {
            "code": "718-7",
            "display": "Hemoglobin [Mass/volume] in Blood",
            "system": "http://loinc.org"
          }
        ]
      },
      "effectivePeriod": {
        "start": "2021-12-10T05:30:10+01:00"
      },
      "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
      "issued": "2021-12-10T13:30:10+01:00",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "source": "http://example.com/HappyHospital",
        "versionId": "VERSION_ID"
      },
      "resourceType": "Observation",
      "status": "final",
      "subject": {
        "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
      },
      "valueQuantity": {
        "code": "g/dL",
        "system": "http://unitsofmeasure.org",
        "unit": "g/dl",
        "value": 7.2
      }
    }
    

Bagian berikut menjelaskan metode penegakan izin yang didukung di Cloud Healthcare API dan cara akses resource diterapkan saat Anda membuat permintaan yang mempertimbangkan izin.

Saat membuat permintaan, server otorisasi Anda bertanggung jawab untuk membuat token akses dengan cakupan izin yang relevan.

Menetapkan header HTTP

Cakupan izin diteruskan ke Cloud Healthcare API menggunakan header HTTP X-Consent-Scope. Cloud Healthcare API menggunakan header ini untuk menerapkan kontrol akses berbasis izin pada data di penyimpanan FHIR.

Permintaan FHIR dapat mendukung cakupan entri izin dalam jumlah terbatas. Maksimal tiga entri actor, satu purp, dan satu env dapat disertakan dalam permintaan FHIR tertentu.

Untuk cakupan khusus, permintaan FHIR dapat mendukung salah satu dari btg, atau bypass.

Menetapkan header HTTP untuk aplikasi tepercaya

Bagian ini hanya diperlukan jika Anda menggunakan server otorisasi yang dikontrol pelanggan. Dalam hal ini, Anda juga harus menggunakan SMARTproxy atau proxy serupa.

Beberapa aplikasi tepercaya dapat melakukan panggilan langsung ke Cloud Healthcare API dengan cakupan izin di header HTTP yang ditentukan. Hal ini memungkinkan penegakan izin langsung tanpa memerlukan SMARTproxy atau proxy lain untuk mengonversi antara server otorisasi eksternal dan Google Cloud.

Misalnya, aplikasi Anda mungkin terdaftar untuk sebagian cakupan, seperti cakupan environment aplikasi, atau aplikasi mungkin menampilkan widget pilihan untuk menetapkan beberapa entri cakupan seperti purpose pengakses.

Pengguna tepercaya atau aplikasi tepercaya juga dapat menggunakan entri cakupan btg atau bypass, yang tunduk pada peninjauan pasca-audit.

Cloud Healthcare API menyediakan dukungan bawaan untuk penerapan Izin FHIR berdasarkan cakupan izin input. Administrator penyimpanan FHIR bertanggung jawab untuk membuat dan mengonfigurasi server otorisasi di luar Cloud Healthcare API yang memberikan cakupan izin.

Contoh token akses

Contoh berikut menunjukkan token akses yang dienkode dalam base64:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJjb25zZW50LnRva2VuLm9yZyIsImlhdCI6MTYxMjg4NDA4NSwiZXhwIjoxNjQ0NDIwMDg1LCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJkb2N0b3IuZ2FicmllbGFAZXhhbXBsZS5jb20iLCJzY29wZSI6Im9pZGMgYWN0b3IvUHJhY3RpdGlvbmVyLzEyMyBhY3Rvci9Hcm91cC85OTkgcHVycC92My9UUkVBVCBlbnYvQXBwL2FiYyJ9.fC7ljkVUUx8fwUOrJuONcrqA-WKC-k_Bclzlgds0Cq6H_gEe3nUjPlSOCTQsIdYB

Setelah mendekode token akses, Anda dapat melihat bahwa token tersebut berisi payload berikut:

{
  "iss": "consent.token.org",
  "iat": 1612884085,
  "exp": 1644420085,
  "aud": "www.example.com",
  "sub": "doctor.gabriela@example.com",
  "scope": "oidc actor/Practitioner/123 actor/Group/999 purp/v3/TREAT env/App/abc"
}

Mengonfigurasi SMARTProxy

SMARTProxy adalah proxy open source dari Google yang menyediakan fitur berikut:

  • Mengizinkan server FHIR Cloud Healthcare API menerima dan memvalidasi token akses yang mempertimbangkan izin.

  • Memungkinkan implementasi FHIR di Cloud Healthcare API untuk menyertakan token akses yang mempertimbangkan izin sebagai bagian dari pengelolaan dan model izin Cloud Healthcare API.

  • Mendukung fitur token untuk dukungan SMART di FHIR juga.

Saat Anda membuat permintaan untuk mengambil data dari Cloud Healthcare API melalui SMARTProxy, hal berikut akan terjadi:

  1. SMARTProxy menerima permintaan dari klien yang berisi token yang mengetahui izin.

  2. SMARTProxy memvalidasi token yang mengetahui izin melalui server otorisasi JWT yang Anda miliki.

  3. SMARTProxy membaca cakupan dari token yang mengetahui izin dan meneruskannya ke Cloud Healthcare API melalui header HTTP.

  4. Cloud Healthcare API menerima header dan memvalidasinya untuk menerapkan perintah izin pada permintaan. Cloud Healthcare API kemudian menampilkan respons melalui SMARTProxy ke klien.

Mengonfigurasi akun layanan Google Cloud

Proxy hanya dapat memiliki satu akun layanan Google Cloud. Jika beberapa klien menggunakan proxy yang sama, klien akan menggunakan akun layanan yang sama. Berhati-hatilah saat membagikan akun layanan kepada beberapa klien karena alasan berikut:

Misalnya, jika Anda memanggil Cloud Healthcare API secara langsung menggunakan Akun Google Anda untuk autentikasi, Log Audit Cloud akan mencatat alamat email Anda sebagai alamat email utama. Saat Anda menggunakan proxy untuk memanggil Cloud Healthcare API, proxy akan menggunakan akun layanannya sendiri dan alamat email akun utama adalah alamat email akun layanan dan akun asli tidak ditentukan.

Log audit

Log audit dibuat saat ada permintaan akses atau saat penerapan akses resource berubah.

Mengakses log audit

Jika log audit diaktifkan di penyimpanan FHIR, kolom metadata consentMode akan disertakan dalam log audit yang tersedia di Cloud Logging. consentMode dapat memiliki salah satu nilai berikut:

  • off: konfigurasi penyimpanan FHIR memiliki consentConfig.accessEnforced yang ditetapkan ke false dan tidak mengizinkan permintaan yang mempertimbangkan izin.

  • emptyScope: penyimpanan FHIR memiliki consentConfig.accessEnforced yang ditetapkan ke true, tetapi header cakupan izin tidak disertakan. Akibatnya, izin tidak diterapkan.

  • enforced: penyimpanan FHIR memiliki consentConfig.accessEnforced yang ditetapkan ke true dan header cakupan izin ada. Akibatnya, izin dinilai dan diterapkan pada permintaan.

  • btg: permintaan FHIR memiliki btg yang diberikan di header cakupan izin. Akibatnya, pemeriksaan izin dilewati. Permintaan ini dimaksudkan untuk digunakan dalam keadaan darurat dan hanya tunduk pada peninjauan pasca-audit.

  • bypass: permintaan FHIR hanya memiliki bypass yang diberikan di header cakupan izin. Akibatnya, pemeriksaan izin dilewati. Permintaan ini dimaksudkan untuk digunakan oleh alur kerja tepercaya (seperti administrator atau aplikasi tepercaya, bukan pengguna akhir) sehingga log audit ini berbeda dengan btg, yang digunakan untuk pemeriksaan tata kelola data.

Secara opsional, Anda dapat menetapkan access_determination_log_config ke VERBOSE untuk mencatat informasi selengkapnya tentang alasan permintaan disetujui atau ditolak.

Log audit perubahan penerapan akses

Saat resource dasar kompartemen berubah (misalnya, menghapus tag employee pasien): Kontrol akses pada resource yang diubah dan kompartemennya dapat berubah karena Kebijakan Cascading Admin. Tindakan ini akan memicu pengindeksan ulang pada semua resource kompartemennya. Progres pengindeksan ulang untuk setiap pembaruan resource basis kompartemen dapat dilacak di Cloud Logging dengan filter jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry".

Contoh log progres pengindeksan ulang cascade

{
  "insertId": "tz2gtza8",
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry",
    "state": "STATE_FINISHED",
    "affectedResources": "2",
    "lastUpdated": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ",
    "compartmentBaseResourceName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_RESOURCE_ID/_history/PATIENT_RESOURCE_VERSION"
  },
  "resource": {
    "type": "healthcare_fhir_store",
    "labels": {
      "location": "LOCATION",
      "dataset_id": "DATASET_ID",
      "fhir_store_id": "FHIR_STORE_ID",
      "project_id": "PROJECT_ID"
    }
  },
  "timestamp": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ",
  "severity": "INFO",
  "logName": "projects/PROJECT_ID/logs/healthcare.googleapis.com%2Fconsent_cascading_fhir",
  "receiveTimestamp": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
}

jsonPayload.state adalah status operasi pengindeksan ulang, jsonPayload.affectedResources adalah jumlah resource kompartemen yang diindeks ulang, dan jsonPayload.lastUpdated adalah stempel waktu pembaruan resource pasien. Jika operasi baru saja dimulai, jsonPayload.state="STATE_STARTED", dan jsonPayload.affectedResources tidak akan ada.

Batasan dan keterbatasan

Bagian ini menunjukkan batasan dan batas untuk FHIR R4, tetapi batasan dan batas yang sama berlaku untuk FHIR STU3.

Jenis Batasan dan kendala
Resource Single Consent
  • Hanya satu Consent.provision yang didukung, beberapa ketentuan atau ketentuan bertingkat tidak didukung.
  • Minimal 1 Consent.provision.actor, maksimal 25:
    • Consent.provision.actor.role harus berupa http://terminology.hl7.org/CodeSystem/v3-RoleCode.
    • Consent.provision.actor.code harus berupa GRANTEE atau HPOWATT.
  • Maksimal 1 Consent.provision.purpose:
    • Consent.provision.purpose.system harus berupa http://terminology.hl7.org/CodeSystem/v3-ActReason.
    • Consent.provision.purpose.code tidak kosong dan maksimal 13 karakter.
  • Maksimal 1 environment:
    • Consent.provision.extension.url harus berupa https://g.co/fhir/medicalrecords/Environment.
    • Gabungan panjang sistem dan kode harus kurang dari 15 karakter.
  • Jika memfilter menurut jenis resource, Consent.provision.class.system harus http://hl7.org/fhir/resource-types.
  • Jika memfilter menurut sumber data, Consent.provision.extension.url harus https://g.co/fhir/medicalrecords/DataSource.
  • Jika memfilter menurut tag data, Consent.provision.extension.url harus https://g.co/fhir/medicalrecords/DataTag.
    • Tag data dapat berupa ekstensi kompleks, bertingkat hingga satu tingkat, untuk mendeskripsikan kebijakan yang cocok dengan resource dengan semua tag yang ditentukan (ditafsirkan secara konjungtif).
    • Maksimal 5 tag bertingkat didukung.
  • Maksimum 100 nilai untuk semua atribut berulang, kecuali jika dijelaskan secara berbeda di baris ini.
Model penerapan
  • Setiap pasien dapat memiliki hingga 200 resource Izin active yang diterapkan secara bersamaan.
  • Setiap toko dapat memiliki hingga 200 kebijakan admin active yang diterapkan sekaligus.
  • Format ringkas khusus untuk kumpulan semua Perintah Izin di semua izin aktif untuk Pasien tertentu tidak boleh melebihi nilai minimum ukuran yang ditetapkan; biasanya ada kapasitas yang cukup untuk mengenkode ribuan perintah izin, kecuali jika string resource yang sangat panjang sangat banyak. Contoh:
    • Ratusan Izin di sumber data dan tag data unik, yang masing-masing sangat panjang, akan menghabiskan banyak ruang.
    • Satu Pasien dengan 3.000 entri ID resource Consent.provision.data.reference unik di banyak Izin aktif yang masing-masing menentukan Consent.provision.actor unik menggunakan ruang secara lebih agresif daripada ketentuan yang tidak menentukan batasan referensi data atau berisi banyak string referensi aktor yang sama.
  • Setiap resource dapat memiliki hingga 1.000 perintah izin dari semua Izin yang berlaku untuknya.
X-Consent-Scope
  • Minimal satu dan maksimal tiga entri actor.
  • Maksimum satu entri purp:
    • Setiap entri purp harus dalam format system/code (v3 adalah sistem terdaftar untuk http://terminology.hl7.org/CodeSystem/v3-ActReason).
    • Panjang kode harus kurang dari 13.
  • Maksimum satu entri env:
    • Setiap entri env harus dalam format system/code.
    • Gabungan panjang sistem dan kode harus kurang dari 15.
  • btg memerlukan minimal satu entri actor.
  • bypass memerlukan minimal satu entri actor dan satu entri env.
Metode yang didukung
Performa
  • ApplyConsents dan ApplyAdminConsents diskalakan dengan cara yang sama atau lebih baik daripada ImportResources.
  • Terkait permintaan berbasis izin:
    • Model izin kami telah dioptimalkan untuk performa penegakan operasi CRUD, termasuk penelusuran dalam skala besar di banyak resource dan banyak pasien.
    • Pembacaan setiap resource mungkin memiliki dampak marginal pada latensi permintaan, tetapi performa penelusuran bervariasi berdasarkan kueri dasar dan jumlah cakupan izin yang menyebabkan lebih banyak kriteria pengakses aktif selama penelusuran.
    • Sebaiknya jalankan pengujian performa Anda sendiri pada berbagai parameter permintaan FHIR yang representatif untuk menentukan karakteristik performa untuk kasus penggunaan Anda berdasarkan karakteristik data Anda, seperti jumlah resource dari jenis resource penelusuran tertentu yang ada di penyimpanan FHIR.
    • Solusi kami membuat penyerapan dan pembaruan semua resource, termasuk resource izin, menjadi ringan sehingga throughput selama penyerapan dan bentuk lain dari traffic tulis dapat dilanjutkan dengan dampak minimum.

Praktik terbaik

Bagian berikut menjelaskan praktik terbaik saat menggunakan Kontrol Akses FHIR.

Praktik terbaik umum

  • Jangan import resource FHIR dan panggil ApplyConsents atau ApplyAdminConsents secara paralel. Sebaiknya impor resource FHIR terlebih dahulu, lalu panggil ApplyConsents atau ApplyAdminConsents. Namun, jika resource yang akan diimpor tidak menyertakan resource Pasien atau Izin, model penegakan tidak akan terpengaruh dan memproses izin atau kebijakan admin tidak diperlukan.

  • Jangan membuat penelusuran kustom dan memanggil ApplyConsents secara paralel. Sebaiknya Anda melakukannya satu per satu.

  • Jika alur kerja Anda memerlukan pemanggilan beberapa ApplyConsents pada PatientScope yang tidak tumpang-tindih, ApplyConsents tersebut dapat dipanggil secara paralel.

  • ApplyAdminConsents dapat berjalan secara paralel dengan jumlah ApplyConsents apa pun, tetapi tidak dengan ApplyAdminConsents lain.

  • Saat menyiapkan proxy, batasi akun layanan IAM dengan izin hanya baca untuk menghindari penulisan data satu pasien ke catatan pasien lain.

  • Jangan gunakan proxy izin saat membuat atau memperbarui data.

  • Validasi semua permintaan tulis untuk mencegah modifikasi data lintas pasien yang tidak terduga.

  • Saat izin cascading diterapkan, resource dasar kompartemen harus diimpor terlebih dahulu, diikuti dengan resource kompartemen lainnya. Atau, semua resource kompartemen dapat digabungkan dalam satu paket dan diserap menggunakanfhir.executeBundle.

Menghapus resource Pasien

Saat menghapus resource Pasien, jika Anda juga ingin menghapus penerapan izin untuk pasien tersebut (terutama jika FhirStore.disableReferentialIntegrity bernilai benar), sebaiknya ikuti urutan operasi ini:

  1. Menghapus semua resource Izin yang termasuk dalam resource Pasien.

  2. Panggil ApplyConsents dengan filter PatientScope.

Untuk menyiapkan toko yang ada untuk akses izin, selesaikan langkah-langkah berikut:

  1. Gunakan UpdateFhirStore untuk menetapkan ConsentConfig dengan penerapan izin version sebagai V1 dan tetapkan accessEnforced ke true.

    curl -X PATCH \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{
          'consentConfig': {
            'version': 'V1',
            'accessEnforced': true
          }
        }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
  2. Memproses izin pasien atau kebijakan admin

    1. ApplyConsents untuk izin pasien
    curl -X POST \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{'validateOnly': false}" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
    1. ApplyAdminConsents untuk kebijakan admin dan kebijakan cascading admin.
    curl -X POST \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{
          'newConsentsList': {
              'names': [
              'projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/RESOURCE_ID_1/_history/VERSION_ID_1',
              ...
              'projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/RESOURCE_ID_N/_history/VERSION_ID_N'
              ]
          },
          'validateOnly': false
        }" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"

Seberapa sering menjalankan ApplyConsents atau ApplyAdminConsents

  • Saat kolom ConsentConfig tidak ditetapkan: Kolom ConsentConfig tidak ditetapkan saat penyimpanan FHIR pertama kali dibuat dan saat kolom ConsentConfig dihapus. Setelah kolom ConsentConfig dibatalkan penetapannya, Anda harus mengulangi menyiapkan toko untuk akses izin sebelum membuat permintaan berbasis izin untuk menghindari evaluasi kebijakan penerapan izin yang sudah tidak berlaku.

  • Saat model penegakan berubah: Saat resource Izin dibuat, diperbarui, atau dihapus, model penegakan akan berubah. Dalam kasus tersebut, Anda harus memanggil ApplyConsents atau ApplyAdminConsents agar perubahan ini diterapkan.

    • Jika Anda dapat melacak perubahan Pasien dengan Izin, sebaiknya gunakan filter PatientScope untuk menghindari pemrosesan ulang seluruh penyimpanan. Filter ini berguna untuk segera memuat ulang penerapan sekumpulan kecil Pasien.

    • Anda juga dapat menjalankan ApplyConsents secara berkala menggunakan filter TimeRange. Filter ini berguna jika pembaruan langsung tidak penting. Misalnya, permintaan berikut akan memuat ulang penerapan untuk perubahan izin antara pukul 00.00 UTC 20-09-2022 dan pukul 00.00 UTC 21-09-2022.

      curl -X POST \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{
           'validateOnly': false,
           'timeRange': {
             'start': '2022-09-20T00:00:00Z',
             'end': '2022-09-21T00:00:00Z',
           }
          }" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"

FHIR Consent Viewer menampilkan kebijakan kontrol akses. Kelas ini menyediakan tabel yang berisi cakupan izin untuk mewakili aturan Kontrol Akses FHIR.

Sebelum Anda dapat menggunakan Penampil Izin FHIR, pastikan hal berikut:

Untuk melihat FHIR Consent Viewer, selesaikan langkah-langkah berikut:

Langkah selanjutnya