跳转到主要内容

Django认证工具

项目描述

CI Status Documentation Status

authlib 是一组用于实现无密码认证的认证工具。这可以通过通过电子邮件发送加密签名链接,或者从第三方提供者(如Google、Facebook和Twitter)获取电子邮件地址来实现。毕竟,当攻击者能够访问电子邮件地址时,为什么还需要额外要求密码进行认证,因为大多数网站上密码都可以轻松重置呢?

目标

  • 保持小巧、简单和可扩展。

  • 提供工具和实用程序,而不是强加框架。

用法

  • 使用pip在虚拟环境中安装 django-authlib

  • authlib.backends.EmailBackend 添加到 AUTHENTICATION_BAcKENDS

  • authlib 添加到 INSTALLED_APPS 是可选的,仅当您想使用捆绑的翻译文件时才有用。没有必需的数据库表或其他类似的东西。

  • 拥有一个用户模型,其中包含名为 email 的字段作为用户名。为了方便,authlib.base_user 模块提供了基础用户模型和经理,分别是 BaseUserBaseUserManager。当您扩展 BaseUser 时,BaseUserManager 将自动作为 objects 可用。

  • 可以使用内置视图或编写自己的视图。内置视图使用 django.contrib.messages 提供反馈,因此您可能希望检查这些消息是否对用户可见。

Google、Facebook 和 Twitter OAuth 客户端需要以下设置

  • GOOGLE_CLIENT_ID

  • GOOGLE_CLIENT_SECRET

  • FACEBOOK_CLIENT_ID

  • FACEBOOK_CLIENT_SECRET

  • TWITTER_CLIENT_ID

  • TWITTER_CLIENT_SECRET

请注意,您必须配置 Twitter 应用以允许电子邮件访问,默认情况下此功能未启用。

使用内置视图

以下 URL 模式是使用内置视图的示例。目前,您需要深入研究代码(在编写本段时,django-authlib 的 Python 代码不到 500 行)。

from django.conf.urls import url
from authlib import views
from authlib.facebook import FacebookOAuth2Client
from authlib.google import GoogleOAuth2Client
from authlib.twitter import TwitterOAuthClient

urlpatterns = [
    url(
        r"^login/$",
        views.login,
        name="login",
    ),
    url(
        r"^oauth/facebook/$",
        views.oauth2,
        {
            "client_class": FacebookOAuth2Client,
        },
        name="accounts_oauth_facebook",
    ),
    url(
        r"^oauth/google/$",
        views.oauth2,
        {
            "client_class": GoogleOAuth2Client,
        },
        name="accounts_oauth_google",
    ),
    url(
        r"^oauth/twitter/$",
        views.oauth2,
        {
            "client_class": TwitterOAuthClient,
        },
        name="accounts_oauth_twitter",
    ),
    url(
        r"^email/$",
        views.email_registration,
        name="email_registration",
    ),
    url(
        r"^email/(?P<code>[^/]+)/$",
        views.email_registration,
        name="email_registration_confirm",
    ),
    url(
        r"^logout/$",
        views.logout,
        name="logout",
    ),
]

管理 OAuth2

authlib.admin_oauth 应用允许使用 Google OAuth2 允许具有相同电子邮件域的所有用户对 Django 的管理界面进行身份验证。为此,您必须使用 authlib 的身份验证后端(EmailBackend)。

安装方法如下

  • 遵循上面“使用方法”部分中的步骤。

  • django.contrib.admin 之前将 authlib.admin_oauth 添加到您的 INSTALLED_APPS 中,以便选择我们的登录模板。

  • 如上所述,将 GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRET 添加到您的设置中。

  • 添加一个 ADMIN_OAUTH_PATTERNS 设置。第一项是域名,第二项是工作人员账户的电子邮件地址。如果不存在匹配的工作人员账户,则身份验证失败

ADMIN_OAUTH_PATTERNS = [
    (r"@example\.com$", "admin@example.com"),
]
  • 添加一个到您的 URLconf 的条目

urlpatterns = [
    url(r"", include("authlib.admin_oauth.urls")),
    # ...
]
  • 在您的 Google 开发者控制台中,将 https://yourdomain.com/admin/__oauth__/ 添加为有效的重定向 URI。

请注意,authlib.admin_oauth.urls 模块假定管理网站注册在 /admin/。如果不是这种情况,您可以在不同的 URL 下自己集成视图。

还可以在 ADMIN_OAUTH_PATTERNS 设置中使用可调用项而不是电子邮件地址;可调用项接收正则表达式匹配的结果。如果结果电子邮件地址不存在,则身份验证(当然)失败

ADMIN_OAUTH_PATTERNS = [
    (r"^.*@example\.org$", lambda match: match[0]),
]

如果模式成功,但找不到具有工作人员访问权限的匹配用户,则处理继续到下一个模式。这意味着您可以使用个人账户(如果他们有)进行身份验证,并回退到具有您域上 Google 电子邮件地址的每个人的账户

ADMIN_OAUTH_PATTERNS = [
    (r"^.*@example\.org$", lambda match: match[0]),
    (r"@example\.com$", "admin@example.com"),
]

您还可以删除回退行;在这种情况下,用户只能在他们有个人工作人员账户的情况下进行身份验证。

小认证

authlib.little_auth 应用包含一个基本用户模型,其中电子邮件作为用户名,如果您不想编写自己的用户模型,但仍想从 authlib 的身份验证支持中受益,则可以使用它。

使用方法如下

  • authlib.little_auth 添加到您的 INSTALLED_APPS

  • 设置 AUTH_USER_MODEL = "little_auth.User"

  • 可选地,也可以遵循上述任何步骤。

电子邮件注册

要使电子邮件注册正常工作,需要两个模板

  • registration/email_registration_email.txt

  • registration/email_registration.html

起点可以是

email_registration_email.txt:

Subject (1st line)

Body (3rd line onwards)
{{ url }}
...

email_registration.html:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
        {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}Important: {% endif %}
        {{ message }}
    </li>
    {% endfor %}
</ul>
{% endif %}

{% if form.errors and not form.non_field_errors %}
<p class="errornote">
    {% if form.errors.items|length == 1 %}
    {% translate "Please correct the error below." %}
    {% else %}
    {% translate "Please correct the errors below." %}
    {% endif %}
</p>
{% endif %}

{% if form.non_field_errors %}
{% for error in form.non_field_errors %}
<p class="errornote">
    {{ error }}
</p>
{% endfor %}
{% endif %}

<form action='{% url "email_registration" %}' method="post" >
    {% csrf_token %}
    <table>
        {{ form }}
    </table>
    <input type="submit" value="login">
</form>

上述模板灵感来源于

更多详细信息请参阅 相关模块

项目详情


发布历史 发布通知 | RSS 源

下载文件

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

源分布

django_authlib-0.17.1.tar.gz (17.0 kB 查看哈希值)

上传时间

构建分布

django_authlib-0.17.1-py3-none-any.whl (26.6 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面