##master-page:Unknown-Page
##master-date:Unknown-Date
#acl -All:write Default
#format wiki
#language uk

= Як працює автентифікація у МоінМоін =

Історично МоінМоін підтримував лише автентифікацію користувач/пароль та сесії із використанням коржиків: ви входите у систему через форму входу, Моін передає коржика і з цього моменту цей коржик використовується для автентифікації - доки ви не вийдете так коржика не буде видалено (чи доки не вийде час роботи коржика).

У багатьох оточеннях це неоптимально, оскільки обмеження доступу мають базуватися на інших джерелах, як, скажімо, LDAP (Active Directory). Отже, для !МоінМоін було розроблено модульну автентифікацію. Для конфігурування переліку автентифікаторів та встановлення порядку їх використання ви можете використовувати конфігураційний параметр `auth`.

Якщо використовується зовнішня база даних, вам би не хотілося створювати усіх користувачів Моін вручну. Для таких ситуацій було додано параметр `user_autocreate`. Якщо його встановлено рівним `True`, профілі для нових користувачів буде створено автоматично, коли новий користувач пройде процес автентифікації (і якщо автентифікатор підтримує автоматичне створення користувачів).

Зараз підтримуються такі автентифікатори:

 || '''Встановлення сервера''' || '''Автентифікація''' || '''Клас автентифікатора у Моін''' ||
 ||<|5 (> Усі || засобами Моін через ім'я/пароль || `MoinMoin.auth.MoinAuth` ||
 || засобами PHP session || `MoinMoin.auth.php_session.PHPSessionAuth` ||
 || засобами Моін через зовнішні коржі || див. `contrib/auth_externalcookie/` and HelpOnAuthentication/ExternalCookie||
 || засобами [[http://openid.net|OpenID]] || `MoinMoin.auth.openidrp.OpenIDAuth` ||
 || перевірка OpenID через http://botbouncer.com/ || `MoinMoin.auth.botbouncer.BotBouncer` ||
 ||<|2 (> Apache з CGI, modpy чи Fast``Cgi || засобами модулів Apache: HTTP Basic, HTTP Digest, SSPI (aka NTLM) чи LDAP || `MoinMoin.auth.http.HTTPAuth` ||
 || засобами Моін через LDAP || `MoinMoin.auth.ldap_login.LDAPAuth` ||
 || засобами Моін через віддалений Моін Вікі || `MoinMoin.auth.interwiki` - досі експериментально ||
 || Apache+SSL з CGI, modpy чи Fast``Cgi || засобами Apache через SSL-сертифікат клієнта  || `MoinMoin.auth.sslclientcert.SSLClientCertAuth` ||
 || Twisted || HTTP Basic (але без запиту автентифікації у заголовках, отже це наразі можна використовувати лише для автоматизованих процесів, не для використання з переглядачами; використовує внутрішню базу даних Моіна, але саме по собі не не дає змогу реєструвати користувачів, отже працездатне лише з Moin``Auth) || `MoinMoin.auth.http.HTTPAuth` ||
 || IIS || HTTP Basic, SSPI (aka NTLM), (?) || `MoinMoin.auth.http.HTTPAuth`, (?) ||

== Інші псевдо-автентифікатори ==
Строго кажучи, це не автентифікатори, оскільки вони не автентифікують користувачів, але використовують автентифікаційну інформацію для інших потреб:

 || `MoinMoin.auth.log.AuthLog` || просто журналює запити на вхід/вихід, більше нічого ||
 || `MoinMoin.auth.smb_mount.SMBMount` || монтує певний ресурс share використовуючи ім'я/пароль, розмонтовує при виході ||


== Модулі у складі Моін ==
=== MoinAuth (автентифікація за замовчуванням) ===
Це перелік автентифікаторів, який Моін використовує за замовчуванням (тобто, якщо вам потрібно саме це, вам не треба нічого конфігурувати).

{{{#!python
    from MoinMoin.auth import MoinAuth
    auth = [MoinAuth()]
}}}

=== Автентифікація HTTP ===

Щоб активувати автентифікацію HTTP, необхідно додати такі рядки до `wikiconfig.py`:
{{{#!python
    from MoinMoin.auth.http import HTTPAuth
    auth = [HTTPAuth()]
}}}

При автентифікації HTTP Basic з використанням засобів сервера (скажімо, Apache), веб-сервер виконує автентифікацію ще до того, як почне працювати Моін. Ви або вводите дійсні ім'я та пароль, або ж сервер заборонить вам доступ.

Автентифікатор HTTP Моіна лише перевірить, чи виконувалася автентифікація HTTP, та дозволить доступ, якщо виконувалася, та якщо користувач для вказаного імені існує.

На жаль, це все трохи складніше:
 * Для серверів Twisted автентифікатор використовує ім'я та пароль з профілів користувачів Моіна, та дає змогу користувачам їх міняти.
 * Для NTLM та Negotiate він іґнорує все перед останньою зворотною похилою рискою ("\") (як правило це "Домен\користувач") і ми також використовуємо `title()` для "нормалізації" регістру "користувач" у "Користувач".
 * Параметр конфігурації `user_autocreate` повинно бути встановлено у `True`, щоб автентифікатор міг створювати профілі нових користувачів, якщо автентифікований користувач ще не має профіля.
 * Дивись деякі специфічні для win32 інструкції також у ДовідкаВстановлення/ApacheOnWin32ДоменнаАвтентифікація.

=== Автентифікація клієнтських сертифікатів SSL ===
Щоб активувати автентифікацію через клієнтські сертифікати SSL, вам необхідно додати до `wikiconfig.py` такі рядки:
{{{#!python
    from MoinMoin.auth.sslclientcert import SSLClientCertAuth
    auth = [SSLClientCertAuth()]
}}}

Автентифікацію клієнтських сертифікатів SSL необхідно використовувати з веб-сервером на зразок Apache, який опрацьовує взаємодію з SSL та просто встановлює кілька змінних оточення для Моіна.

Автентифікатор SSLClientCertAuth має кілька параметрів, які передаються конструктору (приклади нижче):
|| '''Параметр''' || '''Стандартно''' || '''Опис''' ||
|| `authorities` || Немає || перелік центрів сертифікатів, сертифікати яких приймати, чи None, щоб приймати від усіх ||
|| `email_key` || True || вказує, чи використовувати для знаходження користувача Моін електронну пошту з сертифікату ||
|| `name_key` || True || вказує, чи використовувати для знаходження користувача Моін ім'я з сертифікату ||
|| `use_email` || False || якщо `True`, електронну пошту користувача змінювати не можна, і потрібно використовувати пошту з сертифікату ||
|| `use_name` || False || якщо `True`, ім'я користувача змінювати не можна, і потрібно використовувати ім'я з сертифікату ||

Наприклад, щоб приймати лише лише перевірені сервером сертифікати, і лише ті, які підписані певним центром, використовуйте:
{{{#!python
    from MoinMoin.auth.sslclientcert import SSLClientCertAuth
    auth = [SSLClientCertAuth(authorities=['my.authority.tld'])]
}}} чи щось подібне.

 (!) Зазвичай вам треба встановлювати `user_autocreate = True` у конфігурації, якщо ви використовуєте цей автентифікатор. Тоді Моін буде автоматично створювати профілі для автентифікованих користувачів, якщо вони ще не мають профіля.

=== Сесії PHP ===
Щоб активувати інтеграцію Single-Sign-On із засобами PHP,використовуйте цей модуль. Він читає файли сесій PHP і таким чином безпосередньо інтегрує наявні системи автентифікації PHP.

Щоб використовувати цей модуль, додайте до конфігурації такі рядки:
{{{#!python
    from MoinMoin.auth.php_session import PHPSessionAuth
    auth = [PHPSessionAuth()]
}}}

PHPSessionAuth має такі параметри: {{{#!python
    PHPSessionAuth(apps=['egw'], s_path="/tmp", s_prefix="sess_")
}}}
 * `apps` це перелік дозволених програм
 * `s_path` це шлях до файлів сесій PHP
 * `s_prefix` це префікс файлів сесій PHP

Наразі єдина програма, що підтримується, -- eGroupware 1.2. Але повинно бути досить просто додати кілька рядків коду для видобування потрібної інформації з файлів сесій PHP, і якщо ви це зробите, будь ласка, створіть запит на додавання функціональності і додайте латку.

=== OpenID (з BotBouncer) ===
Модуль автентифікації OpenID дає змогу користувачам використовувати їхній OpenID для входу у новий чи наявний обліковий запис Моіна. Щоб дозволити користувачам входити з OpenID, додайте модуль до переліку автентифікаторів, чи, щоб використовувати OpenID з перевіркою на http://botbouncer.com/, використовуйте:
{{{#!python
    from MoinMoin.auth.openidrp import OpenIDAuth
    from MoinMoin.auth.botbouncer import BotBouncer
    auth = [OpenIDAuth(), BotBouncer("your-botbouncer-API-key")]
}}}

Автентифікація з OpenID портребує анонімні сесії, встановіть `anonymous_session_lifetime` рівним чомусь більшому нуля. Більше інформації щодо цього параметру шукайте у ДовідкаВстановлення. Для автентифікації з OpenID буде достатньо дуже невеликого часу.

==== Advanced OpenID RP configuration ====

The OpenID RP code can also be configured for two use cases:
 1. You can force a specific provider to be used, there are two ways to achieve this:
  * Simply configure the `OpenIDAuth` authenticator like this: {{{
auth = OpenIDAuth(forced_service='http://myopenid.com/')
}}}
  * Create an `OpenIDServiceEndpoint` object and use that for the `forced_service` parameter: {{{
fs = OpenIDServiceEndpoint()
fs.type_uris = OPENID_2_0_TYPE
fs.server_url = 'http://localhost:8000/openidserver'
fs.claimed_id = 'http://specs.openid.net/auth/2.0/identifier_select'

auth = OpenIDAuth(forced_service=fs)
}}}
 In the latter case, no discovery needs to be done.

 2. You can specify functions to be called in various steps of the OpenID authentication process to, for example, implement Attribute Exchange. For now, this is not documented here, you'll have to look at the file `MoinMoin/auth/openidrp.py`.

=== LDAP based user authentication ===

The LDAP authenticator of MoinMoin enables single-sign-on (SSO) - assuming you already have a LDAP directory with your users, passwords, email adresses. On Linux this could be some OpenLDAP server, on a Windows server (usually the domain controller) this is called "Active Directory" (short: AD).

It works like this:
 * User enters his name and password via moin's login action and clicks on the login button.
 * On login, ldap_login.LDAPAuth checks username/password against LDAP.
  * If username/password is ok for LDAP, it creates or updates a user profile with values from ldap (name, alias, email) and creates a user object in the !MoinMoin process, then it hands over to the next authenticator...
  * If username/password is not ok for LDAP, it vetoes and aborts the login (no other authenticators checked).
 * If the login was successful, moin establishes a session for that user.

==== LDAP auth installation / configuration ====
You need to install python-ldap module (and everything it depends on, see its documentation).

You need an LDAP or AD server. :)

See `wiki/config/more_samples/ldap_wikiconfig_snippet.py` in your moin dist archive for a snippet you can use in your wiki config.

(!) Please also read the `README` file in that directory.

==== LDAP auth Problems? ====
!MoinMoin support does not know your LDAP server setup, so please follow these steps before asking for help:
 * Configure DEBUG logging for `MoinMoin.auth.ldap_login` and look into the log output.
 * Verify your settings and your user/password by e.g. using ldapsearch to query your LDAP server.
  * /!\ As long as you don't manage talking to your LDAP server with such a tool, you don't need to try with !MoinMoin.
 * Ask the administrator of your LDAP/AD server for help / for correct settings.
 * Maybe look into `MoinMoin/auth/ldap_login.py`, if you can debug or fix your problem there.

/!\ Only ask !MoinMoin support if you successfully used ldapsearch (or some similar tool) and you double checked your wiki config and it does still not work with moin.

=== XMLRPC auth ===

{{{#!python
import xmlrpclib

name = "TestUser"
password = "secret"
wikiurl = "http://localhost:8080/"

homewiki = xmlrpclib.ServerProxy(wikiurl + "?action=xmlrpc2", allow_none=True)
auth_token = homewiki.getAuthToken(name, password)

mc = xmlrpclib.MultiCall(homewiki)
mc.applyAuthToken(auth_token)
# you can add more xmlrpc method calls to the multicall here,
# they will run authenticated as user <name>.
result = mc()
}}}

== Combining multiple authenticators ==
For combining e.g. SSL client certificate and username/password authentication, your `wikiconfig.py` might contain:
{{{#!python
    from MoinMoin.auth import MoinAuth
    from MoinMoin.auth.sslclientcert import SSLClientCertAuth
    auth = [SSLClientCertAuth(), MoinAuth()]
}}}

In that case, any client certificates that the user provides will be used to log him on, but if they do not provide one they still have the option of logging on with their username/password.

== Writing your own authenticator ==
See the commented config file fragment `contrib/auth_externalcookie/` and `MoinMoin/auth/*.py` in your moin distribution archive for examples of how to do authentication. Also, the docstring in `MoinMoin/auth/__init__.py` contains an explanation of what can be done and how it is achieved.

Authenticators can
 * use the regular login form as their user interface for entering name and password
 * use the regular logout action for logging out
 * prohibit logging out (like SSL client certificate authentication that checks for every request)
 * search existing user profiles for a "matching" user (the match needs not be the name, it can also be the email address or something you put into aliasname)
 * create a user object and let it remember what attributes were determined by authenticator (and thus should not be offered on user preferences)
 * update values in user's profile from externally provided data
 * autocreate user profiles
