如何以编程方式刷新 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)一样,只需要一次登录,凭据永不过期。
我将 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)一样,只需要一次登录,凭据永不过期。