Health Information Exchange
0.1.0 - ci-build Costa Rica

Health Information Exchange - Local Development build (v0.1.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions

Patient Application Launch [HIX-2]

Patient Application Launch [HIX-2] es la transacción con la que una aplicación elegida por una persona obtiene del Authorization Server un token destinado al Record Locator Service, cuyo contexto de paciente es la identidad maestra de esa persona. Ningún perfil IHE la define, y esta página la especifica.

Alcance

Con ese token, la aplicación localiza y recupera como cualquier consumidor, limitada a ese paciente, como describe el caso de acceso del paciente a su expediente.

Nota. El consentimiento del que habla esta página es el de OAuth 2.0, es decir, la aprobación con la que la persona permite a una aplicación actuar en su nombre ante el Record Locator Service. No debe confundirse con el consentimiento del paciente sobre la divulgación de sus documentos, que decide qué puede ver cada solicitante y que describe la Opción de Consentimiento. HIX-2 no registra ni modifica ese segundo consentimiento.

HIX-2 es ITI-71 con el grant Authorization Code y PKCE (Proof Key for Code Exchange), más la renovación del token con el grant de refresh token. IUA limita ITI-71 a los grants Authorization Code y Client Credential, y admite que sus actores soporten otros, como el de refresh token (IUA, §34.4.1.1)1. Para el contexto de paciente, HIX-2 adopta determinados elementos de SMART App Launch, que IUA procura no contradecir (IUA, Relation to SMART-on-FHIR)2. Tiene identificador propio porque en ella el Authorization Server fija el contexto de paciente, algo que ITI-71 no prevé.

HIX-2 aplica las reglas de ITI-71 de la página de Autorización, con tres diferencias. El resource nombra al Record Locator Service y el aud del token solo lo nombra a él. El token lleva el propósito de uso y el contexto de paciente, y la organización solo si el registro del Authorization Server asocia una a la aplicación. Y la aplicación solo puede obtener los scopes de ITI-66, ITI-67 e ITI-68.

Decisiones frente a IUA y SMART App Launch

La Tabla 3.3-1 reúne qué toma HIX-2 de IUA y de SMART App Launch y en qué se aparta de ellos. El resto de la página aplica estas decisiones sin repetirlas.

Tabla 3.3-1: Decisiones de HIX-2 frente a IUA y SMART App Launch

Aspecto IUA SMART App Launch HIX-2
Lanzamiento No lo define EHR Launch o Standalone Launch3 Solo Standalone Launch, sin el parámetro launch
Destino del token resource, opcional y de un solo valor4 aud, obligatorio, con resource como sinónimo opcional5 resource, obligatorio y único
redirect_uri Obligatorio solo si la aplicación tiene varias URI registradas4 Obligatorio6 Obligatorio
PKCE code_challenge obligatorio y método opcional4 Solo S256, nunca plain7 Solo S256
Scopes Uno por transacción de MHD, como ITI-678 De recurso, de contexto y de identidad9 Los identificadores de transacción, launch/patient y fhirUser de SMART, y openid y offline_access de OpenID Connect
patient al renovar No lo define Opcional10 Obligatorio
fhirUser en la introspección No lo define Recomendado11 No exigido

HIX exige patient en toda respuesta de token, también al renovar, para que la aplicación conozca siempre el contexto vigente. SMART lo deja opcional al renovar10. No exige fhirUser en la introspección, porque el Record Locator Service confina cada operación con patient.

SMART App Launch pide el destino con un parámetro llamado aud y lo declara equivalente al resource de RFC 8707 (SMART App Launch, Obtain authorization code)5. HIX usa resource, porque aud es el nombre del claim con el que el Authorization Server fija la audiencia del token, que no tiene por qué coincidir con lo que el cliente pidió. El Authorization Server SHOULD NOT aceptar el parámetro aud en lugar de resource. Si una comunidad decide aceptarlo, por ejemplo para admitir aplicaciones SMART ya existentes, el Authorization Server lo trata exactamente como un resource.

Nota. SMART App Launch exige a sus servidores aceptar el parámetro aud y deja resource como sinónimo opcional5. RFC 8707 separa la intención de la restricción, porque el Authorization Server restringe la audiencia del token a partir del resource, la comunica en el claim aud y puede usar el mismo valor o derivar de él otro identificador (RFC 8707, §2)12. Por esta razón, HIX-2 se aparta en este punto de SMART App Launch.

Descubrimiento del Authorization Server

SMART App Launch pide que todo endpoint FHIR que exige autorización sirva en su URL base, bajo /.well-known/smart-configuration, un documento con los endpoints de autorización y las capacidades que admite (SMART App Launch, Conformance)13. Es así como una aplicación SMART encuentra el Authorization Server a partir de la URL que va a consultar.

Experimental. El Record Locator Service SHALL hacer disponible el documento /.well-known/smart-configuration en la URL base FHIR que expone a la aplicación del paciente, y el documento SHALL describir los endpoints y las capacidades del Authorization Server. Que lo sirva el propio Record Locator Service o lo redirija al Authorization Server lo decide la implementación. La Tabla 3.3-2 dice qué declara HIX en él.

Tabla 3.3-2: Contenido del documento smart-configuration

Campo Valor en HIX
issuer y jwks_uri Los del Authorization Server como OpenID Provider
authorization_endpoint y token_endpoint Los del Authorization Server
grant_types_supported authorization_code
code_challenge_methods_supported Solo S256
capabilities launch-standalone, context-standalone-patient, sso-openid-connect, client-public, client-confidential-symmetric y permission-offline. Ninguna de las capacidades de scopes de recurso, porque HIX no los usa

Ejemplo. La aplicación pide el documento a partir de la URL base FHIR del Record Locator Service.

GET /.well-known/smart-configuration HTTP/1.1
Accept: application/json
HTTP/1.1 200 OK
Content-Type: application/json

{
  "issuer": "<issuer>",
  "jwks_uri": "<jwks_uri>",
  "authorization_endpoint": "<authorization_endpoint>",
  "token_endpoint": "<token_endpoint>",
  "grant_types_supported": ["authorization_code"],
  "code_challenge_methods_supported": ["S256"],
  "capabilities": [
    "launch-standalone",
    "context-standalone-patient",
    "sso-openid-connect",
    "client-public",
    "client-confidential-symmetric",
    "permission-offline"
  ]
}

El Authorization Server sigue publicando sus metadatos de IUA con ITI-103, y los dos documentos describen los mismos endpoints.

Roles de actor

La Tabla 3.3-3 muestra los roles de los actores de HIX en la transacción, según la sección 2.4.

Tabla 3.3-3: Roles de actor

Actor Rol Qué hace
Aplicación del paciente Authorization Client Pide, en nombre de la persona que la usa, un token para el Record Locator Service con el contexto de paciente
Authorization Server Authorization Server y OpenID Provider Autentica a la persona, obtiene su autorización, fija el contexto de paciente y emite los tokens

Durante el lanzamiento, el Authorization Server también actúa como Patient Identifier Cross-reference Consumer de PIXm. Resuelve la identidad de la persona ante el Master Patient Index mediante ITI-83, con un token propio que obtiene con el grant Client Credentials, según la sección 2.2. Esa consulta no forma parte de HIX-2.

Estándares referenciados

HIX-2 se apoya en los documentos siguientes.

  • IUA, Internet User Authorization, revisión 2.5, junio de 2026. Aporta ITI-71 con el grant Authorization Code y su evento de auditoría.
  • SMART App Launch, versión 2.2.0, de 2024. Aporta el Standalone Launch, los scopes launch/patient y fhirUser, el parámetro patient y el claim fhirUser.
  • OpenID Connect Core 1.0, con la fe de erratas 2, diciembre de 2023. Aporta la autenticación de la persona, el id_token y los scopes openid y offline_access.
  • RFC 6749, The OAuth 2.0 Authorization Framework, octubre de 2012. Aporta el grant de refresh token y las respuestas de error.
  • RFC 7636, Proof Key for Code Exchange by OAuth Public Clients, septiembre de 2015. Aporta code_challenge, code_verifier y el método S256.
  • RFC 8707, Resource Indicators for OAuth 2.0, febrero de 2020. Aporta el parámetro resource y el error invalid_target.
  • RFC 9700, Best Current Practice for OAuth 2.0 Security, enero de 2025. Aporta la protección de los refresh tokens de los clientes públicos.

Mensajes

La Figura 3.3-1 muestra los mensajes de la transacción. La petición de autorización y su respuesta pasan por el navegador de la persona. Las peticiones de token van directamente al token endpoint. La renovación solo ocurre si la aplicación obtuvo un refresh token.

Patient Application Launch

Figura 3.3-1: Patient Application Launch

Petición de autorización

Evento desencadenante

La aplicación inicia un lanzamiento cuando la persona la abre y no tiene un token vigente para el Record Locator Service ni un refresh token con el que renovarlo. También lo inicia cuando el Authorization Server rechaza una renovación con invalid_grant. Redirige el navegador al authorization endpoint, que descubre con el documento smart-configuration o con ITI-103, como explica el descubrimiento del Authorization Server.

Semántica del mensaje

La petición es un GET al authorization endpoint, con los parámetros en la query, como define IUA para el grant Authorization Code (IUA, §3.71.4.1.2.2)4. La Tabla 3.3-4 dice qué valor fija HIX en cada parámetro.

Tabla 3.3-4: Parámetros de la petición de autorización

Parámetro Valor en HIX
response_type code
client_id El identificador con el que la aplicación está registrada en el Authorization Server
redirect_uri Una de las URI de redirección registradas para la aplicación. El Authorization Server SHALL compararla por coincidencia exacta, como exige RFC 9700 (RFC 9700, §2.1)14
state Obligatorio, como exige IUA (IUA, §3.71.4.1.2.2)15. Un valor impredecible que la aplicación genera para cada petición
resource Uno solo, el identificador del Record Locator Service como Resource Server
code_challenge El reto que la aplicación deriva de su code_verifier
code_challenge_method S256
scope openid, fhirUser, launch/patient y los identificadores de las transacciones que la aplicación va a realizar, como ITI-67 e ITI-68. Además, offline_access si la aplicación quiere un refresh token

Ninguno de los scopes de SMART ni de OpenID Connect autoriza operaciones ante el Record Locator Service. Lo que autoriza son los identificadores de transacción, según la regla 2 para las peticiones a un Resource Server. La aplicación pide solo los que necesita, como IUA exige a todo Authorization Client (IUA, §3.71.5)16. El Authorization Server SHALL NOT conceder a una aplicación del paciente identificadores de transacción distintos de ITI-66, ITI-67 e ITI-68, porque la aplicación solo localiza y recupera los documentos de la persona.

Ejemplo. La aplicación del paciente pide autorización para buscar y recuperar documentos, y un refresh token.

GET /authorize?response_type=code&client_id=<client_id>&redirect_uri=<redirect_uri>&state=<state>&resource=<rls_resource>&code_challenge=<code_challenge>&code_challenge_method=S256&scope=openid+fhirUser+launch/patient+offline_access+ITI-67+ITI-68 HTTP/1.1
Acciones esperadas

El Authorization Server valida los parámetros, autentica a la persona y obtiene su autorización para la aplicación, como IUA exige antes de emitir el código (IUA, §3.71.4.1.3.2)17. Cómo se verifica la identidad de la persona es política de la comunidad, según la sección 2.6.

Si la petición lleva offline_access, el Authorization Server SHALL obtener en cada lanzamiento el consentimiento de la persona para emitir el refresh token, sin reutilizar uno guardado. La aplicación no necesita enviar prompt=consent.

Nota. OpenID Connect exige al OpenID Provider obtener siempre el consentimiento antes de emitir un refresh token para el acceso sin conexión, y advierte que un consentimiento guardado no siempre basta. Para asegurarlo, la petición lleva prompt=consent, salvo que otras condiciones del procesamiento permitan el acceso sin conexión (OpenID Connect Core, §11)18. En HIX esa condición es que el Authorization Server pide el consentimiento en cada lanzamiento y nunca reutiliza uno guardado, que es lo mismo que obtendría prompt=consent. Por esta razón, HIX-2 no exige a la aplicación enviar prompt=consent.

Antes de emitir el código, el Authorization Server resuelve mediante ITI-83 la identidad verificada de la persona a su identidad maestra y la fija como contexto de paciente de la autorización, según sus requisitos de la sección 2.2. Ese contexto vale para el canje del código y para todas las renovaciones de la misma autorización.

El Authorization Server fija también el propósito de uso desde su propio registro, PATRQT cuando quien actúa es la propia persona, según la Tabla 2.2-3. Nunca lo toma de la petición, según la regla 3 para las peticiones a un Resource Server.

Nota. HIX-2 no fija cómo actúa una persona en nombre de otra, como un familiar autorizado o un representante legal. Si una comunidad lo admite, define cómo se acredita esa relación, qué paciente queda como contexto y qué propósito de uso lleva el token, como FAMRQT o PWATRNY.

Respuesta de autorización

Evento desencadenante

El Authorization Server responde cuando concede la autorización o cuando la rechaza.

Semántica del mensaje

Si concede la autorización, el Authorization Server redirige el navegador a la redirect_uri con code y state4. Si la rechaza, redirige con error y el state de la petición (RFC 6749, §4.1.2.1)19.

Si la redirect_uri o el client_id faltan o no son válidos, el Authorization Server SHALL NOT redirigir el navegador y SHOULD informar del error a la persona, como exige RFC 674919.

El Authorization Server SHALL rechazar la petición en las condiciones de la Tabla 3.3-5. Los códigos son los que prevén RFC 7636 para PKCE20, RFC 8707 para el recurso12 y RFC 6749 para los demás19.

Tabla 3.3-5: Rechazos en el authorization endpoint

Condición Error Motivo
Falta code_challenge, o code_challenge_method no es S256 invalid_request HIX admite solo S256
La petición no lleva exactamente un resource, contando aud si la comunidad lo acepta, o ese valor no es el Record Locator Service invalid_target El token de la aplicación vale solo ante el Record Locator Service, como resume la Tabla 2.6-1
El scope pide una transacción distinta de ITI-66, ITI-67 e ITI-68 invalid_scope La aplicación del paciente solo localiza y recupera, como fija la sección 2.4
El scope pide transacciones sin launch/patient invalid_scope Un token con transacciones y sin contexto de paciente no quedaría confinado al expediente de la persona
La identidad verificada de la persona no resuelve a una identidad maestra access_denied El Authorization Server no fija un contexto de paciente sin identidad maestra, como establece la sección 2.2
El Master Patient Index no responde server_error Sin la identidad maestra no hay contexto que fijar. RFC 6749 reserva temporarily_unavailable para la sobrecarga o el mantenimiento del propio Authorization Server

Ejemplo. El Authorization Server rechaza un lanzamiento cuya identidad verificada no resuelve a una identidad maestra.

HTTP/1.1 302 Found
Location: <redirect_uri>?error=access_denied&state=<state>
Acciones esperadas

La aplicación comprueba que state coincide con el valor que envió6. Si recibe el código, lo canjea en el token endpoint. Si recibe un error, no obtiene token.

Petición de token

Evento desencadenante

La aplicación envía la petición con el grant Authorization Code al recibir el código en la redirección. Usa el grant de refresh token cuando vence su token y conserva un refresh token vigente.

Semántica del mensaje

La petición es un POST al token endpoint, con los parámetros en el body en formato application/x-www-form-urlencoded. El canje del código sigue IUA4 y SMART App Launch (SMART App Launch, Obtain access token)21. La renovación sigue RFC 6749 (RFC 6749, §6)22 y SMART App Launch10. La Tabla 3.3-6 dice qué valor fija HIX en cada parámetro de los dos grants.

Tabla 3.3-6: Parámetros de la petición de token

Parámetro Canje del código Renovación
grant_type authorization_code refresh_token
code El código recibido en la redirección No se envía
redirect_uri La misma de la petición de autorización No se envía
code_verifier El valor del que la aplicación derivó el code_challenge No se envía
refresh_token No se envía El último refresh token que recibió la aplicación
scope No se envía Se omite, o pide una parte del scope concedido
client_id Lo envía la aplicación pública. La confidencial se autentica con su credencial17 Igual que en el canje

SMART App Launch exige el client_id en el canje de una aplicación pública21. La aplicación pública SHALL enviarlo también al renovar, como admite RFC 6749 (RFC 6749, §3.2.1)23, para que el Authorization Server compruebe a qué aplicación emitió el refresh token.

Ejemplo. Una aplicación pública canjea el código y, más tarde, renueva su token.

POST /token HTTP/1.1
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code=<code>
&redirect_uri=<redirect_uri>
&code_verifier=<code_verifier>
&client_id=<client_id>
POST /token HTTP/1.1
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token
&refresh_token=<refresh_token>
&client_id=<client_id>
Acciones esperadas

En el canje, el Authorization Server verifica el código y comprueba que el code_verifier corresponde al code_challenge de la autorización, como exigen IUA17 y SMART App Launch6.

Al renovar, el Authorization Server valida el refresh token y comprueba que se emitió a esa aplicación22. El Authorization Server SHALL emitir el token renovado con el contexto de paciente fijado en la autorización, sin volver a consultar ITI-83, y sin ampliar el scope concedido.

Con una aplicación pública, el Authorization Server SHALL emitir un refresh token nuevo en cada renovación e invalidar el anterior, o ligar el refresh token a esa instancia de la aplicación, como exige RFC 9700 para los clientes públicos (RFC 9700, §4.14.2)24. Si rota los refresh tokens y recibe uno ya invalidado, SHALL revocar el refresh token vigente de esa autorización. RFC 9700 describe esa revocación como la respuesta de la rotación a un refresh token reutilizado24.

Respuesta de token

Evento desencadenante

El Authorization Server responde a cada petición de token con el token si la concede o con un error si la rechaza.

Semántica del mensaje

El Authorization Server responde a una petición concedida con el código HTTP 200, un body JSON y los headers Cache-Control: no-store y Pragma: no-cache que exige IUA (IUA, §3.71.4.2.2)25. La Tabla 3.3-7 dice qué valor fija HIX en cada parámetro. La respuesta a una renovación tiene la misma forma, salvo por el id_token. El Authorization Server SHALL incluir patient en toda respuesta concedida, también en la de una renovación.

Tabla 3.3-7: Parámetros de la respuesta de token

Parámetro Valor en HIX
access_token El token de la persona, destinado al Record Locator Service. Lleva el propósito de uso y el contexto de paciente, y la organización solo si el registro del Authorization Server asocia una a la aplicación. Lo resume la Tabla 2.6-1
token_type Bearer, porque la aplicación lo presenta con ITI-72
expires_in La vida del token en segundos, la que fije el Authorization Server
scope Solo los identificadores de transacción concedidos, que pueden diferir de los pedidos
id_token El de OpenID Connect, que acredita la autenticación de la persona y lleva fhirUser. Al renovar puede faltar, y si viene conserva el iss y el sub del original26
refresh_token Solo si la aplicación pidió offline_access y el Authorization Server le concede la renovación
patient Siempre, también al renovar. Es el identificador del recurso Patient de la identidad maestra fijada como contexto de paciente
fhirContext HIX no lo fija. SMART App Launch lo admite para contexto adicional, y ningún actor de HIX depende de él

El Authorization Server SHALL incluir en el scope del access token solo identificadores de transacción. openid, fhirUser, launch/patient y offline_access los consume él al emitir el token y no aparecen en él. El scope de la respuesta describe el access token (RFC 6749, §5.1)27, y por eso lleva solo esos identificadores, según la regla 2 para las peticiones a un Resource Server. La aplicación sabe qué obtuvo de OpenID Connect y de SMART por los parámetros que recibe, es decir, id_token, refresh_token y patient.

La respuesta distingue a quien actúa del paciente cuyo expediente se consulta. sub y fhirUser identifican a la persona que actúa, y patient al paciente. En el acceso propio son la misma persona, pero ningún actor deduce el paciente de sub ni de fhirUser, y el Record Locator Service confina cada operación solo con patient.

Ejemplo. El Authorization Server responde al canje del código con el access token, el id_token, un refresh token y el contexto de paciente.

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache

{
  "access_token": "<access_token>",
  "token_type": "Bearer",
  "expires_in": 300,
  "scope": "ITI-67 ITI-68",
  "id_token": "<id_token>",
  "refresh_token": "<refresh_token>",
  "patient": "<patient_id>"
}

Si rechaza la petición, el Authorization Server responde con la respuesta de error de OAuth 2.0 y el código HTTP 400 (RFC 6749, §5.2)28. SHALL rechazarla en las condiciones de la Tabla 3.3-8.

Tabla 3.3-8: Rechazos en el token endpoint

Condición Error Motivo
El code_verifier no corresponde al code_challenge de la autorización invalid_grant20 Lo exige PKCE
El Authorization Server no puede emitir el token renovado con el contexto de paciente fijado en la autorización invalid_grant La aplicación vuelve a la petición de autorización, que resuelve el contexto otra vez
La renovación pide un scope mayor que el concedido invalid_scope RFC 6749 no permite ampliar el scope al renovar22

Que solo la autorización de una persona fije un contexto de paciente lo protege la Tabla 3.1-1 para ITI-71 y la Tabla 3.2-3 para HIX-1.

Acciones esperadas

La aplicación valida el id_token conforme a OpenID Connect, como exige SMART App Launch29. Presenta el access token con ITI-72 ante el Record Locator Service en las transacciones que su scope autoriza, y ante ningún otro actor. No pide ni asume un paciente distinto del que dice patient, como fija la sección 2.2. Si recibe un refresh token nuevo al renovar, descarta el anterior22. Si una renovación se rechaza con invalid_grant, vuelve a la petición de autorización, que resuelve el contexto otra vez.

El Record Locator Service comprueba el token con ITI-102 y toma el contexto de paciente de la respuesta de la introspección, como fija la sección 2.2. El Authorization Server SHALL incluir patient en esa respuesta. Con él, el Record Locator Service confina cada operación al paciente, como describe la sección 2.5.

Ejemplo. Al recibir una búsqueda ITI-67 de la aplicación, el Record Locator Service introspecciona el token con sus propias credenciales. aud nombra solo al Record Locator Service, sub a la persona que inició sesión y patient repite el contexto de paciente. La extensión ihe_iua lleva el propósito de uso PATRQT, porque quien actúa es la propia persona.

POST /introspect HTTP/1.1
Authorization: Basic Base64(<client_id>:<client_secret>)
Accept: application/json
Content-Type: application/x-www-form-urlencoded

token=<access_token>
HTTP/1.1 200 OK
Content-Type: application/json

{
  "active": true,
  "iss": "<issuer>",
  "sub": "<person_sub>",
  "client_id": "<patient_app_client_id>",
  "aud": "<rls_audience>",
  "jti": "<jti>",
  "iat": 1790967016,
  "exp": 1790967316,
  "scope": "ITI-67 ITI-68",
  "token_type": "Bearer",
  "patient": "<patient_id>",
  "extensions": {
    "ihe_iua": {
      "purpose_of_use": [
        {
          "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
          "code": "PATRQT",
          "display": "patient requested"
        }
      ]
    }
  }
}

Consideraciones de seguridad

La sección 2.2 establece los requisitos del Authorization Server para este token. La sección 2.6 explica qué prueba el token ante cada destino.

La aplicación no elige el paciente. Ningún parámetro de la petición lo identifica, el Authorization Server lo fija en la autorización y el Record Locator Service limita cada operación a ese contexto.

La renovación no vuelve a resolver el contexto de paciente. Por eso, una fusión posterior de identidades maestras no cambia los tokens de una autorización vigente. Si la identidad del token es la que la fusión absorbió, la aplicación deja de encontrar los documentos de la persona hasta el siguiente inicio de sesión, que vuelve a consultar ITI-83, y, si la fusión es correcta, nunca alcanza los de otra persona. Ese plazo lo acotan la vida del refresh token y su revocación.

El Authorization Server SHOULD revocar los refresh tokens de una persona cuando cierra sesión en él, cambia su credencial o retira la autorización a la aplicación. SHOULD también dejar vencer el refresh token que la aplicación no usa durante el tiempo que fije la comunidad.

Nota. RFC 9700 deja que el Authorization Server revoque los refresh tokens ante un evento de seguridad, como un cambio de contraseña o un cierre de sesión, y recomienda que venzan cuando el cliente deja de usarlos24. La aplicación del paciente suele ser un cliente público, y IUA admite que su refresh token sea de larga vida16. Cada nuevo inicio de sesión vuelve además a resolver la identidad con ITI-83. Por esta razón, HIX-2 recomienda revocar el refresh token en esos casos y dejarlo vencer cuando no se usa.

Del contexto que fija el lanzamiento, solo patient pasa al token mediado de HIX-1, como establece la sección 2.2. El id_token y fhirUser se quedan en la aplicación. Quien confina las consultas a ese expediente es el Record Locator Service, y el custodio MAY comprobarlo además, como explica la sección 2.6.

Consideraciones de auditoría

El Authorization Server registra cada lanzamiento y cada renovación, concedidos o rechazados, con el evento que IUA define para ITI-71 (IUA, §3.71.5.1)30, como indica la Tabla 3-2. IUA no define un evento para la renovación, y HIX usa para ella el mismo.

El evento de IUA no incluye al paciente, porque su único Participant Object es el token31. Cuando hay contexto de paciente, el Authorization Server SHALL incluir en el evento la identidad maestra como paciente. Los patrones de BALP con paciente sirven de referencia para hacerlo (BALP, §3:5.7.3)32.

La consulta ITI-83 con la que el Authorization Server resuelve la identidad se registra con su propio evento, como indica la Tabla 3-2. Ningún registro contiene un token completo ni un refresh token, según la regla común de los registros de auditoría. El perfil de AuditEvent de este evento se especificará en una versión posterior de esta guía.

Referencias

Las citas reproducen el texto publicado por su fuente. Los recortes se marcan con "[…]" y la negrita es de esta guía.

  1. IUA, §34.1.1.1 Authorization Client: "The Get Access Token [ITI-71] transaction is scoped to the Authorization Code and Client Credential grant types (see ITI TF-1: 34.4.1.1 Authorization Grant Types)." §34.4.1.1 Authorization Grant Types: "This profile specifies the use of the Authorization Code and Client Credential grant types. Actors of this profile may support other grant types as well." ↩

  2. IUA, Relation to SMART-on-FHIR: "IUA is not based on SMART-on-FHIR, but does strive to not conflict with that standard." ↩

  3. SMART App Launch, Launch App: Standalone Launch: "In SMART’s standalone launch flow, a user selects an app from outside the EHR (for example, by tapping an app icon on a mobile phone home screen)." Obtain authorization code: "launch conditional When using the EHR Launch flow, this must match the launch value received from the EHR. Omitted when using the Standalone Launch." ↩

  4. IUA, §3.71.4.1.2.2 Authorization Code grant type: "resource (optional): Single valued identifier of the Resource Server endpoint to be accessed […] code_challenge (required) […] redirect_uri (optional) […] This parameter is required if the Authorization Client is registered at the Authorization Server with multiple redirect URI, optional otherwise […] code_verifier: The original code verifier string." ↩ ↩2 ↩3 ↩4 ↩5 ↩6

  5. SMART App Launch, Obtain authorization code: "Note that the aud parameter is semantically equivalent to the resource parameter defined in RFC8707. […] For the current release, servers SHALL support the aud parameter and MAY support a resource parameter as a synonym for aud." ↩ ↩2 ↩3

  6. SMART App Launch, Obtain authorization code: "Note on PKCE Support: the EHR SHALL ensure that the code_verifier is present and valid when the code is exchanged for an access token. […] redirect_uri required Must match one of the client's pre-registered redirect URIs. […] code_challenge_method required […] The app SHALL validate the value of the state parameter upon return to the redirect URL […]" ↩ ↩2 ↩3

  7. SMART App Launch, Considerations for PKCE Support: "All SMART apps SHALL support Proof Key for Code Exchange (PKCE). […] SMART servers SHALL support the S256 code_challenge_method and SHALL NOT support the plain method." ↩

  8. IUA, adición a MHD Vol. 2, §3.67.5.2 Use with the Internet User Authorization (IUA) Profile: "scope: ITI-67 This scope request authorizes the full [ITI-67] transaction." ↩

  9. SMART App Launch, Scopes for requesting context data: "launch/patient Need patient context at launch time (FHIR Patient resource)." Scopes for requesting identity data: "Some apps need to authenticate the end-user. This can be accomplished by requesting the scope openid. When the openid scope is requested, apps can also request the fhirUser scope to obtain a FHIR resource representation of the current user." ↩

  10. SMART App Launch, Refresh access token: "no new permissions can be obtained at refresh time […] if the app was launched from within a patient context, parameters to communicate the context values MAY BE included." ↩ ↩2 ↩3

  11. SMART App Launch, Token Introspection, Conditional fields in the introspection response: "SMART Launch Context. If a launch context parameter defined in Scopes and Launch Context (e.g., patient or intent) was included in the original access token response, the parameter SHALL be included in the token introspection response. […] ID Token Claims. If an id_token was included in the original access token response, the following claims from the ID Token SHOULD be included in the Token Introspection response: […] fhirUser" ↩

  12. RFC 8707, §2 Resource Parameter: "resource Indicates the target service or resource to which access is being requested. […] invalid_target The requested resource is invalid, missing, unknown, or malformed. The authorization server SHOULD audience-restrict issued access tokens to the resource(s) indicated by the "resource" parameter. Audience restrictions can be communicated in JSON Web Tokens [RFC7519] with the "aud" claim […] The authorization server may use the exact "resource" value as the audience or it may map from that value to a more general URI or abstract identifier for the given resource." ↩ ↩2

  13. SMART App Launch, FHIR Authorization Endpoint and Capabilities Discovery using a Well-Known Uniform Resource Identifiers (URIs): "FHIR endpoints requiring authorization SHALL serve a JSON document at the location formed by appending /.well-known/smart-configuration to their base URL. The server SHALL convey the FHIR OAuth authorization endpoints and any optional SMART Capabilities it supports […]" ↩

  14. RFC 9700, §2.1 Protecting Redirect-Based Flows: "When comparing client redirection URIs against pre-registered URIs, authorization servers MUST utilize exact string matching except for port numbers in localhost redirection URIs of native apps" ↩

  15. IUA, §3.71.4.1.2.2 Authorization Code grant type: "state (required): An unguessable value used by the client to track the state between the authorization request and the callback to the redirect URI. While this parameter is optional in the OAuth 2.1 Authorization Framework […] it is required in this profile for security reasons." ↩

  16. IUA, §3.71.5 Security Considerations: "Access token should be short-lived with a lifetime of 1 hour or less. […] Refresh token may be long lived. […] To reduce the attack surface, client claims and authorization grants shall be the minimal; i.e., the authorization grant scope requested by the Authorization Client shall be the minimal required scope for the resource request to be used for." ↩ ↩2

  17. IUA, §3.71.4.1.3.2 Authorization Code grant type: "The Authorization Server shall authenticate confidential and credential clients […] If valid, the Authorization Server shall authenticate the user and obtain the user consent […]" ↩ ↩2 ↩3

  18. OpenID Connect Core 1.0, §11 Offline Access: "When offline access is requested, a prompt parameter value of consent MUST be used unless other conditions for processing the request permitting offline access to the requested resources are in place. The OP MUST always obtain consent to returning a Refresh Token that enables offline access to the requested resources. A previously saved user consent is not always sufficient to grant offline access." ↩

  19. RFC 6749, §4.1.2.1 Error Response: "If the request fails due to a missing, invalid, or mismatching redirection URI, or if the client identifier is missing or invalid, the authorization server SHOULD inform the resource owner of the error and MUST NOT automatically redirect the user-agent to the invalid redirection URI. […] temporarily_unavailable The authorization server is currently unable to handle the request due to a temporary overloading or maintenance of the server." ↩ ↩2 ↩3

  20. RFC 7636, §4.4.1 Error Response: "If the server requires Proof Key for Code Exchange (PKCE) by OAuth public clients and the client does not send the "code_challenge" in the request, the authorization endpoint MUST return the authorization error response with the "error" value set to "invalid_request". […] If the server supporting PKCE does not support the requested transformation, the authorization endpoint MUST return the authorization error response with "error" value set to "invalid_request"." §4.6 Server Verifies code_verifier before Returning the Tokens: "If the values are not equal, an error response indicating "invalid_grant" as described in Section 5.2 of [RFC6749] MUST be returned." ↩ ↩2

  21. SMART App Launch, Obtain access token: "For public apps, authentication is not required because a client with no secret cannot prove its identity when it issues a call. […] For confidential apps, authentication is required. […] code_verifier required This parameter is used to verify against the code_challenge parameter previously provided in the authorize request. client_id conditional Required for public apps. Omit for confidential apps." ↩ ↩2

  22. RFC 6749, §6 Refreshing an Access Token: "The requested scope MUST NOT include any scope not originally granted by the resource owner, and if omitted is treated as equal to the scope originally granted by the resource owner. […] Because refresh tokens are typically long-lasting credentials used to request additional access tokens, the refresh token is bound to the client to which it was issued. […] The authorization server MAY issue a new refresh token, in which case the client MUST discard the old refresh token and replace it with the new refresh token." ↩ ↩2 ↩3 ↩4

  23. RFC 6749, §3.2.1 Client Authentication: "A client MAY use the "client_id" request parameter to identify itself when sending requests to the token endpoint. In the "authorization_code" "grant_type" request to the token endpoint, an unauthenticated client MUST send its "client_id" to prevent itself from inadvertently accepting a code intended for a client with a different "client_id"." ↩

  24. RFC 9700, §4.14.2 Recommendations: "Authorization servers MUST utilize one of these methods to detect refresh token replay by malicious actors for public clients […] The authorization server cannot determine which party submitted the invalid refresh token, but it will revoke the active refresh token. […] Authorization servers MAY revoke refresh tokens automatically in case of a security event […] Refresh tokens SHOULD expire if the client has been inactive for some time" ↩ ↩2 ↩3

  25. IUA, §3.71.4.2.2 Message Semantics: "scope (required): The scope granted by the Authorization Server. […] refresh_token (optional): A token provided by the Authorization Server which can be used by the Authorization Client to obtain new access tokens using the same authorization grant. […] The Authorization Server shall include the HTTP Cache-Control response header field with value no-store and the Pragma response header field value no-cache to the access token response […]" ↩

  26. OpenID Connect Core 1.0, §12.2 Successful Refresh Response: "Upon successful validation of the Refresh Token, the response body is the Token Response of Section 3.1.3.3 […] except that it might not contain an id_token. If an ID Token is returned as a result of a token refresh request, the following requirements apply: its iss Claim Value MUST be the same as in the ID Token issued when the original authentication occurred, its sub Claim Value MUST be the same as in the ID Token issued when the original authentication occurred […]" ↩

  27. RFC 6749, §5.1 Successful Response: "scope OPTIONAL, if identical to the scope requested by the client; otherwise, REQUIRED. The scope of the access token as described by Section 3.3." ↩

  28. RFC 6749, §5.2 Error Response: "The authorization server responds with an HTTP 400 (Bad Request) status code (unless specified otherwise) and includes the following parameters with the response: error REQUIRED. […] invalid_grant The provided authorization grant (e.g., authorization code, resource owner credentials) or refresh token is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client. […] invalid_scope The requested scope is invalid, unknown, malformed, or exceeds the scope granted by the resource owner." ↩

  29. SMART App Launch, Scopes for requesting identity data: "This token must be validated according to the OIDC specification. To learn more about the user, the app should treat the fhirUser claim as the URL of a FHIR resource representing the current user." ↩

  30. IUA, §3.71.5.1 Security Audit Considerations: "The Authorization Client or Authorization Server that is grouped with an ATNA Secure Node or Secure Application shall be able to send an audit event as defined below […] EventID […] EV(110114, DCM, "User Authentication") […] EventTypeCode […] EV("ITI-71", IHE, "User Authorization")". ↩

  31. IUA, §3.71.5.1 Security Audit Considerations: "Source (1) Human Requestor (0) Destination (0) Audit Source (Client Authentication Agent) (1) Participant Object (1) […] Token […] ParticipantObjectTypeCode M "2" (System) […] ParticipantObjectTypeCodeRole M "13" (Security Resource)" ↩

  32. BALP, §3:5.7.3 RESTful activities: "When a FHIR RESTful interaction happens, the following AuditEvent patterns can be used. […] There are two sets of profiles distinguished by Patient as a subject being mandated to be populated." ↩