social-auth-app-django:刷新 access_token
social-auth-app-django: Refresh access_token
我为我的 Django 网站使用 social-auth-app-django。
登录一切正常,但在令牌过期后。我无法再访问 google 的用户数据。
我找到了如何刷新令牌,但它给出了
File "/mnt/s/github/nascentapp/app/booking/management/commands/sendmail.py", line 17, in handle
new_token = self.get_token(user=booking_user, provider='google-oauth2')
File "/mnt/s/github/nascentapp/app/booking/management/commands/sendmail.py", line 28, in get_token
social.refresh_token(strategy)
File "/home/sander/.local/share/virtualenvs/app-YMrBBUv3/lib/python3.6/site-packages/social_core/storage.py", line 58, in refresh_token
response = backend.refresh_token(token, *args, **kwargs)
File "/home/sander/.local/share/virtualenvs/app-YMrBBUv3/lib/python3.6/site-packages/social_core/backends/oauth.py", line 438, in refresh_token
request = self.request(url, **request_args)
File "/home/sander/.local/share/virtualenvs/app-YMrBBUv3/lib/python3.6/site-packages/social_core/backends/base.py", line 234, in request
response.raise_for_status()
File "/home/sander/.local/share/virtualenvs/app-YMrBBUv3/lib/python3.6/site-packages/requests/models.py", line 941, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://accounts.google.com/o/oauth2/token
这是我的一些代码
def get_token(self, user, provider):
social = user.social_auth.get(provider=provider)
print('This is social of user: ', social)
if (social.extra_data['auth_time'] + social.extra_data['expires']) <= int(time.time()):
print('\n Token is out of date \n')
strategy = load_strategy()
social.refresh_token(strategy)
return social.extra_data['access_token']
在我的设置文件中:
AUTHENTICATION_BACKENDS = (
'social_core.backends.open_id.OpenIdAuth', # for Google authentication
'social_core.backends.google.GoogleOpenId', # for Google authentication
'social_core.backends.google.GoogleOAuth2', # for Google authentication
'django.contrib.auth.backends.ModelBackend',
)
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = os.environ.get('DJANGO_SOCIAL_AUTH_GOOGLE_OAUTH2_KEY') # Paste CLient Key
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = os.environ.get('DJANGO_SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET') # Paste Secret Key
SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE = [
'https://www.googleapis.com/auth/calendar.readonly',
'https://www.googleapis.com/auth/calendar.events'
]
通过添加此修复它:
SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS = {
'access_type': 'offline',
'approval_prompt': 'auto'
}
如果用户已经注册,第一次需要强制提示(否则你得不到刷新令牌)
/login/google-oauth2?approval_prompt=force
我为我的 Django 网站使用 social-auth-app-django。 登录一切正常,但在令牌过期后。我无法再访问 google 的用户数据。 我找到了如何刷新令牌,但它给出了
File "/mnt/s/github/nascentapp/app/booking/management/commands/sendmail.py", line 17, in handle
new_token = self.get_token(user=booking_user, provider='google-oauth2')
File "/mnt/s/github/nascentapp/app/booking/management/commands/sendmail.py", line 28, in get_token
social.refresh_token(strategy)
File "/home/sander/.local/share/virtualenvs/app-YMrBBUv3/lib/python3.6/site-packages/social_core/storage.py", line 58, in refresh_token
response = backend.refresh_token(token, *args, **kwargs)
File "/home/sander/.local/share/virtualenvs/app-YMrBBUv3/lib/python3.6/site-packages/social_core/backends/oauth.py", line 438, in refresh_token
request = self.request(url, **request_args)
File "/home/sander/.local/share/virtualenvs/app-YMrBBUv3/lib/python3.6/site-packages/social_core/backends/base.py", line 234, in request
response.raise_for_status()
File "/home/sander/.local/share/virtualenvs/app-YMrBBUv3/lib/python3.6/site-packages/requests/models.py", line 941, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://accounts.google.com/o/oauth2/token
这是我的一些代码
def get_token(self, user, provider):
social = user.social_auth.get(provider=provider)
print('This is social of user: ', social)
if (social.extra_data['auth_time'] + social.extra_data['expires']) <= int(time.time()):
print('\n Token is out of date \n')
strategy = load_strategy()
social.refresh_token(strategy)
return social.extra_data['access_token']
在我的设置文件中:
AUTHENTICATION_BACKENDS = (
'social_core.backends.open_id.OpenIdAuth', # for Google authentication
'social_core.backends.google.GoogleOpenId', # for Google authentication
'social_core.backends.google.GoogleOAuth2', # for Google authentication
'django.contrib.auth.backends.ModelBackend',
)
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = os.environ.get('DJANGO_SOCIAL_AUTH_GOOGLE_OAUTH2_KEY') # Paste CLient Key
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = os.environ.get('DJANGO_SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET') # Paste Secret Key
SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE = [
'https://www.googleapis.com/auth/calendar.readonly',
'https://www.googleapis.com/auth/calendar.events'
]
通过添加此修复它:
SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS = {
'access_type': 'offline',
'approval_prompt': 'auto'
}
如果用户已经注册,第一次需要强制提示(否则你得不到刷新令牌)
/login/google-oauth2?approval_prompt=force