2016-11-21 6 views
0

Я использую Django с python-social-auth для аутентификации пользователей с помощью Google OAuth2 и использования Youtube API.Как обновить токен Google OAuth2 программно

Что бы я хотел достигнуть, попросите их войти в систему и разрешить только один раз и иметь возможность использовать их учетные данные столько, сколько захотите. Это невозможно, потому что примерно через час они истекают, и мне нужно, чтобы пользователь повторно авторизовал мое приложение, чтобы получить новые учетные данные.

Я предполагаю, что решение должно периодически обновлять учетные данные, но я не мог найти надежного руководства в том, как это сделать.

Моя текущая конфигурация:

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' 
} 

Кроме того, авторизованный пользователь имеет следующие дополнительные услуги:

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

Я попытался освежать его на код ниже, но так как он все еще истекает, я думаю, это неверный путь:

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

вы можете увеличить значение «expires» –

+0

установить, что срок действия истекает, если вы хотите –

+0

Где я могу установить значение «expires»? В Google API Console или это конфигурация для PSA? – ihhcarus

ответ

0

После нескольких тестов я узнал, что использование refresh_token фактически делает обновить его еще в течение часа использования, так что мне нужно сделать, это хрон для запуска команды Django, чтобы обновить их до истечения срока действия, что-то, как показано ниже:

# 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 

То, что я действительно хотел, хотя это способ обновить/использовать токен по требованию, как и другие социальные сети (Instagram, Twitter, Facebook), которым нужен только один вход, а учетные данные никогда не истекают.

Смежные вопросы