身份验证

用户注册

Weblate 的默认设置使用 python-social-auth,网站上处理新用户注册的一种形式。确定电子邮箱后,新用户可以通过使用一种第三方服务来贡献或证实。

还可以使用 REGISTRATION_OPEN 关闭新用户注册。

身份验证尝试服从于 频次限制

身份验证后端

Django 的内置解决方案用途是进行身份验证,包括用各种社交登录选项进行验证。使用它意味着可以导入其他基于 Django 项目的用户数据库(请参见 从 Pootle 迁移)。

Django 还可以通过其他方式进行身份验证。

参见

身份验证设置 描述了如何配置官方 Docker 镜像的身份验证。

社交身份验证

由于 Welcome to Python Social Auth’s documentation!,Weblate 支持很多使用第三方服务的身份验证,如 GitLab 、 Ubuntu 、 Fedora 等。

请查阅 Django Framework 文档中的通用配置说明。

备注

Weblate 默认依赖于第三方身份验证服务来提供合法的电子邮箱地址。如果想要使用的一些服务不支持,请通过为其配置 FORCE_EMAIL_VALIDATION,来强制 Weblate 网站上的电子邮箱验证:

SOCIAL_AUTH_OPENSUSE_FORCE_EMAIL_VALIDATION = True

参见

Pipeline

启用单独的后端非常简单,只需在 AUTHENTICATION_BACKENDS 设置中添加一个条目(可能还需要添加特定认证方法所需的密钥)。请注意,一些后端默认不提供用户电子邮件,你必须明确地请求,否则 Weblate 将无法正确记入用户所做的贡献。

提示

大多数身份验证后端都需要 HTTPS。在您的 Web 服务器中启用 HTTPS 后,请使用 ENABLE_HTTPS 或 Docker 容器中的 WEBLATE_ENABLE_HTTPS 配置 Weblate 以正确报告它。

OpenID 身份验证

对于基于 OpenID 的服务,通常只要启用它们就行了。后面的部分关于对于 OpenSUSE 、 Fedora 和 Ubuntu 允许 OpenID 身份验证:

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.email.EmailAuth",
    "social_core.backends.suse.OpenSUSEOpenId",
    "social_core.backends.ubuntu.UbuntuOpenId",
    "social_core.backends.fedora.FedoraOpenId",
    "weblate.accounts.auth.WeblateUserBackend",
)

参见

OpenID

GitHub 身份验证

需要在 GitHub 上注册一个 OAuth 应用,然后告诉 Weblate 所有的 secrets:

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.github.GithubOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_GITHUB_KEY = "GitHub Client ID"
SOCIAL_AUTH_GITHUB_SECRET = "GitHub Client Secret"
SOCIAL_AUTH_GITHUB_SCOPE = ["user:email"]

GitHub 的 回调 URL 应配置为形如 https://WEBLATE SERVER/accounts/complete/github/.

GitHub for Organizations 和 GitHub for Teams 也有类似的认证后端。他们的设置名为``SOCIAL_AUTH_GITHUB_ORG_*`和``SOCIAL_AUTH_GITHUB_TEAM_*``。它们需要额外设置范围 - SOCIAL_AUTH_GITHUB_ORG_NAME``或 ``SOCIAL_AUTH_GITHUB_TEAM_ID。 它们的回调URL是``https://WEBLATE SERVER/accounts/complete/github-org/和``https://WEBLATE SERVER/accounts/complete/github-teams/`

备注

Weblate 在身份验证时提供的回调 URL。在得到 URL 不匹配的错误时,可以根据需要来修复,请参见 设置正确的网站域名

参见

GitHub

GitHub 企业身份验证

你需要在 GitHub EE 上注册一个 OAuth 应用,然后告诉 Weblate 这个应用的所有 secrets:

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.github_enterprise.GithubEnterpriseOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_GITHUB_ENTERPRISE_KEY = "GitHub OAuth App Client ID"
SOCIAL_AUTH_GITHUB_ENTERPRISE_SECRET = "GitHub OAuth App Client Secret"
SOCIAL_AUTH_GITHUB_ENTERPRISE_URL = "https://git.example.com/"
SOCIAL_AUTH_GITHUB_ENTERPRISE_API_URL = "https://git.example.com/api/v3/"
SOCIAL_AUTH_GITHUB_ENTERPRISE_SCOPE = ["user:email"]

