# ヘルスアプリ向け患者同意プラットフォーム

> データレイヤーに組み込まれた同意：OAuth 2.1 および SMART スコープ、本人が選択した目的と有効期限、閲覧可能なアクセスログ、次回の要求での取り消し、およびアプリが引き続き所有するもの。

Source: https://developers.anpheros.com/ja/guides/patient-consent-platform

**患者同意プラットフォームにより、個人はどのアプリケーションが自身の健康記録を読み取りまたは変更できるか、その目的と期間を決定でき、いつでもそのアクセスを確認および取り消すことができます。** Anpheros は同意をデータレイヤーに組み込みます。アプリケーションは、本人が Anpheros 同意ページで承認した許可を通じてのみ患者の FHIR R4 レコードに到達します。その許可の下でのすべての読み取りおよび書き込みは、本人が確認できる場所に記録され、取り消しは次回の要求で有効になります。このページでは、その仕組み、アプリケーションが行う必要があること、および構築する必要がないことについて説明します。

<!-- visual:consent-flow -->

## データレイヤーにおける同意の重要性

ほとんどのヘルスケアアプリでは、同意を独自のデータベース内のチェックボックスとして記録し、アプリケーションコードでそれを強制します。これは、2番目のアプリ、クリニック連携、またはAI機能が同じデータにアクセスする必要が生じた場合に機能しなくなります。各アプリはルールを再実装する必要があり、個人は誰がアクセス権を持っているかを単一の場所で確認できません。レコードを保存するプラットフォームが同意も強制する場合、すべてのクライアントは同じルールに従い、個人は確認するためのアプリケーションの単一リストを得ることができます。

| | アプリケーション内のフラグとしての同意 | データレイヤー（Anpheros）における同意 |
|---|---|---|
| 強制される場所 | 各アプリケーションのコード内 | すべてのAPIリクエストで、プラットフォームによって |
| アクセスの範囲 | アプリが読み取ることを決定した内容 | 許可されたリソースタイプとカテゴリのみ |
| 有効期限 | 実装されることは稀 | 個人が選択：30日、90日、180日、または365日 |
| 個人が見るもの | アプリに依存 | すべてのアプリケーション、そのスコープと有効期限、およびアクセスログ |
| 取り消し | 手動で伝播する必要がある | 次のリクエストは失敗します。リフレッシュトークンは機能しなくなります |

## 患者が制御するもの

<!-- visual:consent-controls -->

## アプリケーションが同意を求める方法

Anpheros は OAuth 2.1 (PKCE 併用) および SMART on FHIR v2 スコープを使用します。アプリは、必要なスコープとオプションの目的とともに同意ページにユーザーを誘導します。承認後、アプリは正確に 1 人の患者に対して、アクセストークン (30 分) とローテーションするリフレッシュトークン (30 日) を受け取ります。

```ts
import { OAuthFlow, generatePkce } from '@anpheros/sdk';

const flow = new OAuthFlow({
  baseUrl: 'https://platform.anpheros.com',
  clientId: process.env.ANPHEROS_CLIENT_ID!,
  redirectUri: 'https://your.app/callback',
});
const pkce = await generatePkce();
const url = flow.authorizeUrl({
  scopes: ['patient/Observation.rs?category=laboratory', 'patient/Condition.rs', 'offline_access'],
  purpose: 'treatment',
  state: crypto.randomUUID(),
  pkce,
  lang: 'en',
});
// redirect the person to `url`; on the callback exchange the code (see the authentication guide)
```

`patient/Observation.rs?category=laboratory` のようなスコープは、検査結果への読み取りを制限します。カテゴリフィルターはサーバーによって強制されます。付与されていないリソースタイプは `403` を返し、付与されていない患者は `404` を返すため、ID を推測することはできません。

## 失効への対応

ユーザーが許可を取り消した場合、そのトークンを使用した次のリクエストは失敗し、リフレッシュトークンでアクセスを回復することはできません。すぐにクリーンアップするには、`consent.revoked` ウェブフックを購読してください。このウェブフックは、`grant_id`、表示されている患者ID、スコープ、および`revoked_at` を運びます。

```ts
await anpheros.webhooks.create('https://your.app/anpheros/hook', { events: ['consent.granted', 'consent.revoked'] });
```

## Anpheros が行わないこと

- マーケティングや研究参加など、データアクセス以外の目的での同意を収集しません。
- 法的根拠を決定しません。アクセスへの同意は 1 つの管理手段です。プライバシー通知、契約、処理記録は引き続きお客様の責任となります。
- プロジェクト固有の API キーは、グラントなしでプロジェクトが作成した患者を閲覧できます。同意は、他のアプリケーションからのアクセスを管理します。

## よくある質問

### 患者同意プラットフォームとは何ですか？
個人が自身の健康データへのアクセスをどのアプリケーションに許可したかを記録し、すべてのリクエストでその選択を強制し、誰が何にアクセスしたかを個人に表示し、アクセスを取り消せるようにするソフトウェアです。Anpherosでは、同意は個別のサービスではなく、FHIR R4レコードの一部として扱われます。

### Anpherosは患者同意にどの標準を使用しますか？
認可フローにはOAuth 2.1 with PKCEを、アプリケーションが読み書きできる内容にはSMART on FHIR v2 patient scopes（`patient/<Type>.<cruds>`にオプションの`?category=`フィルター付き）を使用します。OpenID Connectは、`openid fhirUser`を要求する際にIDトークンを追加します。

### 患者は自分のデータの一部にのみアクセスを制限できますか？
はい。アクセスは、付与されたスコープ内のリソースタイプとカテゴリに制限されます。例えば、検査結果のObservationのみです。それ以外のものはすべてエラーとして返されます。

### 同意はどのくらいの期間有効ですか？
同意ページで、個人が30日、90日、180日、または365日を選択します。その後、付与は期限切れとなり、アプリケーションは再度要求する必要があります。

### 患者はアプリケーションがアクセスをどのように使用したかを確認できますか？
はい。個人は、アクセス権を持つすべてのアプリケーション、そのスコープと有効期限、および各アプリケーションが読み書きした内容をリストしたアクセスログを確認できます。

### 同意が取り消された場合、どうなりますか？
そのアクセストークンを使用した次のリクエストは失敗し、リフレッシュトークンを使用して新しいトークンを取得することはできなくなります。また、サーバーが購読している場合は、`consent.revoked` webhookを受信します。

<!-- visual:cta-consent -->

## 関連情報

- [同意とアクセスモデル](https://developers.anpheros.com/ja/guides/consent): ルール全般
- [認証とOAuth](https://developers.anpheros.com/ja/guides/authentication): トークン、スコープ、コード交換
- [SMART on FHIR で患者同意を実装する方法](https://developers.anpheros.com/ja/guides/smart-on-fhir-backend)
- [Webhook](https://developers.anpheros.com/ja/guides/webhooks): `consent.granted` および `consent.revoked`
- [医療データ来歴の説明](https://developers.anpheros.com/guides/medical-data-provenance)
- [縦断的患者データAPI](https://developers.anpheros.com/ja/guides/longitudinal-patient-data-api)
