Interoperable Digital Identity and Patient Matching, published by HL7 International / Patient Administration. This guide is not an authorized publication; it is the continuous build for version 3.0.0-current built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/HL7/fhir-identity-matching-ig/ and changes regularly. See the Directory of published versions
| Page standards status: Informative |
Patient Matching - CMS Aligned Networks - token IAL2 requirement
This table cross-references the token names and related protocol objects in the source documents. The names do not all describe distinct OAuth token types: in particular, the TEFCA and CMS-aligned identity tokens are both described as CSP-issued OpenID Connect ID tokens, while an OpenID for Verifiable Presentations (OID4VP) VP Token carries presentations rather than serving as that identity assertion.
| Token or object | Issuer / source | Purpose and contents | Cross-reference and status |
|---|---|---|---|
| TEFCA IAS Identity Token | Credential Service Provider (CSP); TEFCA IAS SOP and unified identity-token discussion | CSP-issued identity assertion used by QHINs for patient-mediated record retrieval over TEFCA. The discussion identifies it as an OIDC ID token carrying identity-proofing claims. | A profile/use of an OIDC ID Token, not a separate OAuth grant or token class. |
| CMS-Aligned Networks CSP Identity Token / IAL2 Claims Token | CSP; CMS Patient Matching Proposal and unified identity-token discussion | The proposal defines an IAL2 Claims Token as a signed OIDC ID token issued after proofing to at least NIST IAL2. A patient-facing app includes it in a matching query; responders validate it and may use its verified demographic claims. | These are alternate names for the CMS-aligned CSP identity assertion in the cited material. They are the same broad token type as the TEFCA IAS Identity Token, but the documents describe different profiles and claim conventions. |
| Unified identity token, v1 / v2 | Working proposal in the unified identity-token discussion | Proposed single identity assertion usable by both TEFCA and CMS-aligned networks. v1 is a backwards-compatible payload superset; v2 is the cleaner OIDC4IDA-style payload using a verified_claims envelope and explicit assurance signaling. |
These are proposed payload versions of the CSP-issued OIDC ID Token, not additional OAuth token types. The discussion is explicitly non-normative. |
OIDC ID Token (id_token) |
OpenID Provider / CSP; CMS Patient Matching Proposal, unified identity-token discussion, and OID4VP specification copy | An OpenID Connect identity assertion about the authenticated subject. In the patient-matching documents, it carries CSP-issued identity and assurance claims. | The common token type underlying the TEFCA, CMS CSP, and proposed unified identity-token names. It is distinct from an OAuth access token. |
Access Token (access_token) |
Authorization Server; referenced in the CMS Patient Matching Proposal | Used to authorize access to a protected resource. The proposal mentions it only as the value whose hash may appear in the ID Token's optional at_hash claim. |
Distinct from the patient identity assertion; it does not by itself establish IAL2 assurance. Other profiles can carry verified claims in access tokens, but the cited patient-matching documents do not define its format or lifecycle. |
Refresh Token (refresh_token) |
Authorization Server; discussed in the unified identity-token discussion | Used to obtain replacement access tokens without repeating the initial authorization flow. | The discussion says a 90-day rolling refresh window is referenced informally and calls for a separate specification; it does not define a refresh-token payload or complete behavior. It is not an ID Token. |
VP Token (vp_token) |
Wallet / credential holder in an OID4VP flow; OID4VP specification copy and the SMART Health Check-in Protocol | Carries one or more Verifiable Presentations assembled from requested credentials. OID4VP allows it in the Authorization Response or Token Response, depending on the response type. The SMART Health Check-in profile keys it by smart-checkin, with a one-element Presentation array containing the clinical response object. |
Despite its name, this is not the CSP's OIDC ID Token or an OAuth access token. The SMART profile specifies the shape of its VP Token value. |
id_token is the relevant OIDC token for the TEFCA
and CMS-aligned identity claims. The two network-specific names describe
profiles of that token; the unified v1/v2 entries describe proposed ways to
align their payloads.access_token and refresh_token serve OAuth
authorization and renewal purposes. The identity-token documents do not
specify a complete access-token or refresh-token profile.vp_token is a presentation response,
not another name for id_token or access_token. The check-in protocol uses
that response to carry its clinical payload.See RFC 7519, OpenID Connect Core, and OpenID Connect for Identity Assurance.
This matrix compares payload encodings, not conformance requirements or interchangeability. Claim names are case-sensitive. The columns use these specific sources:
verified_claims.claims; M abbreviates
verified_claims.verification. For an array of verified claim sets, apply
those paths within each set. Ordinary top-level OIDC claims can coexist with
verified claims and must not be treated as verified merely because the
envelope is also present.email_verified,
phone_number_verified) is distinct from identity proofing under a trust
framework. Unified v1 retains a mix of draft fields without an explicit
verified-claims envelope; the matrix does not infer verification for every
field, particularly nicknames and alternate-name types.The table below is represented in a shared Excel spreadsheet for better visibility The spreadsheet may be more advanced than the table below.
| Data element | OIDC Core | OIDC4IDA | TEFCA v3 | CMS v3.4 | Unified v1 (draft) | Unified v2 (draft) | OID4VP |
|---|---|---|---|---|---|---|---|
| First Name | given_name |
V C.given_name |
V given_name |
V given_name |
given_name |
V C.given_name |
P |
| Middle Name | middle_name |
V C.middle_name |
V middle_name |
V middle_name |
middle_name |
V C.middle_name |
P |
| Middle Initial | ND; no separate claim | ND; extension needed | V middle initial (literal table label; see notes) |
ND | middle_initial |
ND | P |
| Last Name | family_name |
V C.family_name |
V family_name |
V family_name |
family_name |
V C.family_name |
P |
| Full Name | name |
V C.name |
ND | ND | name_full |
ND | P |
| Name Suffix | ND; may be part of name |
ND; extension needed | V suffix |
ND | suffix; name_historical[].suffix |
ND | P |
| Nickname / Preferred Name | nickname |
Ordinary nickname; no implied identity proofing |
ND | ND | nickname |
Excluded from main verified payload | P |
| Historical Legal Names | ND | ND; extension needed | V URI-named extension; exact suffix unspecified | V historical_name |
name_historical[] with given_name, middle_name, family_name, suffix, name_type |
V C.name_historical[] (proposed) |
P |
| Date of Birth | birthdate |
V C.birthdate |
V birthdate |
V birthdate |
birthdate |
V C.birthdate |
P |
| Gender / Legal Sex (not equivalent) | gender |
V C.gender, when asserted as verified |
V gender; semantics not detailed in table |
gender described as legal sex or gender at birth |
Intentionally excluded pending semantic alignment | V C.sex_legal (custom) |
P |
| Email Address | email |
V C.email; ordinary email can coexist |
V email |
V email |
email |
V C.email |
P |
| Email Control Verified | email_verified (boolean) |
Ordinary email_verified can coexist with C.email |
Not separately listed | email_verified SHALL NOT be populated |
Excluded as discussed errata | Omitted; verified-envelope membership instead | P |
| Phone Number | phone_number |
V C.phone_number; ordinary phone_number can coexist |
V phone_number |
V phone_number |
phone_number |
V C.phone_number |
P |
| Phone Control Verified | phone_number_verified (boolean) |
Ordinary phone_number_verified can coexist with C.phone_number |
Not separately listed | phone_number_verified SHALL NOT be populated |
ND | Omitted; verified-envelope membership instead | P |
| Historical Phone Numbers | ND | ND; extension needed | V URI-named extension; exact suffix unspecified | historical_phone_number |
phone_number_historical[] |
V C.phone_number_historical[] |
P |
| Current Address | address (object) |
V C.address |
V address (single object) |
V address |
address (object or array) |
V C.address (object in example) |
P |
| Formatted Address | address.formatted |
V C.address.formatted |
V address.formatted |
ND | address.formatted |
V C.address.formatted |
P |
| Street Address | address.street_address |
V C.address.street_address |
V address.street_address |
V address.street_address |
address.street_address |
V C.address.street_address |
P |
| Address Line 2 | No separate member; multiple lines in address.street_address |
Same within V C.address.street_address |
No separate member | No separate member | address.address_line2 (custom) |
No separate member | P |
| City | address.locality |
V C.address.locality |
V address.locality |
V address.locality |
address.locality |
V C.address.locality |
P |
| State / Region | address.region |
V C.address.region |
V address.region |
V address.region |
address.region |
V C.address.region |
P |
| ZIP / Postal Code | address.postal_code |
V C.address.postal_code |
V address.postal_code |
V address.postal_code |
address.postal_code; separate ["ZIP+4"] |
V C.address.postal_code |
P |
| Country | address.country |
V C.address.country |
V address.country |
V address.country |
address.country |
V C.address.country |
P |
| Historical Addresses | ND | ND; extension needed | V historical_address |
V historical_address[] if validated by CSP |
historical_address (object or array) |
V C.address_historical (object in example) |
P |
| Full SSN / ITIN | ND | ND; extension needed | Not listed; URI-named extension if supplied | ssn_itin |
SSN; itin |
ND | P |
| Last Four SSN / ITIN Digits | ND | ND; extension needed | Not listed; URI-named extension if supplied | ssn_itin_short |
SSN_Last_four_digits (SSN) |
V C.ssn_last4 (custom; SSN) |
P |
| Legal Identity Document | ND | M.evidence[] entries of type document, with document_details |
Not listed; URI-named extension if supplied | legal_id object (for discussion): legal_id_issuer, id_number |
legal_id_issuer object: issuer, type, identifier (assumed draft structure) |
ND | P |
| Stable CSP Person Identifier | sub; distinct stable identifier not defined |
Inherits sub; distinct stable identifier not defined |
csp_issued_identifier (optional; stable across accounts) |
uuid (for discussion) |
csp_uuid |
uuid |
P |
| Issuer | iss |
iss |
iss |
iss |
iss |
iss |
Credential/presentation-specific issuer, not a common vp_token.iss |
| Subject Identifier | sub |
sub |
sub (inherited OIDC requirement) |
sub |
sub |
sub |
Credential/holder-specific; not a common vp_token.sub |
| Audience | aud includes client ID |
Inherits OIDC aud |
aud = IAS Provider HCID URI |
aud = app client ID |
aud (string or array) |
aud |
Format-specific verifier binding; not a common vp_token.aud |
| Issued At / Expiration | iat; exp |
Inherits OIDC iat; exp |
iat; exp (short-lived) |
iat; exp with exp <= iat + 300 |
iat; exp |
iat; exp |
Credential/presentation-specific |
| Token Identifier | jti if used; not Core-required |
Inherits JWT/OIDC jti if used |
jti |
jti |
jti |
jti |
Format-specific; no common vp_token.jti |
| Authentication Time | auth_time |
Inherits OIDC auth_time |
OIDC auth_time when applicable; not separately listed |
auth_time |
auth_time |
auth_time |
Not an OIDC authentication-time claim for all presentations |
| Request Nonce | nonce |
Inherits OIDC nonce |
OIDC nonce when applicable; not separately listed |
Not listed | Not declared in gist | nonce |
Request nonce; response binding is format-specific |
| Access Token Hash | at_hash |
Inherits OIDC at_hash |
OIDC at_hash when applicable; not separately listed |
at_hash (optional) |
at_hash |
at_hash |
Not a common VP claim |
| Trust Framework / Identity Assurance | acr is authentication context, not a generic IAL claim |
M.trust_framework; M.assurance_level |
IAL2 required by profile; no separate framework/IAL claim listed | tToken_policy.trust_framework; tToken_policy.assurance_level (literal source spelling) |
No explicit framework/IAL claim in gist | M.trust_framework; M.assurance_level; identity_assurance_level (proposed) |
Credential-specific assurance; no universal IAL claim |
| Payload / Policy Version | ND | No universal token-version claim | tefca_ial2claims_version (SHOULD include; default "1.0") |
ND | No explicit version claim | Computed vs. explicit version remains open | Protocol/format-specific |
YYYY-MM-DD birthdate and uses address.region,
unlike issues described for older TEFCA drafts. Its table prints
middle initial with a space; this matrix preserves that label rather than
assuming an authoritative middle_initial wire key.identity_assurance_level are proposed additions, not present in the example.
Unified v1's legal-document structure is explicitly an assumption in the gist.
CMS's tToken_policy spelling is reproduced as published, not corrected to
an inferred name.gender, legal sex,
SSN, ITIN, historical aliases, and historical legal names require semantic
alignment before translation. A document used as verification evidence is
not automatically a verified end-user document-identifier claim.vp_token. Check-in uses
vp_token["smart-checkin"][0] for its clinical response; demographics may
be in returned FHIR resources or other requested artifacts, not a universal
given_name field. The P cells deliberately avoid inventing such paths.Patient as a user will fit OIDC token, but we also need to consider use-cases where the requester is not the patient themselves, such as caregivers or authorized representatives.
Patient presenting while unable to use technology to authenticate themselves poses additional challenges for identity verification and token handling.
Practitioner as a user is a use-case that should also be addressed. Concern that leaving this use-case till later may result in missing important considerations for identity verification and token handling specific to practitioners.
Authorized representative is a is also important. The relationship between the Patient and the representative must be carefully considered. The solution may be in-scope for the technical solution, or may leverage other services such as a Consent Management system.
Identity element quality is a concern. Especially regarding historic values. These are often not suitable for matching and have inconsistencies and gaps.