GitHub 的回调 URL 应配置为形如 https://WEBLATE SERVER/accounts/complete/github-enterprise/.

也可以使用 GitHub 应用来替代 GitHub OAuth 应用。GitHub 应用可按照仓库、组织和/或用户级别授予权限。如果你决定使用 GitHub 应用,你需要为用户 - <Email addresses> 和组织 - <Members>启用 Access: Read-only 权限。

备注

Weblate 在身份验证时提供的回调 URL。在得到 URL 不匹配的错误时,可以根据需要来修复,请参见 设置正确的网站域名

Bitbucket 身份验证

需要在 Bitbucket 上注册应用,然后告诉 Weblate 所有的秘密:

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.bitbucket.BitbucketOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_BITBUCKET_OAUTH2_KEY = "Bitbucket Client ID"
SOCIAL_AUTH_BITBUCKET_OAUTH2_SECRET = "Bitbucket Client Secret"
SOCIAL_AUTH_BITBUCKET_OAUTH2_VERIFIED_EMAILS_ONLY = True

备注

Weblate 在身份验证时提供的回调 URL。在得到 URL 不匹配的错误时,可以根据需要来修复,请参见 设置正确的网站域名

参见

Bitbucket

Google OAuth 2

To use Google OAuth 2, you need to register an application at <https://console.developers.google.com/> and enable the Google+ API.

重定向 URL 为 https://WEBLATE SERVER/accounts/complete/google-oauth2/

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.google.GoogleOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = "Client ID"
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = "Client secret"

备注

Weblate 在身份验证时提供的回调 URL。在得到 URL 不匹配的错误时,可以根据需要来修复,请参见 设置正确的网站域名

参见

Google

Facebook OAuth 2

通常通过 OAuth2 服务,需要用 Facebook 来注册应用。一旦完成,就可以新建 Weblate 来使用了:

重定向 URL 为 https://WEBLATE SERVER/accounts/complete/facebook/

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.facebook.FacebookOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_FACEBOOK_KEY = "key"
SOCIAL_AUTH_FACEBOOK_SECRET = "secret"
SOCIAL_AUTH_FACEBOOK_SCOPE = ["email", "public_profile"]

备注

Weblate 在身份验证时提供的回调 URL。在得到 URL 不匹配的错误时,可以根据需要来修复,请参见 设置正确的网站域名

参见

Facebook

GitLab OAuth 2

For using GitLab OAuth 2, you need to register an application at <https://gitlab.com/profile/applications>.

重定向 URL 为 https://WEBLATE SERVER/accounts/complete/gitlab/,并确保你标记 read_user 范围。

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.gitlab.GitLabOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_GITLAB_KEY = "Application ID"
SOCIAL_AUTH_GITLAB_SECRET = "Secret"
SOCIAL_AUTH_GITLAB_SCOPE = ["read_user"]

# If you are using your own GitLab
# SOCIAL_AUTH_GITLAB_API_URL = 'https://gitlab.example.com/'

备注

Weblate 在身份验证时提供的回调 URL。在得到 URL 不匹配的错误时,可以根据需要来修复,请参见 设置正确的网站域名

参见

GitLab

Gitea OAuth 2

For using Gitea OAuth 2, you need to register an application at https://GITEA SERVER/user/settings/applications.

The redirect URL is https://WEBLATE SERVER/accounts/complete/gitea/.

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.gitea.GiteaOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_GITEA_KEY = ""
SOCIAL_AUTH_GITEA_SECRET = ""

# If you are using your own Gitea
SOCIAL_AUTH_GITEA_API_URL = "https://gitea.example.com/"

备注

Weblate 在身份验证时提供的回调 URL。在得到 URL 不匹配的错误时,可以根据需要来修复,请参见 设置正确的网站域名

备注

The configuration above also works with Forgejo; for an example of production deployment with Forgejo, see Codeberg Translate

参见

Gitea

Microsoft Azure Active Directory

可以配置 Weblate,使用一般或特定租户进行身份验证。

常见的重定向 URL 为 https://WEBLATE SERVER/accounts/complete/azuread-oauth2/https://WEBLATE SERVER/accounts/complete/azuread-tenant-oauth2/ 用于租户特定身份验证。

