在social.apps.django_app.utils使用load_strategy():
social = request.user.social_auth.get(provider='azuread-oauth2')
strategy = load_strategy()
social.refresh_token(strategy)
现在可以从social.extra_data['access_token'] 检索更新的access_token。
最好的方法可能是检查它是否需要更新(针对 AzureAD Oauth2 定制):
def get_azuread_oauth2_token(user):
social = user.social_auth.get(provider='azuread-oauth2')
if social.extra_data['expires_on'] <= int(time.time()):
strategy = load_strategy()
social.refresh_token(strategy)
return social.extra_data['access_token']
这是基于 get_auth_tokenfrom AzureADOAuth2 的方法。我不认为这个方法可以在管道之外访问,如果有任何方法,请回答这个问题。
更新
更新 1 - 20/01/2017
在Issue 请求一个额外的数据参数和访问令牌刷新时间之后,现在可以检查access_token 是否需要在每个后端更新。
在未来的版本中(>0.2.1 for the social-auth-core)将在额外数据中添加一个新字段:
'auth_time': int(time.time())
这样就可以了:
def get_token(user, provider):
social = user.social_auth.get(provider=provider)
if (social.extra_data['auth_time'] + social.extra_data['expires']) <= int(time.time()):
strategy = load_strategy()
social.refresh_token(strategy)
return social.extra_data['access_token']
注意:根据OAuth 2 RFC,所有响应都应该(这是一个推荐参数)提供一个expires_in,但对于大多数后端(包括azuread-oauth2),这个值被保存为@987654343 @。请注意了解您的后端的行为方式!
存在一个Issue,当它存在时,我将使用相关信息更新答案。
更新 2 - 17/02/17
另外,UserMixin 中有一个名为access_token_expired (code) 的方法,可用于断言令牌是否有效(注意:此方法不为竞争条件工作,正如@SCasey 在this anwser 中指出的那样)。
更新 3 - 2017 年 5 月 31 日
在Python Social Auth - Core v1.3.0get_access_token(self, strategy) 中引入storage.py。
那么现在:
from social_django.utils import load_strategy
social = request.user.social_auth.get(provider='azuread-oauth2')
response = self.get_json('https://graph.microsoft.com/v1.0/me',
headers={'Authorization': '%s %s' % (social.extra_data['token_type'],
social.get_access_token(load_strategy())}
感谢@damio 指出。