Skip to main content

Token Management

Complete guide to managing OAuth tokens in your application.

Token Types​

SVA OAuth provides three types of tokens:

  1. Access Token - Used for API authentication (expires in 1 hour)
  2. Refresh Token - Used to refresh access tokens (expires in 30 days)
  3. Data Token - Contains user identity claims (expires in 5 minutes)

Automatic Token Refresh​

The TokenRefreshMiddleware automatically refreshes tokens:

# settings.py
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
# ... other middleware
'sva_oauth_client.middleware.TokenRefreshMiddleware',
]

How It Works​

  1. Checks token expiry on each request
  2. Refreshes if token expires within 60 seconds
  3. Updates session with new tokens
  4. Handles failures gracefully

Manual Token Refresh​

Refresh tokens manually if needed:

from sva_oauth_client.client import get_client_from_settings, SVATokenError
from sva_oauth_client.utils import get_access_token

def refresh_token_manually(request):
"""Manually refresh access token"""
refresh_token = request.session.get('sva_oauth_refresh_token')

if not refresh_token:
return False

try:
client = get_client_from_settings()
new_tokens = client.refresh_access_token(refresh_token)

# Update session
request.session['sva_oauth_access_token'] = new_tokens['access_token']

if 'refresh_token' in new_tokens:
request.session['sva_oauth_refresh_token'] = new_tokens['refresh_token']

if 'data_token' in new_tokens:
request.session['sva_oauth_data_token'] = new_tokens['data_token']

# Update expiry
from datetime import datetime, timezone
new_expires_in = new_tokens.get('expires_in', 3600)
new_expiry = datetime.now(timezone.utc).timestamp() + new_expires_in
request.session['sva_access_token_expiry'] = new_expiry

return True
except SVATokenError:
return False

Token Storage​

Tokens are stored in Django session:

# Session keys
request.session['sva_oauth_access_token'] # Access token
request.session['sva_oauth_refresh_token'] # Refresh token
request.session['sva_oauth_data_token'] # Data token
request.session['sva_oauth_scope'] # Approved scopes
request.session['sva_access_token_expiry'] # Expiry timestamp
request.session['sva_remember_me'] # Remember me preference

Token Expiration​

Access Token​

  • Lifetime: 1 hour (default)
  • Usage: API authentication
  • Refresh: Automatic via middleware

Refresh Token​

  • Lifetime: 30 days (default)
  • Usage: Token renewal
  • Refresh: Included in refresh response (may rotate)

Data Token​

  • Lifetime: 5 minutes (default)
  • Usage: User identity claims
  • Refresh: New token on re-authentication

Checking Token Status​

Check if Authenticated​

from sva_oauth_client.utils import is_authenticated

if is_authenticated(request.session):
# User is authenticated
pass

Check Token Expiry​

from datetime import datetime, timezone

access_token_expiry = request.session.get('sva_access_token_expiry')

if access_token_expiry:
expiry_datetime = datetime.fromtimestamp(access_token_expiry, tz=timezone.utc)
now = datetime.now(timezone.utc)
time_until_expiry = (expiry_datetime - now).total_seconds()

if time_until_expiry <= 0:
# Token expired
pass

Token Errors​

Handling Token Errors​

from sva_oauth_client.utils import get_sva_claims
from sva_oauth_client.client import SVATokenError

try:
claims = get_sva_claims(request)
except SVATokenError:
# Token expired or invalid
# User will be logged out automatically
pass

Token Refresh Failures​

If token refresh fails:

  1. User is logged out automatically
  2. Session is cleared
  3. User is redirected to login

Remember Me​

Enabling Remember Me​

<!-- Login form -->
<form method="post" action="{% url 'sva_oauth_client:login' %}">
{% csrf_token %}
<label>
<input type="checkbox" name="remember_me" value="true">
Remember me for 30 days
</label>
<button type="submit">Sign In</button>
</form>

Session Expiry​

  • With Remember Me: Session expires in 30 days
  • Without Remember Me: Session expires when browser closes

Token Revocation​

Logout​

Logout clears all tokens:

from sva_oauth_client.utils import clear_oauth_session

def logout(request):
clear_oauth_session(request.session)
return redirect('/')

Or use the built-in view:

# urls.py
path('oauth/', include('sva_oauth_client.urls')),

# Template
<a href="{% url 'sva_oauth_client:logout' %}">Logout</a>

Best Practices​

  1. Use middleware - Automatic token refresh
  2. Handle errors - Token expiration and refresh failures
  3. Secure storage - Tokens in server-side session
  4. Monitor expiry - Check token status regularly
  5. Clear on logout - Remove all tokens on logout

Next Steps​