Skip to main content

SMART App Launch v2.2

The platform implements the full SMART App Launch Framework v2.2.

What's implementedโ€‹

RequirementComponentStatus
EHR launchAuth Server + Clientโœ…
Standalone launchAuth Server + Clientโœ…
PKCE S256Bothโœ… requireProofKey(true)
Dynamic discovery (/.well-known/smart-configuration)Auth Server + HAPI Pluginโœ…
jwks_uri in discoveryAuth Serverโœ…
introspection_endpointAuth Serverโœ…
launch-ehr capabilityAuth Serverโœ…
launch-standalone capabilityAuth Serverโœ…
patient, encounter as top-level token response fieldsAuth Serverโœ…
need_patient_bannerAuth Serverโœ…
RS256 signed access tokenAuth Serverโœ…
OIDC id_token with fhirUserAuth Serverโœ…
Token refresh with rotationAuth Serverโœ…
SMART scope enforcement (.rs, .read)HAPI Pluginโœ…
IdP federationAuth Serverโœ… Azure AD, Okta, Epic IdP
Consent directivesConsent Managerโšก v1.1.0
Backend Servicesโ€”โ—‡ v2.0.0

PKCE implementationโ€‹

RFC 7636 S256 in the SMART Client:

// 96-byte verifier (768-bit entropy โ€” exceeds spec minimum of 32 bytes)
byte[] verifierBytes = new byte[96];
new SecureRandom().nextBytes(verifierBytes);
String codeVerifier = Base64.getUrlEncoder().withoutPadding()
.encodeToString(verifierBytes);

// S256 challenge
byte[] digest = MessageDigest.getInstance("SHA-256")
.digest(codeVerifier.getBytes(StandardCharsets.US_ASCII));
String codeChallenge = Base64.getUrlEncoder().withoutPadding()
.encodeToString(digest);

Discovery documentโ€‹

{
"authorization_endpoint": "https://auth.demo.ajsmart.com/oauth2/authorize",
"token_endpoint": "https://auth.demo.ajsmart.com/oauth2/token",
"introspection_endpoint": "https://auth.demo.ajsmart.com/oauth2/introspect",
"jwks_uri": "https://auth.demo.ajsmart.com/oauth2/jwks",
"issuer": "https://auth.demo.ajsmart.com",
"token_endpoint_auth_methods_supported": ["none", "client_secret_basic", "client_secret_post"],
"capabilities": ["launch-ehr", "launch-standalone", "client-public",
"context-ehr-patient", "context-ehr-encounter",
"permission-patient", "permission-user", "sso-openid-connect"],
"code_challenge_methods_supported": ["S256"]
}