Python社交身份验证、Google和刷新令牌
在一个个人项目中,我尝试使用Django作为我的前端,然后允许用户以特定形式输入的数据复制到GoogleSheets 谷歌自己的文档推荐使用,现在已经不推荐使用,而且文档还没有更新。有了这个,我开始尝试使用和。为了使Gspread能够正常工作,我不仅需要能够传递一个访问令牌,还需要传递一个刷新令牌。然而,Python Social Auth并没有将刷新标记与其余的“额外数据”一起持久化。查看保存的数据和路由到的URL,在我看来更像是通过Google+路由到某个地方 我的Django设置文件中有以下配置:Python社交身份验证、Google和刷新令牌,python,django,oauth-2.0,google-oauth,python-social-auth,Python,Django,Oauth 2.0,Google Oauth,Python Social Auth,在一个个人项目中,我尝试使用Django作为我的前端,然后允许用户以特定形式输入的数据复制到GoogleSheets 谷歌自己的文档推荐使用,现在已经不推荐使用,而且文档还没有更新。有了这个,我开始尝试使用和。为了使Gspread能够正常工作,我不仅需要能够传递一个访问令牌,还需要传递一个刷新令牌。然而,Python Social Auth并没有将刷新标记与其余的“额外数据”一起持久化。查看保存的数据和路由到的URL,在我看来更像是通过Google+路由到某个地方 我的Django设置文件中有以
AUTHENTICATION_BACKENDS = (
'social_core.backends.google.GoogleOAuth2',
'django.contrib.auth.backends.ModelBackend',
)
SOCIAL_AUTH_PIPELINE = (
'social_core.pipeline.social_auth.social_details',
'social_core.pipeline.social_auth.social_uid',
'social_core.pipeline.social_auth.social_user',
'social_core.pipeline.user.get_username',
'social_core.pipeline.user.create_user',
'social_core.pipeline.social_auth.associate_user',
'social_core.pipeline.social_auth.load_extra_data',
'social_core.pipeline.user.user_details',
'social_core.pipeline.social_auth.associate_by_email',
)
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '...'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '...'
SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE = ['https://www.googleapis.com/auth/spreadsheets']
- 有没有更好的方法来访问谷歌表单李>
- PSA或google将我重定向到google+auth流而不是google Oauth2,这是对的吗
- 如果没有,那么必须进行哪些更改才能使Python Social Auth保留刷新标记
python social auth
将使用Google+平台的一些部分,至少是API来检索用户的详细信息以填写帐户
从您的设置中,我看到底部有associate_by_email
,在这一点上,在这一点上它没有任何用处,因为用户已经被创建了,如果您真的打算使用它,它必须在create_user
之前,您可以检查它作为参考
为了从google获得刷新\u令牌
,您需要告诉它您想要一个,为此您需要设置离线
访问类型:
SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS = {
'access_type': 'offline'
}
通过该设置,Google将为您提供一个
刷新\u令牌
,它将自动存储在额外数据中
,python social auth
确实将使用Google+平台的一些部分,至少是API来检索用户的详细信息以填写帐户
从您的设置中,我看到底部有associate_by_email
,在这一点上,在这一点上它没有任何用处,因为用户已经被创建了,如果您真的打算使用它,它必须在create_user
之前,您可以检查它作为参考
为了从google获得刷新\u令牌
,您需要告诉它您想要一个,为此您需要设置离线
访问类型:
SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS = {
'access_type': 'offline'
}
通过该设置,Google将为您提供一个
刷新\u令牌
,它将自动存储在额外数据中
只需在您的设置中提供该令牌即可。py
:
SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_参数={
“访问类型”:“脱机”,
“hd”:“xyzabc.com”,
“批准提示”:“强制”
}
请记住,
{'approval\u prompt':'force'}
将强制用户选择gmail帐户,这样您将获得刷新令牌。只需在设置中提供此项。py
:
SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_参数={
“访问类型”:“脱机”,
“hd”:“xyzabc.com”,
“批准提示”:“强制”
}
请记住,
{'approval\u prompt':'force'}
将强制用户选择gmail帐户,这样您将获得刷新令牌。您可以使用变量向OAuth2提供程序发送额外参数
SOCIAL_AUTH_<PROVIDER>_AUTH_EXTRA_ARGUMENTS
EXTRA\u参数的结果将存储在EXTRA\u数据中
,因此刷新令牌可以如下访问:
refresh\u token=user.social\u auth.get(provider=“google-oauth2”).extra\u data[“refresh\u token”]
一种可能的解决方案是,通过向social auth管道添加自定义函数,将刷新令牌与用户一起存储在UserProfile
模型中:
创建模型
#models.py
类UserProfile(models.Model):
user=models.OneToOneField(用户,on_delete=models.CASCADE,related_name=“profile”)
刷新令牌=models.CharField(最大长度=255,默认值=)
添加一个函数以访问并存储刷新令牌
#pipeline.py
从.models导入用户配置文件
def存储\刷新\令牌(用户=无,*args,**kwargs):
extra_data=user.social_auth.get(provider=“google-oauth2”).extra_数据
UserProfile.objects.get\u或创建(
user=user,默认值={“刷新令牌”:额外数据[“刷新令牌”]}
)
将我们的新功能添加到social auth管道中李>
#settings.py
...
社会认证管道=(
...
“我的应用程序.管道.存储\u刷新\u令牌”
)
社交验证谷歌OAUTH2范围=[
'https://www.googleapis.com/auth/spreadsheets'
#您还需要其他范围吗
]
...
该令牌现在存储在用户旁边,可用于初始化sheets客户端或您需要的任何其他内容。您可以使用变量向OAuth2提供程序发送额外参数
SOCIAL_AUTH_<PROVIDER>_AUTH_EXTRA_ARGUMENTS
EXTRA\u参数的结果将存储在EXTRA\u数据中
,因此刷新令牌可以如下访问:
refresh\u token=user.social\u auth.get(provider=“google-oauth2”).extra\u data[“refresh\u token”]
一种可能的解决方案是,通过向social auth管道添加自定义函数,将刷新令牌与用户一起存储在UserProfile
模型中:
创建模型
#models.py
类UserProfile(models.Model):
user=models.OneToOneField(用户,on_delete=models.CASCADE,related_name=“profile”)
刷新令牌=models.CharField(最大长度=255,默认值=)
添加一个函数以访问并存储刷新令牌
#pipeline.py
从.models导入用户配置文件
def存储\刷新\令牌(用户=无,*args,**kwargs):
extra_data=user.social_auth.get(provider=“google-oauth2”).extra_数据
UserProfile.objects.get\u或创建(
user=user,默认值={“刷新令牌”:额外数据[“刷新令牌”]}
)
将我们的新功能添加到社交网络中