你需要下列东西:

  • Application (client) ID 可从应用程序页面获得。Weblate 不使用 Object ID.

  • 租户范围的身份验证(通常情况下的理想选择)需要用到 Directory (tenant) ID.

  • 一旦你为一个应用程序生成了 secret 就会显示 Secret value. Weblate 不使用 Secret ID.

# Azure AD common

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.azuread.AzureADOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# OAuth2 keys
SOCIAL_AUTH_AZUREAD_OAUTH2_KEY = ""
SOCIAL_AUTH_AZUREAD_OAUTH2_SECRET = ""
# Azure AD Tenant

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.azuread_tenant.AzureADTenantOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Application (client) ID
SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_KEY = ""
# Secret value
SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_SECRET = ""
# Directory (tenant) ID
SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_TENANT_ID = ""

备注

Weblate 在身份验证时提供的回调 URL。在得到 URL 不匹配的错误时,可以根据需要来修复,请参见 设置正确的网站域名

Slack

For using Slack OAuth 2, you need to register an application at <https://api.slack.com/apps>.

重定向 URL 为 https://WEBLATE SERVER/accounts/complete/slack/

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.slack.SlackOAuth2",
    "social_core.backends.email.EmailAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_SLACK_KEY = ""
SOCIAL_AUTH_SLACK_SECRET = ""

备注

Weblate 在身份验证时提供的回调 URL。在得到 URL 不匹配的错误时,可以根据需要来修复,请参见 设置正确的网站域名

参见

Slack

覆盖身份验证方法名称和图标

您可以使用 SOCIAL_AUTH_<NAME>_IMAGESOCIAL_AUTH_<NAME>_TITLE 等设置覆盖身份验证方法显示名称和图标。例如,Auth0 的覆盖命名如下所示:

SOCIAL_AUTH_AUTH0_IMAGE = "custom.svg"
SOCIAL_AUTH_AUTH0_TITLE = "Custom auth"

关闭密码身份验证

通过从 AUTHENTICATION_BACKENDS 删除 social_core.backends.email.EmailAuth,可以关闭电子邮箱和密码身份验证。总是将 weblate.accounts.auth.WeblateUserBackend 保留在那里,它用于 Weblate 核心功能。

禁用电子邮件身份验证将禁用所有电子邮件相关的功能 - 用户邀请或密码重置功能。

小技巧

对于手动建立的用户,可以仍然在管理界面使用密码身份验证。只需导航到 /admin/login/

例如,使用后面的设置可以实现只是用 openSUSE Open ID 的身份验证:

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.suse.OpenSUSEOpenId",
    "weblate.accounts.auth.WeblateUserBackend",
)

密码身份验证

默认 settings.py 与一组合理的设置 AUTH_PASSWORD_VALIDATORS 在一起:

  • 密码不能与其它个人信息太相似。

  • 密码必须至少包含 10 个字符。

  • 密码不能是通常使用的密码。

  • 密码不能完全是数字。

  • 密码不能只由单个字符或仅空格组成。

  • 密码与你过去使用的密码不匹配。

可以自定义这个设置来匹配密码政策。

可以另外安装 django-zxcvbn-password 这会非常实际地估计密码的难度,并允许拒绝低于下面适当阈值的密码。

SAML 身份验证

Added in version 4.1.1.

请遵守 Python 社交认证的指示来配置。显著的差异有:

  • Weblate 支持单一 IDP,在 SOCIAL_AUTH_SAML_ENABLED_IDPS 中必须称之为 weblate

  • SAML XML 元数据 URL 为 /accounts/metadata/saml/

  • 以下设置会自动填充:SOCIAL_AUTH_SAML_SP_ENTITY_IDSOCIAL_AUTH_SAML_TECHNICAL_CONTACTSOCIAL_AUTH_SAML_SUPPORT_CONTACT

配置的示例:

# Authentication configuration
AUTHENTICATION_BACKENDS = (
    "social_core.backends.email.EmailAuth",
    "social_core.backends.saml.SAMLAuth",
    "weblate.accounts.auth.WeblateUserBackend",
)

