Przeglądaj źródła

Added two helper utility method to get new access token while it get expired

Mohidul Islam 5 lat temu
rodzic
commit
374307e18a
4 zmienionych plików z 52 dodań i 6 usunięć
  1. 5 1
      gauth/admin.py
  2. 2 2
      gauth/models.py
  3. 41 0
      gauth/utils.py
  4. 4 3
      gauth/views.py

+ 5 - 1
gauth/admin.py

@@ -2,4 +2,8 @@ from django.contrib import admin
 from .models import UserModel
 
 
-admin.site.register(UserModel)
+class UserModelAdmin(admin.ModelAdmin):
+    list_display = ['user', 'refresh_token']
+
+
+admin.site.register(UserModel, UserModelAdmin)

+ 2 - 2
gauth/models.py

@@ -6,5 +6,5 @@ class UserModel(models.Model):
     user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='token_of')
     refresh_token = models.CharField(max_length=30)
 
-    def __repr__(self):
-        self.user.username
+    def __str__(self):
+        return self.user.username

+ 41 - 0
gauth/utils.py

@@ -0,0 +1,41 @@
+from django.utils import timezone
+from .views import CLIENT_SECRETS_FILE
+from requests import post
+
+from .models import UserModel
+
+
+def has_expired(credentials):
+    expiry_time = credentials['access_token']
+    return timezone.datetime.now() > expiry_time
+
+
+def get_access_token(request):
+    uid = request.user.id
+    user = UserModel.objects.filter(pk=uid)
+    if user:
+        refresh_token = user.refresh_token
+    else:
+        return None
+
+    client_id = CLIENT_SECRETS_FILE.client_id
+    client_secret = CLIENT_SECRETS_FILE.client_secret
+    token_uri = CLIENT_SECRETS_FILE.token_uri
+    params = {
+        "grant_type": "refresh_token",
+        "client_id": client_id,
+        "client_secret": client_secret,
+        "refresh_token": refresh_token
+    }
+
+    response = post(token_uri, data=params).json()
+    access_token = response['access_token']
+    expires_in = response['expires_in']
+    expired_at = timezone.datetime.now() + timezone.timedelta(seconds=expires_in)
+    expiry = str(expired_at)
+    credentials = {
+        'access_token': access_token,
+        'expiry': expiry
+    }
+    request.session['credentials'] = credentials
+    return response.access_token

+ 4 - 3
gauth/views.py

@@ -42,13 +42,14 @@ def oauth2callback(request):
     credentials = flow.credentials
     request.session['credentials'] = credentials_to_dict(credentials)
     refresh_token = credentials.refresh_token
-    user_token = UserModel(user=request.user, refresh_token=refresh_token)
-    user_token.save()
+    user_model = UserModel.objects.create(user=request.user, refresh_token=refresh_token)
+    user_model.save()
     return redirect(reverse('home'))
 
 
 def credentials_to_dict(credentials):
+    expiry = str(credentials.expiry.utcnow())
     return {
         'access_token': credentials.token,
-        'expiry': credentials.expiry
+        'expiry': expiry
     }