2016-11-21 4 views
0

J'utilise Django avec python-social-auth pour authentifier mes utilisateurs avec Google OAuth2 et utiliser l'API Youtube. Ce que je voudrais accomplir est leur demander de se connecter et autoriser seulement une fois et être capable d'utiliser leurs informations d'identification aussi longtemps que je veux. Ce n'est pas possible car après environ une heure, ils expirent et j'ai besoin que l'utilisateur réautorise mon application pour obtenir de nouvelles informations d'identification.Comment actualiser le jeton Google OAuth2 par programmation

Je suppose que la solution consiste à actualiser les informations d'identification périodiquement, mais je n'ai trouvé aucun guide fiable sur la façon de procéder.

Ma configuration actuelle est la suivante:

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = 'the_key' 
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 'the_secret' 
SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE = ["https://www.googleapis.com/auth/youtube.readonly", "https://www.googleapis.com/auth/yt-analytics.readonly"] 
SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS = { 
    'access_type': 'offline', 
    'approval_prompt': 'force' 
} 

En outre, un utilisateur autorisé a les extras suivants:

{ 
    "access_token": "the_access_token", 
    "expires": 3600, 
    "refresh_token": "the_refresh_token", 
    "token_type": "Bearer" 
} 

Je l'ai essayé rafraîchissant avec le code ci-dessous, mais étant donné qu'il expire encore je pense ce n'est pas la bonne façon:

social_user = UserSocialAuth.objects.get(...) # Fetch the instance 
social_user.refresh_token(load_strategy()) # Returns "None" 
+0

vous pouvez augmenter la valeur 'expires' –

+0

définir vous expire la valeur aussi longtemps que vous voulez –

+0

Où je peux définir ma valeur "expire"? Dans la console API de Google ou est-ce une configuration pour PSA? – ihhcarus

Répondre

0

Après quelques tests supplémentaires, j'ai découvert que l'utilisation de refresh_token en réalité pour le rafraîchir pendant une heure d'utilisation, donc ce que je dois faire est d'avoir une tâche cron pour exécuter une commande Django pour les rafraîchir avant l'expiration, quelque chose comme ci-dessous:

# app/management/commands/refresh_token_youtube.py  

from django.core.management.base import BaseCommand 
from social.apps.django_app.me.models import UserSocialAuth 
from social.apps.django_app.utils import load_strategy 


class Command(BaseCommand): 
    def handle(self, *args, **options): 
     for social_user in UserSocialAuth.objects.filter(provider='google-oauth2'): 
      social_user.refresh_token(load_strategy()) 

# crontab to run it every 30th minute 

*/30 * * * * /path_to/env/bin/python /path_to/refresh_token_youtube.py 

Ce que je voulais vraiment bien est un moyen de pouvoir actualiser/avoir le jeton à la demande comme les autres réseaux sociaux fournissent (Instagram, Twitter, Facebook) qui ont seulement besoin d'une connexion et les informations d'identification n'expirent jamais.