# Social auth backends setup
SOCIAL_AUTH_SAML_SP_ENTITY_ID = f"https://{SITE_DOMAIN}/accounts/metadata/saml/"
SOCIAL_AUTH_SAML_SP_PUBLIC_CERT = "-----BEGIN CERTIFICATE-----"
SOCIAL_AUTH_SAML_SP_PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----"
SOCIAL_AUTH_SAML_ENABLED_IDPS = {
    "weblate": {
        "entity_id": "https://idp.testshib.org/idp/shibboleth",
        "url": "https://idp.testshib.org/idp/profile/SAML2/Redirect/SSO",
        "x509cert": "MIIEDjCCAvagAwIBAgIBADA ... 8Bbnl+ev0peYzxFyF5sQA==",
        "attr_name": "full_name",
        "attr_username": "username",
        "attr_email": "email",
    }
}
SOCIAL_AUTH_SAML_ORG_INFO = {
    "en-US": {
        "name": "example",
        "displayname": "Example Inc.",
        "url": "http://example.com"
    }
}
SOCIAL_AUTH_SAML_TECHNICAL_CONTACT = {
    "givenName": "Tech Gal",
    "emailAddress": "technical@example.com"
}
SOCIAL_AUTH_SAML_SUPPORT_CONTACT = {
    "givenName": "Support Guy",
    "emailAddress": "support@example.com"
}

默认配置从以下属性提取用户详细信息,通过配置您的IDP来配置它们:

属性

SAML URI 参照

全名

urn:oid:2.5.4.3

名字

urn:oid:2.5.4.42

姓氏

urn:oid:2.5.4.4

电子邮箱

urn:oid:0.9.2342.19200300.100.1.3

用户名

urn:oid:0.9.2342.19200300.100.1.1

提示

上面的示例和 Docker 镜像定义了一个 叫做 weblate 的 IDP。您可能需要在 IDP 中将此字符串配置为 Relay

LDAP 身份验证

LDAP 身份验证可以使用 django-auth-ldap 软件包而最好地实现。可以使用通常的方式安装:

# Using PyPI
pip install 'django-auth-ldap>=1.3.0'

# Using apt-get
apt-get install python-django-auth-ldap

提示

此包包含于 Docker 容器中,见 使用 Docker 安装

备注

在 Python LDAP 3.1.0 模块中有一些不兼容,导致可能无法使用那个版本。如果得到错误信息 AttributeError: ‘module’ object has no attribute ‘_trace_level’,将 python-ldap 降回到 3.0.0 版可能会有帮助。

一旦安装了软件包,就可以将其钩入 Django 身份验证了:

# Add LDAP backed, keep Django one if you want to be able to sign in
# even without LDAP for admin account
AUTHENTICATION_BACKENDS = (
    "django_auth_ldap.backend.LDAPBackend",
    "weblate.accounts.auth.WeblateUserBackend",
)

# LDAP server address
AUTH_LDAP_SERVER_URI = "ldaps://ldap.example.net"

# DN to use for authentication
AUTH_LDAP_USER_DN_TEMPLATE = "cn=%(user)s,o=Example"
# Depending on your LDAP server, you might use a different DN
# like:
# AUTH_LDAP_USER_DN_TEMPLATE = 'ou=users,dc=example,dc=com'

# List of attributes to import from LDAP upon sign in
# Weblate stores full name of the user in the full_name attribute
AUTH_LDAP_USER_ATTR_MAP = {
    "full_name": "name",
    # Use the following if your LDAP server does not have full name
    # Weblate will merge them later
    # 'first_name': 'givenName',
    # 'last_name': 'sn',
    # Email is required for Weblate (used in VCS commits)
    "email": "mail",
}

# Hide the registration form
REGISTRATION_OPEN = False

备注

你应当从设置的 AUTHENTICATION_BACKENDS 部分移除 'social_core.backends.email.EmailAuth',否则用户不能够在 Weblate 中设置他们的密码,并使用它进行身份验证。为了生成权限和方便匿名用户,仍需保留 'weblate.accounts.auth.WeblateUserBackend'。它还允许你使用一个本地管理账户登录,如果你已经创建了它 (如通过使用 createadmin)。

使用绑定密码

如果可以为身份验证使用直接绑定,那么需要使用搜索,并为用户搜索提供绑定,例如:

import ldap
from django_auth_ldap.config import LDAPSearch

AUTH_LDAP_BIND_DN = ""
AUTH_LDAP_BIND_PASSWORD = ""
AUTH_LDAP_USER_SEARCH = LDAPSearch(
    "ou=users,dc=example,dc=com", ldap.SCOPE_SUBTREE, "(uid=%(user)s)"
)

Active Directory 集成

import ldap
from django_auth_ldap.config import LDAPSearch, NestedActiveDirectoryGroupType

