背景
我正在开发一个应用程序,用户可以邀请其他人就不同的资源进行协作。被邀请的人可能已经是该应用程序的用户,也可能是全新用户。当我使用allauth注册/登录时,被邀请者可以通过标准的注册/登录表单或通过三个社交帐户(fb、twitter、google)中的一个来响应邀请。在
由于这些要求,子类化DefaultAccountAdapter
和重写{
流量
逻辑
接受视图的url模式
url(r'^invitation/(?P<invite_key>[\w\d]+)/$', views.ResourceInviteAcceptanceView.as_view(), name='resource-invite-accept'),
这些是我的视图的基类
https://gist.github.com/jamesbrobb/748c47f46b9bd224b07f
这是invite acceptance视图的视图逻辑
^{pr2}$
问题
只要被邀请者单击链接并完成邀请接受过程,这一切都可以正常工作。在
但是。。。在
如果他们在该过程中的任何时候退出(显式或由于错误),那么“invite_key”仍然存在于会话中,因此在下一个人(无论是他们还是其他人)注册或登录时,都会得到处理。在
问题
处理这个问题最好的办法是什么?是否有一个不同的点可以将“invite_key”添加到会话中,以保证用户已经实际接受了邀请?在
对于标准注册/登录,这可以在重写的“forms\u valid”方法中进行,因为我们现在知道用户已经完成了这些过程中的任何一个。但我不知道当他们使用社交注册/登录时,在哪里/如何添加“邀请密钥”?在
--更新--
可能的解决方案1
通过社交登录,将邀请密钥添加到会话的最佳位置(以确保用户正在接受通过社交登录的邀请的过程中)似乎是通过在“pre_social_login”信号中添加接收器来实现的。我遇到的问题是,如何确保密钥在信号被触发时仍然是可访问的,以便可以将其添加到会话中?在
一个失败的解决方案是简单地访问receiver函数中的HTTP_REFERER,可以包含邀请url。可以从中取出密钥,然后将其添加到会话中。但是,如果用户是新应用程序或当前没有登录到其社交帐户,则此操作将失败,因为他们首先被重定向到社交帐户登录页(在社交帐户域上),然后当回调重定向发生并触发信号时,HTTP_REFERER的值不再存在。在
我无法找到一个好的方法,使邀请密钥值在信号接收器功能中可访问,如果没有它,会导致相同的原始问题?在
与此同时,有人刚刚构建了一个python包(django-invitations),它做得非常好,而且没有猴子补丁。在
在Github上查看:enter link description here
我已经想出了一个解决方案,但我不是百分之百满意,因为它涉及到monkey在
allauth.socialaccount.models.SocialLogin
上修补state_from_request
类方法。在原因是
这是一个单一的共享逻辑点,所有提供商在启动其社交身份验证过程时都会调用该点
在社交登录过程中,
SocialLogin
的“state”属性已存储在会话中,然后在完成过程中进行检索,并使用“pre-ung-social-login”信号进行传递这是从请求中检索特定值的原始方法,这些值存储在会话中,供allauth在处理完成后使用
这是补丁
^{pr2}$我已经从视图中删除了重写的
get
方法,并重写了forms_valid
方法,以将invite键添加到会话中,因为在标准登录/注册期间,我们知道invite已被接受这些是信号接收器的功能
相关问题 更多 >
编程相关推荐