【问题标题】:Python Social Auth, Google, and refresh tokenPython Social Auth、Google 和刷新令牌
【发布时间】:2018-07-18 10:18:46
【问题描述】:

在一个个人项目中,我尝试使用 Django 作为我的前端,然后允许将用户以特定形式输入的数据复制到谷歌表格。

Google 自己的文档建议使用 https://github.com/google/oauth2client,它现在已被弃用,并且文档尚未更新。有了这个,我开始尝试使用Python Social AuthGspread。为了使 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']
  • 有没有更好的方法来访问 Google 表格?
  • 我是否更正了 PSA 或 google 将我重定向到 Google+ 身份验证流程而不是 Google Oauth2?
  • 如果不是,必须进行哪些更改才能使 Python Social Auth 保留刷新令牌?

【问题讨论】:

    标签: python django oauth-2.0 google-oauth python-social-auth


    【解决方案1】:

    python-social-auth 确实会使用 Google+ 平台的某些部分,至少是用于检索用户详细信息以填写帐户的 API。

    从你的设置中,我看到你在底部有associate_by_email,那个时候,那个时候它没有用,因为已经创建了用户,如果你真的打算使用它,它必须在create_user一个,可以查看DEFAULT_PIPELINE作为参考。

    为了从谷歌获得refresh_token,你需要告诉它你想要一个,为此你需要设置offline访问类型:

    SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS = {
      'access_type': 'offline'
    }
    

    通过该设置,Google 将为您提供refresh_token,并将自动存储在extra_data 中。

    【讨论】:

    • 我做了同样的事情,但没有改变。我没有在extra_data 中获得刷新令牌
    • @ShashankHegde 你有想过这个吗?我看到了同样的事情。
    • 只要提供这个:SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS = { 'access_type': 'offline', 'hd': 'stayabode.com', 'approval_prompt':'force' } 记住approval_prompt : force 会强制用户选择 gmail 帐户,这样您将获得刷新令牌。
    【解决方案2】:

    只需在您的settings.py 中提供此信息:

    SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS = { 'access_type': 'offline', 'hd': 'xyzabc.com', 'approval_prompt':'force' } 请记住,{'approval_prompt' : 'force'} 会强制用户选择 gmail 帐户,这样您将获得刷新令牌。

    【讨论】:

      【解决方案3】:

      您可以使用变量向 OAuth2 提供者发送额外的参数

      SOCIAL_AUTH_<PROVIDER>_AUTH_EXTRA_ARGUMENTS
      

      对于 Google,您可以看到他们接受的额外参数 in their documentation (scroll down to "parameters")。我们要找的是access_type:

      access_type:指示您的应用程序是否可以在用户不在浏览器时刷新访问令牌。有效的参数值是在线(默认值)和离线。

      所以我们可以将以下内容添加到settings.py,表示我们想要接收刷新令牌:

      SOCIAL_AUTH_GOOGLE_OAUTH2_EXTRA_ARGUMENTS = {"access_type: offline"}
      

      来自EXTRA_ARGUMENTS 的结果将存储在extra_data 中,因此可以这样访问刷新令牌:

      refresh_token = user.social_auth.get(provider="google-oauth2").extra_data["refresh_token"]
      

      一种可能的解决方案是将刷新令牌与用户一起存储在 UserProfile 模型中,方法是向 social-auth 管道添加自定义函数:

      1. 创建模型
      # models.py
      
      class UserProfile(models.Model):
          user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile")
          refresh_token = models.CharField(max_length=255, default="")
      
      1. 添加访问存储刷新令牌的函数
      # pipeline.py
      
      from .models import UserProfile
      
      def store_refresh_token(user=none, *args, **kwargs):
          extra_data = user.social_auth.get(provider="google-oauth2").extra_data
          UserProfile.objects.get_or_create(
              user=user, defaults={"refresh_token": extra_data["refresh_token"]}
          )
      
      1. 将我们的新功能添加到社交身份验证管道中。
      # settings.py
      
      ...
      
      SOCIAL_AUTH_PIPELINE = (
          ...
          "my-app.pipeline.store_refresh_token"
      )  
      
      SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE = [
          'https://www.googleapis.com/auth/spreadsheets'
          # any other scopes you need
      ]
      
      ...
      

      令牌现在存储在用户旁边,可用于初始化表格客户端或您需要的任何其他内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-03
        • 2016-09-04
        • 2017-05-18
        • 1970-01-01
        • 1970-01-01
        • 2012-10-06
        相关资源
        最近更新 更多