AUTH_LDAP_BIND_DN = "CN=ldap,CN=Users,DC=example,DC=com"
AUTH_LDAP_BIND_PASSWORD = "password"

# User and group search objects and types
AUTH_LDAP_USER_SEARCH = LDAPSearch(
    "CN=Users,DC=example,DC=com", ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)"
)

# Make selected group a superuser in Weblate
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
    # is_superuser means user has all permissions
    "is_superuser": "CN=weblate_AdminUsers,OU=Groups,DC=example,DC=com",
}

# Map groups from AD to Weblate
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
    "OU=Groups,DC=example,DC=com", ldap.SCOPE_SUBTREE, "(objectClass=group)"
)
AUTH_LDAP_GROUP_TYPE = NestedActiveDirectoryGroupType()
AUTH_LDAP_FIND_GROUP_PERMS = True

# Optionally enable group mirroring from LDAP to Weblate
# AUTH_LDAP_MIRROR_GROUPS = True

CAS 身份验证

可以使用软件包如 django-cas-ng 来实现 CAS 身份验证。

第一步通过 CAS 揭示了用户电子邮箱字段。这必须在 CAS 服务器自身来配置,并需要至少运行 CAS v2,因为 CAS v1 不支持属性。

第二步更新 Weblate,来使用 CAS 服务器和属性。

为了安装 django-cas-ng

pip install django-cas-ng

一旦安装了软件包,就可以通过修改 settings.py 文件将其钩连到 Django 身份验证系统:

# Add CAS backed, keep the Django one if you want to be able to sign in
# even without LDAP for the admin account
AUTHENTICATION_BACKENDS = (
    "django_cas_ng.backends.CASBackend",
    "weblate.accounts.auth.WeblateUserBackend",
)

# CAS server address
CAS_SERVER_URL = "https://cas.example.net/cas/"

# Add django_cas_ng somewhere in the list of INSTALLED_APPS
INSTALLED_APPS = (..., "django_cas_ng")

最后,可以使用信号将电子邮箱字段投射到用户对象上。为了生效,必须将信号从 django-cas-ng 软件包导入,并将你的代码与这个信号连接。在设置文件中这样做可能产生问题,这样建议将它放进去:

from django_cas_ng.signals import cas_user_authenticated
from django.dispatch import receiver


@receiver(cas_user_authenticated)
def update_user_email_address(sender, user=None, attributes=None, **kwargs):
    # If your CAS server does not always include the email attribute
    # you can wrap the next two lines of code in a try/catch block.
    user.email = attributes["email"]
    user.save()

参见

Django CAS NG

配置第三方 Django 身份验证

一般地,任何 Django 身份认证插件应该可以在 Weblate 上工作。只需要按照插件的说明,只记住安装了 Weblate 用户后台。

典型的安装包括,将身份验证后台添加到 AUTHENTICATION_BACKENDS,并将身份验证 app (如果有的话)安装到 INSTALLED_APPS

AUTHENTICATION_BACKENDS = (
    # Add authentication backend here
    "weblate.accounts.auth.WeblateUserBackend",
)

INSTALLED_APPS += (
    # Install authentication app here
)

Two-factor authentication

Added in version 5.7.

提示

Two-factor authentication adds another layer of security to your account by requiring more than just a password to sign in.

Weblate supports the following second factors:

Security keys (WebAuthn)

Both, Passkeys and security keys are supported.

Passkeys validate your identity using touch, facial recognition, a device password, or a PIN as they include user verification.

Security keys are WebAuthn credentials that can only be used as a second factor of authentication, and these only validate user presence.

Authenticator app (TOTP)

Authenticator apps and browser extensions like Aegis, Bitwarden, Google Authenticator, 1Password, Authy, Microsoft Authenticator, etc. generate one-time passwords that are used as a second factor to verify your identity when prompted during sign-in.

Recovery codes

Recovery codes can be used to access your account if you lose access to your device and cannot receive two-factor authentication codes.

Keep your recovery codes as safe as your password. We recommend saving them with a password manager such as Bitwarden, 1Password, Authy, or Keeper.

Each user can configure this in 账户 and second factor will be required to sign in addition to the existing authentication method.

This can be enforced for users at the project (see Enforced two-factor authentication) or team level.

The permissions of a team with enforced two-factor authentication won’t be applied to users who do not have it configured.