|
1 | 1 | import logging |
| 2 | +from datetime import datetime, timedelta |
2 | 3 |
|
3 | 4 | import jwt |
4 | | -from django.contrib.auth import get_user_model |
| 5 | +from django.contrib.auth import get_user_model, logout |
5 | 6 | from django.contrib.auth.backends import ModelBackend |
6 | 7 | from django.contrib.auth.models import Group |
7 | 8 | from django.core.exceptions import (ImproperlyConfigured, ObjectDoesNotExist, |
8 | 9 | PermissionDenied) |
| 10 | +from requests import HTTPError |
9 | 11 |
|
10 | 12 | from django_auth_adfs import signals |
11 | 13 | from django_auth_adfs.config import provider_config, settings |
@@ -398,10 +400,38 @@ def authenticate(self, request=None, authorization_code=None, **kwargs): |
398 | 400 | provider_config.load_config() |
399 | 401 |
|
400 | 402 | adfs_response = self.exchange_auth_code(authorization_code, request) |
401 | | - access_token = adfs_response["access_token"] |
402 | | - user = self.process_access_token(access_token, adfs_response) |
| 403 | + user = self._process_adfs_response(request, adfs_response) |
403 | 404 | return user |
404 | 405 |
|
| 406 | + def _process_adfs_response(self, request, adfs_response): |
| 407 | + user = self.process_access_token(adfs_response['access_token'], adfs_response) |
| 408 | + request.session['adfs_access_token'] = adfs_response['access_token'] |
| 409 | + expiry = datetime.now() + timedelta(seconds=adfs_response['expires_in']) |
| 410 | + request.session['adfs_token_expiry'] = expiry.isoformat() |
| 411 | + if 'refresh_token' in adfs_response: |
| 412 | + request.session['adfs_refresh_token'] = adfs_response['refresh_token'] |
| 413 | + request.session.save() |
| 414 | + return user |
| 415 | + |
| 416 | + def process_request(self, request): |
| 417 | + now = datetime.now() + settings.REFRESH_THRESHOLD |
| 418 | + expiry = datetime.fromisoformat(request.session['adfs_token_expiry']) |
| 419 | + if now > expiry: |
| 420 | + try: |
| 421 | + self._refresh_access_token(request, request.session['adfs_refresh_token']) |
| 422 | + except (PermissionDenied, HTTPError): |
| 423 | + logout(request) |
| 424 | + |
| 425 | + def _refresh_access_token(self, request, refresh_token): |
| 426 | + provider_config.load_config() |
| 427 | + response = provider_config.session.post( |
| 428 | + provider_config.token_endpoint, |
| 429 | + data=f'grant_type=refresh_token&refresh_token={refresh_token}' |
| 430 | + ) |
| 431 | + response.raise_for_status() |
| 432 | + adfs_response = response.json() |
| 433 | + self._process_adfs_response(request, adfs_response) |
| 434 | + |
405 | 435 |
|
406 | 436 | class AdfsAccessTokenBackend(AdfsBaseBackend): |
407 | 437 | """ |
|
0 commit comments