微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 python-social-auth 后端获取 DRF 令牌

如何解决从 python-social-auth 后端获取 DRF 令牌

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

直到现在,我的前端(一个 Nuxt 应用)都在使用 DRF tokens。即使:

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

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

解决方法

你可以,这不是微不足道的,不过。这是可能的,因为检索 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 设置指向这个新策略(导入路径语法)

,

除了使用自定义策略(我认为这更符合库的风格)之外,还有另一个明确的解决方案:

由于 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 等登录” -> 在第三方(比如 Github)登录 -> 返回后端 /success/ -> 使用令牌重定向到前端 url(基于上述视图) -> 在前端处理查询参数(在我使用 Nuxt 的情况下,这非常简单)。

如果我们在路径 user_token 上挂载 /success/token/,那么一旦用户访问:http:<backend>:/login/github/?next=/success/token/,用户的每一个正确步骤都会将他/她带到查询的前端参数 token 设置为正确的标记。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。