如何以编程方式刷新 Google OAuth2 令牌

How to refresh Google OAuth2 token programatically

我将 Django 与 python-social-auth 结合使用,通过 Google OAuth2 对我的用户进行身份验证,并使用 Youtube API。

我想要实现的是要求他们仅登录并授权 一次 并且能够在我需要时使用他们的凭据。这是不可能的,因为大约一个小时后它们就会过期,我需要用户重新授权我的应用程序以获取新凭据。

我假设解决方案是定期刷新凭据,但我找不到有关如何执行此操作的任何可靠指南。

我当前的配置是:

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"

经过更多测试后,我发现使用 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

不过,我真正想要的是一种能够 refresh/have 按需提供令牌的方法,就像其他社交网络提供的(Instagram、Twitter、Facebook)一样,只需要一次登录,凭据永不过期。