Configure OAuth/OIDC provider endpoints and validation settings
Source:R/classes__OAuthProvider.R
oauth_provider.RdConfigure a service from its documented endpoint URLs and protocol settings
when no named provider helper fits or OIDC discovery is unavailable.
Pass the resulting provider to oauth_client().
For a supported service, its named helper is an easier starting point;
for OIDC, oauth_provider_oidc_discover() can look up the settings.
Usage
oauth_provider(
name,
auth_url,
token_url,
userinfo_url = NA_character_,
introspection_url = NA_character_,
revocation_url = NA_character_,
par_url = NA_character_,
par_required = FALSE,
authorization_request_front_channel_mode = "compat",
request_object_signing_alg_values_supported = character(),
request_object_encryption_alg_values_supported = character(),
request_object_encryption_enc_values_supported = character(),
request_object_encryption_jwk = NULL,
signed_request_object_required = FALSE,
request_parameter_supported = NA,
request_uri_parameter_supported = NA,
request_uri_registration_required = NA,
token_endpoint_auth_signing_alg_values_supported = character(),
dpop_signing_alg_values_supported = character(),
authorization_response_iss_parameter_supported = FALSE,
response_modes_supported = character(),
mtls_endpoint_aliases = list(),
mtls_client_certificate_bound_access_tokens = FALSE,
issuer = NA_character_,
issuer_match = "url",
use_nonce = NULL,
use_pkce = TRUE,
pkce_method = "S256",
userinfo_required = NULL,
userinfo_id_token_match = NULL,
userinfo_signed_jwt_required = FALSE,
userinfo_id_selector = function(userinfo) {
userinfo[["sub"]]
},
id_token_required = NULL,
id_token_validation = NULL,
extra_auth_params = list(),
extra_token_params = list(),
extra_token_headers = character(),
token_auth_style = "header",
jwks_cache = NULL,
jwks_pins = character(),
jwks_pin_mode = "any",
jwks_host_issuer_match = NULL,
jwks_host_allow_only = NULL,
id_token_allowed_algs = c("RS256", "RS384", "RS512", "ES256", "ES384", "ES512",
"Ed25519", "EdDSA"),
allowed_token_types = c("Bearer"),
leeway = getOption("shinyOAuth.leeway", 30),
id_token_at_hash_required = FALSE,
infer_oidc_from_issuer = TRUE,
jwks_uri = NA_character_,
userinfo_allowed_algs = NULL,
jarm_signing_alg_values_supported = character(),
jarm_encryption_alg_values_supported = character(),
jarm_encryption_enc_values_supported = character(),
jarm_tolerate_duplicate_top_level_iss = FALSE,
endpoint_auth_metadata = list(),
...,
allowed_algs = NULL,
allow_missing_token_type = FALSE,
token_target_mode = "none",
token_response_scope_format = "space",
userinfo_id_selector_policy_id = NA_character_
)Arguments
- name
Provider name (e.g., "github", "google"). Cosmetic only; used in logging and audit events
- auth_url
URL of the provider's login and permission page.
- token_url
URL where R exchanges the returned code for tokens.
- userinfo_url
User info endpoint URL (optional)
- introspection_url
Optional URL where the provider can confirm whether a token is still active (RFC 7662).
- revocation_url
Optional URL where the app can ask the provider to invalidate a token, for example during logout (RFC 7009).
- par_url
Optional Pushed Authorization Request (PAR) URL (RFC 9126). When set, shinyOAuth first sends the authorization request from server to provider and then redirects the browser with the returned
request_urihandle instead of the full request payload. Use PAR to keep most request details out of the browser URL, submit large requests, or meet a provider's PAR requirement. The provider must support this endpoint.- par_required
Logical. Whether the provider requires authorization requests to be sent via PAR. When
TRUE,par_urlmust also be configured.Character scalar controlling which browser-visible outer parameters shinyOAuth keeps when the actual authorization request is carried by JAR or PAR. Use
"compat"(default) to keep OIDC-compatible parameters with outerclient_id,response_type, andscopewhen an issuer is configured. Use"minimal"for plain OAuth browser redirects and for PAR deployments whose authorization endpoint accepts onlyclient_idplus the provider-issuedrequest_urihandle. OpenID Connect by-valuerequestand caller-managedrequest_uritransports reject"minimal"because OIDC still requires outerresponse_typeand an outerscopecontainingopenid.- request_object_signing_alg_values_supported
Optional vector of JWS algorithms that the provider advertises for signed Request Objects (RFC 9101). This is mainly used for early validation when an OAuthClient sends
request_object_mode = "request"orrequest_object_mode = "request_uri".- request_object_encryption_alg_values_supported
Optional vector of JWE key-management algorithms that the provider advertises for encrypted Request Objects. This metadata is used for early validation when an OAuthClient enables Request Object encryption.
- request_object_encryption_enc_values_supported
Optional vector of JWE content-encryption algorithms that the provider advertises for encrypted Request Objects. This metadata is used for early validation when an OAuthClient enables Request Object encryption.
- request_object_encryption_jwk
Optional explicit recipient public key used to encrypt Request Objects when discovery-backed JWKS selection is not available or when you need to pin one specific encryption key. Accepts an OpenSSL public key, a PEM public-key string, a parsed JWK object, or a JWK JSON string.
- signed_request_object_required
Logical. Whether the provider requires signed Request Objects for authorization requests. When
TRUE, client construction requiresrequest_object_mode = "request"or"request_uri". This represents the provider's registration policy and enforces local construction. Provider-side rejection of unsigned requests depends on that registration, not on this local flag.- request_parameter_supported
Logical or
NA. Whether discovery metadata explicitly advertises support for the authorization-requestrequestparameter.NAmeans the provider did not say. Discovery-derived providers apply the OpenID Connect default (FALSE) when this metadata is omitted.- request_uri_parameter_supported
Logical or
NA. Whether discovery metadata explicitly advertises support for the authorization-requestrequest_uriparameter for caller-managed request URIs.NAmeans the provider did not say. Discovery-derived providers apply the OpenID Connect default (TRUE) when this metadata is omitted. PAR-issuedrequest_urihandles remain valid even when this metadata isFALSE.- request_uri_registration_required
Logical or
NA. Whether discovery metadata says caller-managedrequest_urivalues must be pre-registered.NAmeans the provider did not say. Discovery-derived providers apply the OpenID Connect default (FALSE) when this metadata is omitted. shinyOAuth can publish caller-managedrequest_urivalues throughoauth_module_server().TRUEmeans the public URI or a matching prefix belongs in the provider's client registration. The package stores this requirement as metadata; provider-side registration is outside local validation.- token_endpoint_auth_signing_alg_values_supported
Optional vector of JWS algorithms that the provider advertises for JWT-based client authentication (
client_secret_jwt/private_key_jwt) at the token endpoint. This metadata is used for early validation ofOAuthClient@client_assertion_algand inferred JWT client-assertion defaults.- dpop_signing_alg_values_supported
Optional vector of JWS algorithms that the provider advertises for DPoP proof JWTs (RFC 9449). This metadata is used for early validation of
OAuthClient@dpop_signing_algand inferred outbound DPoP signing defaults.Logical. Whether the provider advertises RFC 9207 support for returning an
issparameter on the authorization response. WhenTRUE, theoauth_client()helper can auto-enable callback issuer enforcement when the caller leavesenforce_callback_issuerunset and the provider also has a configuredissuer.- response_modes_supported
Optional character vector of OAuth/OIDC
response_modevalues advertised by the provider. Discovery-backed providers use the discovery metadata value, defaulting toc("query", "fragment")when omitted per OIDC Discovery/RFC 8414. Generic providers may leave this empty when capabilities are not known. Provider metadata may include response modes that shinyOAuth does not implement. Requesting an unsupported mode raises an error.- mtls_endpoint_aliases
Optional named list of RFC 8705 mTLS endpoint aliases. Names should follow the metadata keys such as
token_endpoint,userinfo_endpoint,introspection_endpoint,revocation_endpoint,par_endpoint, orpushed_authorization_request_endpoint, and values must be absolute URLs. This is an advanced setting used when a provider publishes separate mTLS-specific endpoints.- mtls_client_certificate_bound_access_tokens
Logical. Whether the authorization server advertises RFC 8705 capability to issue certificate-bound access tokens. This describes server capability; the client still has to opt into mTLS separately. When
TRUE, token responses may include acnfclaim with anx5t#S256thumbprint that downstream requests must match with the same certificate.- issuer
Optional authorization-server issuer URL. You need this for issuer validation and features such as ID-token validation. shinyOAuth uses it to verify issuer claims and locate signing keys (JWKS), typically through an OIDC discovery document.
- issuer_match
Character scalar controlling how strictly the discovery document's
issueris validated againstissuerwhen it later performs runtime discovery to locate the JWKS URI."url"(default): require the issuer used for discovery to match the discovery metadata exactly, including any trailing slash."host": compare only scheme + host."none": do not validate discovery issuer consistency.
The Microsoft helper configures tenant-independent issuer handling for supported alias tenants.
- use_nonce
Whether to tie the ID token to this login using a random nonce. The package sends it in the request and checks it in the returned ID token.
- use_pkce
Whether to protect the code exchange using Proof Key for Code Exchange (PKCE), which public clients require. It sends a
code_challengewith the login request and a matching secretcode_verifierduring token exchange.- pkce_method
PKCE code challenge method:
"S256"(default), or"plain"for compatibility with providers that require it.- userinfo_required
Whether to fetch a user profile after token exchange. The result is stored in
token@userinfo; a failed required fetch stops login. Inoauth_provider(), this defaults toTRUEwhenuserinfo_urlis supplied andFALSEotherwise.- userinfo_id_token_match
Require the fetched profile to belong to the validated login identity. Defaults to
TRUEwhen a UserInfo URL and ID-token or nonce validation are enabled, including for manualget_userinfo()calls. Pass the complete OAuthToken for this check. An explicitFALSEpermits profile retrieval without a validated identity; when both are available, their actualsubvalues must still match.- userinfo_signed_jwt_required
Require a profile signed by the provider. Default
FALSEaccepts ordinary JSON profiles. WhenTRUE, configure a UserInfo URL and issuer, and arrange signed responses with the provider. Signatures useuserinfo_allowed_algs; unsigned, HMAC-signed and encrypted profiles are not accepted by normal configuration. This requirement also applies to manual retrieval whenuserinfo_required = FALSE.- userinfo_id_selector
A function that extracts the user ID from the userinfo response. Should take a single argument (the userinfo list) and return the user ID as a string.
This is used for helpers that need a provider-specific application user identifier, such as audit fields. It does not replace OIDC subject binding: when a validated ID token and UserInfo are both available, their actual
subclaims are always compared. Helper constructors likeoauth_provider()andoauth_provider_oidc()provide a default selector that extractssub.- id_token_required
Whether to require an ID token to be returned during token exchange. If no ID token is returned, the token exchange will fail. This only makes sense for OpenID Connect providers and may require the client's scope to include
openid.Both the S7 constructor and
oauth_provider()enable this when an issuer is supplied andinfer_oidc_from_issuer = TRUE. Pure OAuth 2.0 providers keep this disabled by default.- id_token_validation
Whether to perform ID token validation after token exchange. This requires the provider to be a valid OpenID Connect provider with a configured
issuerand the token response to include an ID token (may require setting the client's scope to includeopenid).Both the S7 constructor and
oauth_provider()enable this when an issuer is provided andinfer_oidc_from_issuer = TRUE. An explicitFALSEdisables automatic ID token validation.- extra_auth_params
Extra parameters for authorization URL
- extra_token_params
Extra parameters for token exchange.
scopeis reserved and cannot be unblocked. For explicit refresh scope narrowing use a managed connection's[["refresh"]](scopes = ...). Configure login scopes onoauth_client()instead.- extra_token_headers
Extra headers for back-channel token-style requests (named character vector), applied only to token exchange and refresh. Configure
oauth_client(endpoint_auth = ...)for headers needed by PAR, introspection, or revocation.- token_auth_style
How the client authenticates at the token endpoint. One of:
"header": HTTP Basic (client_secret_basic)
"body": Form body (client_secret_post)
"public": Public-client form body (
nonein discovery metadata); sendsclient_idbut neverclient_secret, even if one is configured. The alias"none"is also accepted."tls_client_auth": RFC 8705 mutual TLS client authentication using a client certificate chained to a trusted CA
"self_signed_tls_client_auth": RFC 8705 mutual TLS client authentication using a self-signed client certificate registered out of band with the provider
"client_secret_jwt": JWT client assertion signed with HMAC using client_secret (RFC 7523)
"private_key_jwt": JWT client assertion signed with an asymmetric key (RFC 7523)
- jwks_cache
Storage for the provider's public signing keys. Defaults to
cachem::cache_mem(max_age = 3600), an in-memory cache lasting one hour. Acustom_cache()can share keys across processes. Shorter lifetimes pick up changed keys sooner; longer lifetimes reduce network requests. HTTP cache directives can shorten this lifetime. Responses markedno-storeare not retained, andno-cacheresponses are fetched again before reuse. Advertised freshness also accounts forAgeandExpires. The package also attempts a rate-limited refresh when a key is missing or no longer verifies a signature. For async login and token operations, custom caches use synchronous fallback unless they explicitly declare worker safety; seecustom_cache()and itsworker_safeargument.- jwks_pins
Optional character vector of RFC 7638 JWK thumbprints (base64url) to pin against. If non-empty, fetched JWKS must contain keys whose thumbprints match these values depending on
jwks_pin_mode. This is an advanced hardening option that lets you pre-authorize expected keys. Only keys matching a configured pin are eligible for signature verification or Request Object encryption;jwks_pin_modecontrols whether the surrounding JWK Set may also contain unpinned keys.- jwks_pin_mode
Pinning policy when
jwks_pinsis provided. Either "any" (default; at least one key in JWKS must match) or "all" (every RSA/EC/OKP public key in JWKS must match one of the configured pins)- jwks_host_issuer_match
When TRUE, enforce that the discovery
jwks_urihost matches the issuer host exactly. Defaults to FALSE at the class level, but helper constructors for OIDC (e.g.,oauth_provider_oidc()andoauth_provider_oidc_discover()) enable this by default. The generic helperoauth_provider()will also automatically set this to TRUE when anissueris provided and eitherid_token_validationorid_token_requiredis TRUE (OIDC-like configuration). An explicit FALSE disables issuer-host matching.jwks_host_allow_onlytakes precedence and can specify a different exact hostname, as used by the Google helper.- jwks_host_allow_only
Optional explicit hostname that the jwks_uri must match. When provided, jwks_uri host must equal this value (exact match). You can pass either just the host (e.g., "www.googleapis.com") or a full URL; only the host component will be used. If you need to include a port or an IPv6 literal, pass a full URL (e.g.,
https://[::1]:8443) - the port is ignored and only the hostname part is used for matching. Takes precedence overjwks_host_issuer_match.- id_token_allowed_algs
Signing algorithms accepted for ID tokens. Defaults to
c("RS256", "RS384", "RS512", "ES256", "ES384", "ES512", "Ed25519", "EdDSA"); Ed448 and unsupported algorithms are rejected. Use a narrower set to match your provider registration. HMAC (HS256,HS384,HS512) requires a server-only client secret,options(shinyOAuth.allow_hs = TRUE), and exactly one HS algorithm. Reused keys or secrets must not have conflicting algorithm settings. For RSA key metadata, defaults and rotation, see signing-key validation.- allowed_token_types
Character vector of acceptable OAuth token types returned by the token endpoint (case-insensitive). Successful token responses must include
token_typeby default; whenallowed_token_typesis non-empty, its value must also be one of the allowed values or the flow fails fast with ashinyOAuth_token_error. Theoauth_provider()helper defaults toc("Bearer"). When the OAuthClient is configured withdpop_private_key, shinyOAuth also acceptstoken_type = "DPoP"and uses DPoP proofs on supported token and downstream requests. Other non-Bearer token types (for exampleMAC) are rejected. Setallowed_token_types = character()explicitly only to disable the value allowlist while still requiringtoken_typeitself.- leeway
Clock skew leeway (seconds) applied to ID token
exp/iat/nbfchecks and state payloadissued_atfuture check. Default 30. Can be globally overridden via optionshinyOAuth.leeway.- id_token_at_hash_required
Whether to require the
at_hash(Access Token hash) claim in the ID token. WhenTRUE, login fails if the ID token does not contain anat_hashclaim or if the claim does not match the access token. WhenFALSE(default),at_hashis validated only when present. Requiresid_token_validation = TRUE.- infer_oidc_from_issuer
Whether setting
issuerenables OpenID Connect behavior. DefaultTRUE: helpers enable OIDC nonce/ID token defaults and the client adds theopenidscope. SetFALSEfor an OAuth-only server that has an issuer identifier but does not implement OIDC.- jwks_uri
Optional URL of the provider's public signing keys (JWKS). Normally these are located through OIDC discovery. Set this for manual key configuration, including OAuth-only JARM providers.
- userinfo_allowed_algs
Optional signing algorithm allowlist for UserInfo JWTs.
NULLinheritsid_token_allowed_algsfor manually configured providers. Discovery negotiates this independently against UserInfo metadata. Use a single algorithm to enforce the client's registered UserInfo signing choice. An empty vector rejects all signed UserInfo algorithms. Unlabelled RSA keys follow the same binding policy asid_token_allowed_algs.- jarm_signing_alg_values_supported
Optional vector of JWS algorithms that the provider advertises for signed JWT Secured Authorization Responses (JARM).
- jarm_encryption_alg_values_supported
Optional vector of JWE key-management algorithms that the provider advertises for encrypted JARM responses.
- jarm_encryption_enc_values_supported
Optional vector of JWE content-encryption algorithms that the provider advertises for encrypted JARM responses.
- jarm_tolerate_duplicate_top_level_iss
Logical. Whether shinyOAuth should tolerate repeated identical top-level
issmembers in signed JARM payloads for this provider. This is a compatibility setting for providers that emit duplicate identical top-levelissclaims. WhenTRUE, shinyOAuth collapses repeated identical top-levelissmembers before duplicate-member rejection. Conflicting duplicates and nested duplicateissmembers are rejected. Defaults toFALSE.- endpoint_auth_metadata
Named list of independent
introspectionandrevocationauthentication metadata. Each entry hasmethodsandsigning_algscharacter vectors (orNULLfor omitted metadata). Discovery retains these fields and applies the RFC 8414 Basic-auth default for omitted revocation methods. Omitted introspection methods have no default.- ...
Deprecated renamed arguments accepted temporarily for backward compatibility.
- allowed_algs
Compatibility alias for
id_token_allowed_algs. Supply only one spelling.- allow_missing_token_type
Logical, default
FALSE. Compatibility for providers that issue Bearer tokens without the OAuth-requiredtoken_type. WhenTRUE, login and refresh assume"Bearer"only when the field is absent. Explicit null, empty, invalid, or unsupported values still fail validation. The fallback never applies to clients configured with DPoP.- token_target_mode
How this provider obtains API-specific tokens:
"none"(default),"rfc8707", or"microsoft". This applies to clienttoken_targetsand depends on provider support. The Microsoft helper selects"microsoft"automatically; discovery does not enable targets. Seevignette("token-targets", package = "shinyOAuth")(online guide) for setup and permission rules.- token_response_scope_format
Separator used for permissions in token responses:
"space"(default) or"comma". The GitHub helper sets"comma"automatically. Set it explicitly for a custom provider using that format.- userinfo_id_selector_policy_id
Optional version name for a custom
userinfo_id_selector, orNA_character_. Identifies settings or helper behavior outside the function body that affect identity selection. These form part of the client's policy: a new version ID lets pending logins and saved connections detect a change.
Value
OAuthProvider object
Details
Supply name, auth_url, and token_url to start. Add userinfo_url to
fetch profiles. Supplying issuer enables OIDC defaults, including ID token
validation, unless infer_oidc_from_issuer = FALSE. Advanced arguments must match
your provider's capabilities; see the advanced security vignette.
Examples
# Configure generic OAuth 2.0 provider (no OIDC)
generic_provider <- oauth_provider(
name = "example",
auth_url = "https://example.com/oauth/authorize",
token_url = "https://example.com/oauth/token",
# Optional URL for fetching user info:
userinfo_url = "https://example.com/oauth/userinfo"
)
# Configure generic OIDC provider manually
# (This defaults to using nonce & ID token validation)
generic_oidc_provider <- oauth_provider_oidc(
name = "My OIDC",
base_url = "https://my-issuer.example.com"
)
# Look up an OIDC provider's settings with discovery
# (requires network access)
if (interactive()) {
# Using Auth0 sample issuer as an example
oidc_discovery_provider <- oauth_provider_oidc_discover(
issuer = "https://samples.auth0.com/"
)
}
# GitHub preconfigured provider
github_provider <- oauth_provider_github()
# Google preconfigured provider
google_provider <- oauth_provider_google()
# Microsoft preconfigured provider
# For a complete app using a custom tenant ID, see:
# https://lukakoning.github.io/shinyOAuth/reference/oauth_provider_microsoft.html
# Spotify preconfigured provider
spotify_provider <- oauth_provider_spotify()
# Slack via OIDC discovery
# (requires network access)
if (interactive()) {
slack_provider <- oauth_provider_slack()
}
# Keycloak
# (requires configured Keycloak realm; example below is therefore not run)
if (interactive()) {
options(shinyOAuth.allow_insecure_oidc_loopback = TRUE)
oauth_provider_keycloak(base_url = "http://localhost:8080", realm = "myrealm")
}
# Auth0
# (requires configured Auth0 domain; example below is therefore not run)
if (interactive()) {
oauth_provider_auth0(domain = "your-tenant.auth0.com")
}
# Okta
# (requires configured Okta domain; example below is therefore not run)
if (interactive()) {
oauth_provider_okta(domain = "dev-123456.okta.com")
}