Django-allauth,如何只允许通过社交媒体注册/登录?

9

我只想允许用户使用他们的社交账户进行注册或登录。我已经实现了社交账户的注册和登录功能,但是我不知道如何禁用本地注册。

我已经阅读了文档,但这似乎与我想要的不太一样。

ACCOUNT_FORMS (={})
    Used to override forms, for example: {‘login’: ‘myapp.forms.LoginForm’}

看起来我可以创建一个新的注册表单,只包括社交登录链接,但我希望还有更简单的方法,可能我错过了什么。我还是新手,所以经常会忽略一些显而易见的东西。

我也尝试将下面的代码更改为False,但这样会禁用社交注册。

allauth.account.adapter.py

def is_open_for_signup(self, request):
    """
    Checks whether or not the site is open for signups.

    Next to simply returning True/False you can also intervene the
    regular flow by raising an ImmediateHttpResponse
    """
    return True
3个回答

9

更改模板和urlpatterns

您需要更改默认情况下由allauth提供的模板(登录, 注册等)和urlpatterns, 这些与使用电子邮件进行经典注册/登录流程有关。

  • 通过更改/减少urlpatterns中可用的路由,可以确保只有应该存在的路由可用。如果正确执行,则任何企图入侵现有allauth默认功能(与电子邮件相关)的尝试都将显示HTTP错误404。
  • 更改模板可以确保用户界面不提供与基于电子邮件的身份验证相关的内容。

没有简单的选项可用

不幸的是,截至今天,django-allauth还没有简单的切换或设置来禁用基于电子邮件的注册和身份验证。有关更多详细信息,请查看GitHub:

  • 问题 #1227(“仅社交:通过简单设置禁用所有本地账户处理”)
  • 问题 #345(“如何禁用表单登录/注册?”)

示例:urls.py

像这样的urls.py将与当前的django-allauth(v0.30.0)在Django 1.10上正常工作:

from django.conf.urls import include, url

from allauth.account.views import confirm_email, login, logout
from allauth.compat import importlib
from allauth.socialaccount import providers

providers_urlpatterns = []

for provider in providers.registry.get_list():
    prov_mod = importlib.import_module(provider.get_package() + '.urls')
    providers_urlpatterns += getattr(prov_mod, 'urlpatterns', [])

urlpatterns = [
    url(r'^auth/', include(providers_urlpatterns)),
    url(r'^confirm-email/(?P<key>[-:\w]+)/$', confirm_email, name='account_confirm_email'),
    url(r'^login/$', login, name='account_login'),
    url(r'^logout/$', logout, name='account_logout'),
    url(r'^signup/$', login, name='account_signup'),  # disable email signup
]

2

好的,这是问题。如果您不使用任何社交账户来链接您的用户,那么只需包含所需的url即可完成您描述的任务非常简单。然而,如果您需要使用社交账户来链接您的用户,则必须包括所有url,因为大多数第三方应用程序将不会认证您的应用程序的请求。他们只接受来自allauth的请求。

from django.urls import path, re_path
from allauth.account import views as accountviews

urlpatterns = [
                path('admin/', admin.site.urls),
                # remember to comment out the following line since it will
                # include all urls from allauth lib
                # path('accounts/', include('allauth.urls'))
]

# assume you only want singup page and login page from allauth
urlpatterns += [path("acc/signup/", accountviews.signup, name="account_signup"),
                path("acc/login/", accountviews.login, name="account_login")
]

2

解决方案并非我最初想象的那样。比起更改表单,更简单的方法是更改模板,并且只删除该模板中的其他选项。

现在我的页面正确地仅显示社交认证,我很高兴。

如果有更好或更安全的答案,我将乐于接受。作为一个新手,我不知道这是否是最佳解决方案,但目前看来它很棒,我会将其标记为已回答。


您可以在 GitHub 上查看“如何禁用表单登录/注册?”问题。其中列出了替代解决方案尝试和当前的讨论。 - Peterino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接