问题描述
我正在尝试将社会认证集成到我的 DRF 后端。我决定和python-social-auth一起去。如果我通过 Django(和 HTML 视图)提供我的社交登录,我可以看到我的登录成功。我还认为我可以在成功进行社交身份验证后重定向 here。
直到现在,我的前端(一个 Nuxt 应用)都在使用 DRF tokens。即使:
我是否有可能以某种方式设法将成功通过身份验证的用户重定向到前端使用关联且有效的 DRF 令牌作为查询参数?
解决方法
你可以,这不是微不足道的,不过。这是可能的,因为检索 URL(成功或错误)的机制委托给 strategies setting()
method,后者最终调用 get_setting()
on final implementations。您可以重写此方法以添加自定义逻辑。
这些步骤应该能让您上路:
-
定义自定义策略
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)
-
将您的
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
永远不会为真。