Models
- class oauth2_provider.models.AbstractAccessToken(*args, **kwargs)
An AccessToken instance represents the actual access token to access user’s resources, as in RFC6749 Section 5.
Fields:
userThe Django user representing resources” ownersource_refresh_tokenIf from a refresh, the consumed RefeshTokentokenAccess tokenapplicationApplication instanceexpiresDate and time of token expiration, in DateTime formatscopeAllowed scopesresourceRFC 8707 resource indicator(s) - JSON-encoded array of URIs
- allow_scopes(scopes)
Check if the token allows the provided scopes
- Parameters:
scopes – An iterable containing the scopes to check
- allows_audience(audience_uri)
Check if the token is authorized for the given audience URI.
RFC 8707: Validates that the token includes the specified resource indicator using the configured resource validator (RESOURCE_SERVER_TOKEN_RESOURCE_VALIDATOR).
If the token has no resource indicators (empty list), it is unrestricted and allows any audience (backward compatibility).
- Parameters:
audience_uri – The URI of the resource server to check
- Returns:
True if the token is authorized for this audience, False otherwise
- is_expired()
Check token expiration with timezone awareness
- is_valid(scopes=None)
Checks if the access token is valid.
- Parameters:
scopes – An iterable containing the scopes to check or None
- revoke()
Convenience method to uniform tokens” interface, for now simply remove this token from the database in order to revoke it.
- property scopes
Returns a dictionary of allowed scope names (as keys) with their descriptions (as values)
- class oauth2_provider.models.AbstractApplication(*args, **kwargs)
An Application instance represents a Client on the Authorization server. Usually an Application is created manually by client’s developers after logging in on an Authorization Server.
Fields:
client_idThe client identifier issued to the client during theregistration process as described in RFC6749 Section 2.2
userref to a Django userredirect_urisThe list of allowed redirect uri. The stringconsists of valid URLs separated by space
post_logout_redirect_urisThe list of allowed redirect uris afteran RP initiated logout. The string consists of valid URLs separated by space
client_typeClient type as described in RFC6749 Section 2.1authorization_grant_typeAuthorization flows available to theApplication
client_secretConfidential secret issued to the client duringthe registration process as described in RFC6749 Section 2.2
nameFriendly name for the Applicationregistration_sourceHow the Application was registered:manualfor manually created Applications,
dcrfor those registered via Dynamic Client Registration (RFC 7591),cimdfor Client ID Metadata Document
cimd_expires_atWhen the cached metadata document should bere-fetched, for CIMD applications
- class RegistrationSource(*values)
- clean() None
Validate the application, reporting each problem on the field it belongs to.
Raises a
ValidationErrorkeyed by field name, so callers get a per-fieldmessage_dictand a ModelForm renders each message next to its input. Every problem found is reported, not just the first one.
- property default_redirect_uri
Returns the default redirect_uri, if only one is registered.
- get_allowed_schemes()
Returns the list of redirect schemes allowed by the Application. By default, returns ALLOWED_REDIRECT_URI_SCHEMES.
- is_usable(request)
Determines whether the application can be used.
- Parameters:
request – The oauthlib.common.Request being processed.
- origin_allowed(origin)
Checks if given origin is one of the items in
allowed_originsstring- Parameters:
origin – Origin to check
- post_logout_redirect_uri_allowed(uri: str) bool
Checks if given URI is one of the items in
post_logout_redirect_urisstring- Parameters:
uri – URI to check
- redirect_uri_allowed(uri: str) bool
Checks if given url is one of the items in
redirect_urisstring- Parameters:
uri – Url to check
- class oauth2_provider.models.AbstractDeviceGrant(*args, **kwargs)
- is_expired()
Check device flow session expiration and set the status to “expired” if current time is past the “expires” deadline.
- class oauth2_provider.models.AbstractGrant(*args, **kwargs)
A Grant instance represents a token with a short lifetime that can be swapped for an access token, as described in RFC6749 Section 4.1.2
Fields:
userThe Django user who requested the grantcodeThe authorization code generated by the authorization serverapplicationApplication instance this grant was asked forexpiresExpire time in seconds, defaults tosettings.AUTHORIZATION_CODE_EXPIRE_SECONDS
redirect_uriSelf explainedscopeRequired scopes, optionalcode_challengePKCE code challengecode_challenge_methodPKCE code challenge transform algorithmresourceRFC 8707 resource indicator(s), JSON-encoded array of URIs
- is_expired()
Check token expiration with timezone awareness
- class oauth2_provider.models.AbstractIDToken(*args, **kwargs)
An IDToken instance represents the token used to authenticate the user and convey claims to the client, as in OpenID Connect Core 1.0 Section 2.
Fields:
userThe Django user representing resources’ ownerjtiID token JWT Token ID, to identify an individual tokenapplicationApplication instanceexpiresDate and time of token expiration, in DateTime formatscopeAllowed scopescreatedDate and time of token creation, in DateTime formatupdatedDate and time of token update, in DateTime format
- allow_scopes(scopes)
Check if the token allows the provided scopes
- Parameters:
scopes – An iterable containing the scopes to check
- is_expired()
Check token expiration with timezone awareness
- is_valid(scopes=None)
Checks if the access token is valid.
- Parameters:
scopes – An iterable containing the scopes to check or None
- revoke()
Convenience method to uniform tokens’ interface, for now simply remove this token from the database in order to revoke it.
- property scopes
Returns a dictionary of allowed scope names (as keys) with their descriptions (as values)
- class oauth2_provider.models.AbstractRefreshToken(*args, **kwargs)
A RefreshToken instance represents a token that can be swapped for a new access token when it expires.
Fields:
userThe Django user representing resources” ownertokenToken valueapplicationApplication instanceaccess_tokenAccessToken instance this refresh token isbounded to
revokedTimestamp of when this refresh token was revokedresourceRFC 8707 resource indicator(s), JSON-encoded array of URIs
- revoke()
Mark this refresh token revoked and revoke related access token
- classmethod revoke_family(token_family: UUID | None) None
Revoke every live refresh token sharing
token_familyand delete the family’s access tokens, in a constant number of queries.This is the set-based equivalent of calling
revoke()on each member of the family, which is what reuse protection needs: a rotating client adds a row to its family on every refresh, so revoking row by row cost oneSELECT ... FOR UPDATEround trip per token ever issued to that session, paid again on every replay of the stale token (#1809). A model that overridesrevoke()to do more should override this too.Rows are not locked up front: unlike rotation this path mints nothing, so there is no read-then-write to protect. The statements take their locks in the same order as
revoke()– refresh token, then access token – so a concurrent rotation in the family cannot deadlock against the sweep.Falls back to revoking row by row if the bulk write hits the uniqueness of
(token_checksum, revoked); see the handler below and #1816.
- class oauth2_provider.models.AccessToken(id, user, source_refresh_token, token, token_checksum, id_token, application, expires, scope, resource, created, updated)
- exception DoesNotExist
- exception MultipleObjectsReturned
- class oauth2_provider.models.Application(id, client_id, user, redirect_uris, post_logout_redirect_uris, client_type, authorization_grant_type, client_secret, hash_client_secret, name, skip_authorization, created, updated, algorithm, allowed_origins, registration_source, cimd_expires_at)
- exception DoesNotExist
- exception MultipleObjectsReturned
- class oauth2_provider.models.ClientSecretField(*args, db_collation=None, **kwargs)
- pre_save(model_instance, add)
Return field’s value just before saving.
- class oauth2_provider.models.DeviceCodeResponse(verification_uri: str, expires_in: int, user_code: str, device_code: str, interval: int, verification_uri_complete: str | Callable | None = None)
- class oauth2_provider.models.DeviceGrant(id, user, device_code, user_code, scope, interval, expires, status, client_id, last_checked)
- exception DoesNotExist
- exception MultipleObjectsReturned
- class oauth2_provider.models.DeviceRequest(client_id: str, scope: str | None = None)
- class oauth2_provider.models.Grant(id, user, code, application, expires, redirect_uri, scope, created, updated, code_challenge, code_challenge_method, nonce, claims, resource)
- exception DoesNotExist
- exception MultipleObjectsReturned
- class oauth2_provider.models.IDToken(id, user, jti, application, expires, scope, created, updated)
- exception DoesNotExist
- exception MultipleObjectsReturned
- class oauth2_provider.models.RefreshToken(id, user, token, token_checksum, application, access_token, token_family, resource, created, updated, revoked)
- exception DoesNotExist
- exception MultipleObjectsReturned
- class oauth2_provider.models.ResourceJSONField(verbose_name=None, name=None, encoder=None, decoder=None, **kwargs)
RFC 8707 - JSON array of resource URIs.
Empty list means not restricted to specific resource servers (unrestricted access).
- get_db_prep_value(value, connection, prepared=False)
Validate before saving to database.
- pre_save(model_instance, add)
The field is not nullable; treat None as “no resource restriction”.
- class oauth2_provider.models.TokenChecksumField(*args, db_collation=None, **kwargs)
- pre_save(model_instance, add)
Return field’s value just before saving.
- oauth2_provider.models.check_redirect_to_uri_allowed(uri: str, allowed_uris: list[str]) tuple[bool, list[tuple[str | None, str]]]
Same check as
redirect_to_uri_allowed(), additionally reporting why the URI was rejected.Returns
(allowed, reasons).reasonsis only meaningful whenallowedisFalse: it holds one(candidate, reason)pair for every registered URI that failed to match, plus pairs with aNonecandidate for rejections of the requested URI itself. A reason names the component that differs instead of echoing the requested URI back, which callers log once and only after passing it through_loggable_uri().- Parameters:
uri – URI to check
allowed_uris – A list of URIs that are allowed
- oauth2_provider.models.get_access_token_admin_class()
Return the AccessToken admin class that is active in this project.
- oauth2_provider.models.get_access_token_model()
Return the AccessToken model that is active in this project.
- oauth2_provider.models.get_application_admin_class()
Return the Application admin class that is active in this project.
- oauth2_provider.models.get_application_model()
Return the Application model that is active in this project.
- oauth2_provider.models.get_device_grant_model()
Return the DeviceGrant model that is active in this project.
- oauth2_provider.models.get_grant_admin_class()
Return the Grant admin class that is active in this project.
- oauth2_provider.models.get_grant_model()
Return the Grant model that is active in this project.
- oauth2_provider.models.get_id_token_admin_class()
Return the IDToken admin class that is active in this project.
- oauth2_provider.models.get_id_token_model()
Return the IDToken model that is active in this project.
- oauth2_provider.models.get_refresh_token_admin_class()
Return the RefreshToken admin class that is active in this project.
- oauth2_provider.models.get_refresh_token_model()
Return the RefreshToken model that is active in this project.
- oauth2_provider.models.is_origin_allowed(origin, allowed_origins)
Checks if a given origin uri is allowed based on the provided allowed_origins configuration.
- Parameters:
origin – Origin URI to check
allowed_origins – A list of Origin URIs that are allowed
- oauth2_provider.models.redirect_to_uri_allowed(uri: str, allowed_uris: list[str]) bool
Checks if a given uri can be redirected to based on the provided allowed_uris configuration.
On top of exact matches, this function also handles loopback IPs based on RFC 8252.
- Parameters:
uri – URI to check
allowed_uris – A list of URIs that are allowed
- oauth2_provider.models.refresh_token_expire_timedelta()
Return
REFRESH_TOKEN_EXPIRE_SECONDSas atimedelta, orNonewhen refresh tokens do not age-expire (the setting is unset,0, ortimedelta(0)).Raises
ImproperlyConfiguredfor a non-numeric, out-of-range, or negative value (likeREFRESH_TOKEN_GRACE_PERIOD_SECONDS) so that both the validation-time enforcement andclear_expiredfail the same way on a misconfiguration instead of raising an opaqueTypeError/OverflowError.
- oauth2_provider.models.revoke_access_token(access_token: AbstractAccessToken) None
Revoke an access token and, if present, its bound refresh token.
Deleting the access token on its own leaves the refresh token usable (the
RefreshToken.access_tokenFK isSET_NULL), so it can still be exchanged for a fresh access token, defeating the revocation. Per RFC6749 Section 7009#section-2.1 revoking an access token MAY also revoke the bound refresh token; revoking the refresh token also deletes the bound access token, so it covers both. When there is no refresh token, revoke the access token directly (which deletes it).The bound refresh token is looked up with a forward query on the refresh token model rather than the reverse
access_token.refresh_tokenaccessor, whose name depends on therelated_namea swapped refresh token model may override.This is the single revoke path shared by the
/revoke/endpoint, theAuthorizedTokenDeleteView, and the admin “Revoke selected access tokens” action. Whether a refresh token may survive access-token revocation is a policy deferred to 4.x (see #1786).
- oauth2_provider.models.set_token_value(token_instance: AbstractAccessToken | AbstractRefreshToken, raw_token: str) None
Assign the raw token to a token instance, redacting the value stored at rest when COMPLIANT_BCP_RFC9700_TOKEN_STORAGE is enabled (RFC 9700).
The lookup checksum (
token_checksum) is always derived from the raw token; when redacting, the raw value is stashed on_raw_token(used only to compute the checksum, seeTokenChecksumField) and thetokencolumn is left blank so the reusable token is never persisted.Plaintext storage is an ambient config posture exercised on every token issuance, so (unlike the request-time gates) it is surfaced by the
--deploysystem checkW006rather than a per-token warning here. Seeoauth2_provider.bcp.