【问题标题】:Get DRF token from python-social-auth backend从 python-social-auth 后端获取 DRF 令牌
【发布时间】:2021-08-03 02:22:35
【问题描述】:

我正在尝试将社交身份验证集成到我的 DRF 后端。我决定选择python-social-auth。如果我通过 Django(和 HTML 视图)提供我的社交登录,我可以看到我的登录成功。我还认为我可以在成功进行社交身份验证后重定向here

到目前为止,我的前端(一个 Nuxt 应用程序)使用的是DRF tokens。即使:

  1. 我可以为社交帐户创建有效的令牌。
  2. 我的前端可以将用户重定向到 -> 使用 OAuth 站点完成授权,例如Google、Twitter -> 回到前端。

我是否有可能以某种方式设法将成功通过身份验证的用户重定向到前端使用关联且有效的 DRF 令牌作为查询参数?

【问题讨论】:

    标签: django django-rest-framework python-social-auth


    【解决方案1】:

    你可以,这不是微不足道的。这是可能的,因为检索 URL(成功或错误)的机制被委托给 strategies setting() method,最终调用 get_setting() on final implementations。您可以覆盖此方法以添加您的自定义逻辑。

    这些步骤应该让您上路:

    1. 定义自定义策略

      from social_django.strategy import DjangoStrategy
      
      
      class CustomStrategy(DjangoStrategy):
          def get_setting(self, name):
              if name == 'LOGIN_REDIRECT_URL':
                  token = get_drf_token()
                  return f'/?toke={token}'
               else:
                   return super().get_setting(name)
      
    2. 将您的SOCIAL_AUTH_STRATEGY 设置指向这个新策略(导入路径语法)

    【讨论】:

    • 嗯,没有设置名为LOGIN_REDIRECT_URL,所以路径永远不会命中。
    • 您可以使用所需的值自行定义设置
    • 我试过了,但我仍然一无所知。我在想策略中会有一些最终的redirect 函数,我可以覆盖它。你有什么进一步的指点吗?
    • 重定向由常见的do_complete() action 处理,您是否恰好定义了NEW_ASSOCIATION_REDIRECT_URLNEW_USER_REDIRECT_URL 设置?
    • 非常感谢!不,我没有定义这些。
    【解决方案2】:

    除了使用自定义策略,我认为这更像是图书馆的风格,还有另一个明确的解决方案:

    由于python-social-auth 允许在成功验证后重定向,因此打开另一个端点,它将 a.生成令牌 b.重定向到前端。所以我定义了关注api_view

    @api_view(http_method_names=['get'])
    def user_token(request):
        if request.user.is_authenticated:
            token, e = Token.objects.get_or_create(user=request.user)
            return redirect('<front-end>/?token='+token.key)
        else:
            return redirect(`<front-end>/login/?error=true')
    

    现在一个潜在的身份验证流程是这样的:

    用户访问前端 -> 点击“使用 Github et.al. 登录” -> 在第三方(比如 Github)登录 -> 回到后端/success/ -> 使用令牌重定向到前端 url(基于上面的视图) -> 在前端处理查询参数(即在我使用 Nuxt 的情况下非常简单)。

    如果我们将user_token挂载到路径/success/token/,那么一旦用户访问:http:&lt;backend&gt;:/login/github/?next=/success/token/,用户部分的每一个正确步骤都会将他/她带到前端,查询参数token设置为正确的令牌。

    更新:这仅在 DRF 启用会话身份验证时才有效,否则 request.user.is_authenticated 永远不会为真。

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 2022-12-17
      • 2018-03-04
      • 2021-08-24
      • 1970-01-01
      相关资源
      最近更新 更多