2016-11-21 112 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

你可以增加「過期」值 –

+0

只要你想 –

+0

你可以在哪裏設置我的「過期」值?在Google的API控制檯中,還是PSA的配置? – ihhcarus

回答

0

經過一些更多的測試後,我發現使用refresh_token實際上不會刷新它使用的一個小時,所以我需要做的是有一個cron作業運行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)一樣只需要登錄並且憑證永不過期就可以刷新/獲取令牌的方式。