Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python社交身份验证、Google和刷新令牌_Python_Django_Oauth 2.0_Google Oauth_Python Social Auth - Fatal编程技术网

Python社交身份验证、Google和刷新令牌

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设置文件中有以

在一个个人项目中,我尝试使用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,默认值={“刷新令牌”:额外数据[“刷新令牌”]}
    )
    
  • 将我们的新功能添加到社交网络中