認証#

ユーザー登録#

Weblate のデフォルトの設定では、新規ユーザーの登録を処理するために Web サイト上のフォームである python-social-auth を使用します。メールを確認すると、新規ユーザーはサード パーティのサービスを利用して協力したり認証したりできます。

新規ユーザーの登録は、REGISTRATION_OPEN を使用して無効にもできます。

認証の試行は、接続制限 の対象です。

認証バックエンド#

Django に組み込まれたソリューションは、認証のためのさまざまなソーシャル オプションを含む認証に使用されます。これを使用すると、他の Django ベースのプロジェクト(参照: Pootle から移行)のユーザーデータベースをインポートできます。

Django は他の手段からも認証できるように設定できます。

参考

認証設定 で、 Docker の公式イメージで認証を設定する方法を説明します。

ソーシャル認証#

Welcome to Python Social Auth’s documentation! のおかげで、GitLab、Ubuntu、Fedora など、多くのサードパーティサービスを使用した認証に対応しています。

一般的な設定方法については、Django Framework のドキュメントを確認してください。

注釈

デフォルトでは、Weblate はサードパーティの認証サービスを使用して、検証済みのメールアドレスを運用します。使用するサービスの中に、認証サービスに対応していないものがある場合は、FORCE_EMAIL_VALIDATION を設定して、Weblate 側でメールアドレスの検証を強制してください。設定例:

SOCIAL_AUTH_OPENSUSE_FORCE_EMAIL_VALIDATION = True

参考

Pipeline

それぞれのバックエンドを有効にするのは非常に簡単です。AUTHENTICATION_BACKENDS の設定にエントリを追加し、場合によっては特定の認証方式に必要な秘密鍵を追加するだけです。バックエンドの中には、デフォルトではユーザーのメールアドレスを公開しないものがあり、リクエストで指定することが必要なことに注意してください。そうしなければ、Weblate は適切にユーザーの貢献をクレジットできません。

ヒント

ほとんどの認証バックエンドは、HTTPS が必要です。Web サーバーで HTTPS を有効にしたら、Weblate が正確にレポートするように、ENABLE_HTTPS を設定するか、または Docker コンテナの WEBLATE_ENABLE_HTTPS を設定してください。

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 にすべての秘密鍵を設定することが必要です。秘密鍵の設定例:

# 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"]

The GitHub should be configured to have callback URL as https://WEBLATE SERVER/accounts/complete/github/.

There are similar authentication backends for GitHub for Organizations and GitHub for Teams. Their settings are named SOCIAL_AUTH_GITHUB_ORG_* and SOCIAL_AUTH_GITHUB_TEAM_*, and they require additional setting of the scope - SOCIAL_AUTH_GITHUB_ORG_NAME or SOCIAL_AUTH_GITHUB_TEAM_ID. Their callback URLs are https://WEBLATE SERVER/accounts/complete/github-org/ and https://WEBLATE SERVER/accounts/complete/github-teams/.

注釈

認証時に Weblate が提供するコールバック URL には、設定したドメインが含まれています。URL の不一致でエラーが発生した場合の修正は、サイトの正確なドメイン設定 を確認してください。

参考

GitHub

GitHub EE authentication#

You need to register an OAuth App on GitHub EE and then tell Weblate all its 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"]

The GitHub OAuth App should be configured to have callback URL as https://WEBLATE SERVER/accounts/complete/github-enterprise/.

Instead GitHub OAuth App, GitHub App can also be used. With GitHub App permissions can be granted on repositories, organisation and/or user level. If you decide to use GitHub App, you need to enable Access: Read-only permission for Users - <Email addresses> and Organisation - <Members>.

注釈

認証時に 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#

Google OAuth 2 を使用するには、<https://console.developers.google.com/> にアプリケーションを登録して、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#

一般的な OAuth 2 サービスと同じように、Facebook にアプリケーションを登録することが必要です。登録後に、Weblateを設定して使用できます。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#

GitLab OAuth 2 を使用するには、<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

Microsoft Azure Active Directory#

Weblate は、認証に共通または特定のテナントを使用する設定にできます。

リダイレクト先の URL は、共通では https://WEBLATE SERVER/accounts/complete/azuread-oauth2/ 、テナント固有の認証では https://WEBLATE SERVER/accounts/complete/azuread-tenant-oauth2/ です。

You will need following:

  • Application (client) ID can be obtained from application page. Object ID is not used in Weblate.

  • Directory (tenant) ID is needed for tenant scoped authentication, what is usually desired.

  • Secret value is displayed once you generate a secret for an application. Secret ID is not used in Weblate.

# 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#

Slack OAuth 2 を使用するには、 <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>_IMAGE および SOCIAL_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 のコア機能に必要なので残しておいてください。

メール認証を無効にすると、メールに関連するすべての機能(ユーザーの招待またはパスワードのリセット機能)が無効になります。

Tip

管理画面から手動で作成したユーザーは、引き続きパスワード認証ができます。/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 認証#

バージョン 4.1.1 で追加.

設定については、Python Social Auth の手順に従ってください。注意が必要な違い:

  • Weblate は、シングルサインオンの IDP に対応しているので、SOCIAL_AUTH_SAML_ENABLED_IDPS から weblate を呼び出すことが必要。

  • SAML の XML メタデータの URL は、/accounts/metadata/saml/

  • 自動的に入力される設定項目: SOCIAL_AUTH_SAML_SP_ENTITY_ID, SOCIAL_AUTH_SAML_TECHNICAL_CONTACT, SOCIAL_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

注釈

You should remove 'social_core.backends.email.EmailAuth' from the AUTHENTICATION_BACKENDS setting, otherwise users will be able to set their password in Weblate, and authenticate using that. Keeping 'weblate.accounts.auth.WeblateUserBackend' is still needed in order to make permissions and facilitate anonymous users. It will also allow you to sign in using a local admin account, if you have created it (e.g. by using weblate 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 認証#

CAS 認証は、django-cas-ng などのパッケージを使用して実行できます。

ステップ 1、CAS 経由でユーザーのメールアドレスの入力フィールドを表示させます。これは、CAS サーバー自体に設定することが必要です。、CAS v 1 は属性に一切対応していないため、少なくとも CAS v 2 の実行が必要です。

ステップ 2、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")

最後に、signal を使用してメールの入力フィールドをユーザー オブジェクトに設置できます。この機能を使用するには django-cas-ng パッケージから signal をインポートし、この signal を使用してコードに接続することが必要です。設定ファイルに設定すると問題が発生することがあります。推奨する設定方法:

  • アプリケーションの設定ファイル、django.apps.AppConfig.ready() メソッドの中に記述

  • プロジェクト ファイル、 urls.py の中に記述(モデルが存在しない場合)

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 user backend をインストールした状態にしておくことに注意が必要です。

通常の、認証バックエンドを AUTHENTICATION_BACKENDS に追加し、認証アプリケーション(存在する場合)を INSTALLED_APPS にインストールする方法:

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

INSTALLED_APPS += (
    # Install authentication app here
)