跳转到主要内容

Django的SceneID身份验证

项目描述

django-sceneid

SceneID 为Django提供身份验证

如何工作

假设您的网站已经有一个现有的基于 Django身份验证框架 的登录系统。SceneID不会替代它 - 通过SceneID登录的能力将作为标准登录表单的替代方案提供。无论用户是通过SceneID还是常规用户名/密码登录,现有的用户模型都将继续使用。

“使用SceneID登录”链接将验证用户对SceneID的身份。如果SceneID账户已经与网站上(存储在数据库中sceneid.SceneID模型下)的用户账户相关联,则该用户将立即登录,并且您的网站可以像往常一样引用request.user。否则,用户将被重定向到“连接”视图,提示他们使用现有的用户名/密码登录,或注册新账户(在这种情况下,他们将需要提供用户名和其他所需字段,但不需要密码)。在两种情况下,生成的用户账户都将与SceneID账户关联,以便他们下次可以立即登录。

演示站点(包括以下描述的大多数配置和自定义) - https://github.com/demozoo/django-sceneid-demosite

安装

django-sceneid与Django 3.x和4.x兼容。要安装

pip install django-sceneid

'sceneid'添加到项目的INSTALLED_APPS中,然后运行./manage.py migrate

在你的项目的顶级URL配置中,包含URLconf sceneid.urls

from django.urls import include, path

urlpatterns = [
    # ...
    path('account/sceneid/', include('sceneid.urls')),
    # ...
]

此时,你需要从scene.org获取API密钥。他们需要知道你的重定向URI,即你在上面使用并附加了login/的路径;例如 https://demosite.example.com/account/sceneid/login/。一旦你有了这个,请将以下设置添加到你的项目设置文件中

# The client ID you received from scene.org
SCENEID_CLIENT_ID = 'demosite'
# The client secret you received from scene.org
SCENEID_CLIENT_SECRET = 'supersecretclientsecret'
# The root URL of your website, without a trailing slash
BASE_URL = 'https://demosite.example.com'
# Where to redirect to after login (defaults to /accounts/profile/)
LOGIN_REDIRECT_URL = '/'

集成到你的网站

将“使用SceneID登录”按钮添加到你的网站的简单方法是在模板的合适位置添加sceneid_login_button_smallsceneid_login_button_large模板标签

{% load sceneid_tags %}  {# must be at the top of your template #}

{% if not request.user.is_authenticated %}
    {% sceneid_login_button_large %}
{% endif %}

这将输出一个按钮,链接到登录视图,并带有将登录后返回当前页面的“next”参数(除非当前页面是POST请求,在这种情况下将省略)。要覆盖此操作,请向标签传递一个next_url参数 - 这可以是期望的重定向URL,或False以完全禁用它。

{% sceneid_login_button_large next_url='/some/other/path/' %}

{% sceneid_login_button_large next_url=False %}

如果你不想使用按钮图像,sceneid_auth_url标签仅输出URL,以便将其插入到你的选择链接中。此标签也接受next_url参数,并支持as var语法以将结果写入变量

{% sceneid_auth_url next_url='/some/other/path/' as auth_url %}
<a href="{{ auth_url }}">Sign in with SceneID</a>

自定义

至少,你可能想自定义“连接”视图的模板以匹配你的网站样式。快速而简单的做法是在你的一个应用中创建一个路径为sceneid/connect.html的模板,并确保该模板通过将此应用条目放置在INSTALLED_APPS'sceneid'之上来优先于默认模板。此模板接收以下上下文变量

  • user_data - 从SceneID返回的用户数据字典 返回,包括idfirst_namelast_namedisplay_name
  • login_form - 用于登录表单的Django表单对象,将被POST到{% url 'sceneid:connect_old' %}
  • register_form - 用于注册表单的Django表单对象,将被POST到{% url 'sceneid:connect_new' %}

要获得更多自定义控制,你可以覆盖sceneid应用的AppConfig。在你的项目级配置文件夹中(即包含settingsurls子模块的文件夹),向apps.py添加以下内容

from sceneid.apps import SceneIDConfig

class DemositeSceneIDConfig(SceneIDConfig):
    connect_template_name = 'accounts/connect.html'

然后替换INSTALLED_APPS中的'sceneid'条目为AppConfig类的点路径

INSTALLED_APPS = [
    # ...
    'demosite.apps.DemositeSceneIDConfig',
    # ...
]

然后使用connect_template_name中指定的模板路径用于“连接”视图。

自定义表单

用于登录和注册表单的表单类也可以从AppConfig类进行配置

  • connect_login_form_class(默认:'django.contrib.auth.forms.AuthenticationForm'
  • connect_register_form_class(默认:'sceneid.forms.UserCreationForm'

特别是,提供的UserCreationForm可以子类化以在创建帐户时添加额外字段。例如,要包含用于包含姓名和姓氏的字段(然后填充标准Django用户模型中相应的字段)

# accounts/forms.py
from sceneid.forms import UserCreationForm as BaseUserCreationForm

class SceneIDUserCreationForm(BaseUserCreationForm):
    class Meta(BaseUserCreationForm.Meta):
        fields = ('username', 'first_name', 'last_name')
# demosite/apps.py
from sceneid.apps import SceneIDConfig

class DemositeSceneIDConfig(SceneIDConfig):
    connect_template_name = 'accounts/connect.html'
    connect_register_form_class = 'accounts.forms.SceneIDUserCreationForm'

基本UserCreationForm类在存在时识别first_namelast_name字段,并从SceneID数据中预先填充这些字段,同时使用SceneID显示名称的清理版本预先填充username字段。

使用django-sceneid自定义用户模型目前未经验证。基本UserCreationForm假设存在一个'username'字段,如果不存在(例如,如果你的网站使用电子邮件作为用户的标识符),则需要相应地进行自定义,但所有其他功能(包括登录表单)应保持不变。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。

源代码分发

django-sceneid-0.1.2.tar.gz (13.6 kB 查看哈希值)

上传时间 源代码

构建分发

django_sceneid-0.1.2-py3-none-any.whl (14.9 kB 查看哈希值)

上传时间 Python 3

支持者