API:Создание учётной записи
| Эта страница является частью документации по API действий MediaWiki. |
| Версия MediaWiki: | ≥ 1.27 |
Документация API
Создание учётной записи
Процесс состоит из трёх основных этапов:
- # Получить поля из API:Authmanagerinfo и токен из API:Токены.
- # Отправить POST-запрос с полученным токеном, сообщающий информацию о токене и другие поля, и вернуть URL в API.
- # Обработать ответ, который может включать запрос на дополнительные POST-запросы для предоставления дополнительной информации.
Пример 1: Процесс в вики без специальных расширений аутентификации
Вики без специальных расширений аутентификации могут быть довольно несложными. Если ваш код знает, какие поля будут обязательными, он может пропустить вызов API:Authmanagerinfo и просто предположить, какие поля будут необходимы (например имя пользователя, пароль & повторно введенный пароль, email, возможно реальное имя).
reason в запрос POST. Вы также можете использовать mailpassword вместо параметров password и retype, чтобы MediaWiki отправил новому пользователю временный пароль по электронной почте.
POST-запрос
Ответ
{
"createaccount": {
"status": "PASS",
"username": "Zane"
}
}
Пример кода
Python
#!/usr/bin/python3
"""
create_account.py
MediaWiki API Demos
Demo of `createaccount` module: Create an account on a wiki without the
special authentication extensions
MIT license
"""
import requests
S = requests.Session()
WIKI_URL = "http://dev.wiki.local.wmftest.net:8080"
API_ENDPOINT = WIKI_URL + "/w/api.php"
# First step
# Retrieve account creation token from `tokens` module
PARAMS_0 = {
'action':"query",
'meta':"tokens",
'type':"createaccount",
'format':"json"
}
R = S.get(url=API_ENDPOINT, params=PARAMS_0)
DATA = R.json()
TOKEN = DATA['query']['tokens']['createaccounttoken']
# Second step
# Send a post request with the fetched token and other data (user information,
# return URL, etc.) to the API to create an account
PARAMS_1 = {
'action': "createaccount",
'createtoken': TOKEN,
'username': 'your_username',
'password': 'your_password',
'retype': 'retype_your_password',
'createreturnurl': WIKI_URL,
'format': "json"
}
R = S.post(API_ENDPOINT, data=PARAMS_1)
DATA = R.json()
print(DATA)
PHP
<?php
/*
create_account.php
MediaWiki API Demos
Demo of `createaccount` module: Create an account on a wiki without the
special authentication extensions
MIT license
*/
$wikiUrl = "http://dev.wiki.local.wmftest.net:8080";
$endPoint = $wikiUrl . "/w/api.php";
$createAccount_Token = getCreateAccountToken(); // Step 1
createAccount( $createAccount_Token ); // Step 2
// Step 1: GET request to fetch createaccount token
function getCreateAccountToken() {
global $endPoint;
$params1 = [
"action" => "query",
"meta" => "tokens",
"type" => "createaccount",
"format" => "json"
];
$url = $endPoint . "?" . http_build_query( $params1 );
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
$result = json_decode( $output, true );
return $result["query"]["tokens"]["createaccounttoken"];
}
// Step 2: POST request with the fetched token and other data (user information,
// return URL, etc.) to the API to create an account
function createAccount( $createAccount_Token ) {
global $endPoint, $wikiUrl;
$params2 = [
"action" => "createaccount",
"createtoken" => $createAccount_Token,
"username" => "your_username",
"password" => "your_password",
"retype" => "retype_your_password",
"createreturnurl" => $wikiUrl,
"format" => "json"
];
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $endPoint );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params2 ) );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
echo( $output );
}
JavaScript
/*
create_account.js
MediaWiki API Demos
Demo of `createaccount` module: Create an account on a wiki without the
special authentication extensions
MIT license
*/
var request = require('request').defaults({jar: true}),
wikiUrl = "http://dev.wiki.local.wmftest.net:8080",
endPoint = wikiUrl + "/w/api.php";
// Step 1: GET request to fetch createaccount token
function getCreateAccountToken() {
var params_0 = {
action: "query",
meta: "tokens",
type: "createaccount",
format: "json"
};
request.get({ url: endPoint, qs: params_0 }, function (error, res, body) {
if (error) {
return;
}
var data = JSON.parse(body);
createaccount(data.query.tokens.createaccounttoken);
});
}
// Step 2: POST request with the fetched token and other data (user information,
// return URL, etc.) to the API to create an account
function createaccount(createaccount_token) {
var params_1 = {
action: "createaccount",
username: "your_username",
password: "your_password",
retype: "retype_your_password",
createreturnurl: wikiUrl,
createtoken: createaccount_token,
format: "json"
};
request.post({ url: endPoint, form: params_1 }, function (error, res, body) {
if (error) {
return;
}
console.log(body);
});
}
// Start From Step 1
getCreateAccountToken();
MediaWiki JS
/*
create_account.js
MediaWiki API Demos
Demo of `createaccount` module: Create an account on a wiki without the
special authentication extensions
MIT License
*/
var params = {
action: 'query',
meta: 'tokens',
type: 'createaccount',
format: 'json'
},
api = new mw.Api();
api.get( params ).done( function ( data ) {
var token = data.query.tokens.createaccounttoken,
params1 = {
action: 'createaccount',
username: 'your_username',
password: 'your_password',
retype: 'retype_your_password',
createreturnurl: 'http:' + mw.config.get( 'wgServer' ),
createtoken: token,
format: 'json'
};
api.post( params1 ).done( function ( data ) {
console.log( data );
} );
} );
Example: Account creation using authmanager (MediaWiki 1.27+)
This example shows the modern account creation flow using the authmanager-based API introduced in MediaWiki 1.27.
Special:ApiSandbox page, and API action as createaccount, the request can be constructed using the form presented (the "Additional parameters" section). You add the field names and their value. Create account token can be gotten using: /w/api.php?action=query&format=json&meta=tokens&type=createaccountThe response may include an authmanagerinfo object describing additional authentication steps (such as CAPTCHA or email verification).
Clients must inspect the requests array and submit follow-up requests until the account creation process is completed.
Пример 2: Процесс в вики с расширением CAPTCHA
Обратите внимание, что первый шаг, приведенный ниже, может быть выполнен в виде двух шагов: один для извлечения доступных полей из API:Authmanagerinfo, а другой для извлечения токена из API:Токены.
<span id="1._Fetch_fields_available_from_API:Authmanagerinfo_and_token_from_API:Токены">
Первый шаг: Извлеките доступные поля из API:Authmanagerinfo и токена из API:Токены
| Результат |
|---|
{
"batchcomplete": "",
"query": {
"authmanagerinfo": {
"canauthenticatenow": "",
"cancreateaccounts": "",
"preservedusername": "",
"requests": [
{
"id": "CaptchaAuthenticationRequest",
"metadata": {
"type": "image",
"mime": "image/png"
},
"required": "required",
"provider": "CaptchaAuthenticationRequest",
"account": "CaptchaAuthenticationRequest",
"fields": {
"captchaId": {
"type": "hidden",
"value": "16649214",
"label": "CAPTCHA ID",
"help": "This value should be sent back unchanged."
},
"captchaInfo": {
"type": "null",
"value": "/w/index.php?title=Special:Captcha/image&wpCaptchaId=16649214",
"label": "To help protect against automated account creation, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):",
"help": "Description of the CAPTCHA."
},
"captchaWord": {
"type": "string",
"label": "CAPTCHA",
"help": "Solution of the CAPTCHA."
}
}
}
...
]
},
"tokens": {
"createaccounttoken": "1de8d3f8023305742e69db9e16b4d5365bd82f9c+\\"
}
}
}
|
Второй шаг: Отправьте POST-запрос вместе с токеном создания учетной записи, информацией о пользователе и обратным URL
| Результат |
|---|
{
"createaccount": {
"status": "PASS",
"username": "Zane"
}
}
|
Пример кода
Обратите внимание, что этот пример кода разделяет запросы на API:Authmanagerinfo и API:Токены и предполагает наличие CAPTCHA и отсутствие других сложностей.
| create_account_with_captcha.py |
|---|
#!/usr/bin/python3
"""
create_account_with_captcha.py
MediaWiki Action API Code Samples
Demo of `createaccount` module: Create an account on a wiki with a special
authentication extension installed. This example considers a case of a wiki
where captcha is enabled through extensions like ConfirmEdit
(https://www.mediawiki.org/wiki/Extension:ConfirmEdit)
MIT license
"""
import requests
from flask import Flask, render_template, flash, request
S = requests.Session()
WIKI_URL = "https://test.wikipedia.org"
API_ENDPOINT = WIKI_URL + "/w/api.php"
# App config.
DEBUG = True
APP = Flask(__name__)
APP.config.from_object(__name__)
APP.config['SECRET_KEY'] = 'enter_your_secret_key'
@APP.route("/", methods=['GET', 'POST'])
def show_form():
""" Render form template and handle form submission request """
fields = get_form_fields()
captcha = fields['CaptchaAuthenticationRequest']
captcha_url = WIKI_URL + captcha['captchaInfo']['value']
captcha_id = captcha['captchaId']['value']
display_fields = []
user_fields = []
captcha_fields = []
for field in fields:
for name in fields[field]:
details = {
'name': name,
'type': fields[field][name]['type'],
'label': fields[field][name]['label']
}
if field != "CaptchaAuthenticationRequest":
user_fields.append(details)
else:
if name == 'captchaWord':
captcha_fields.append(details)
display_fields = user_fields + captcha_fields
if request.method == 'POST':
create_account(request.form, captcha_id)
return render_template('create_account_form.html', \
captcha=captcha_url, fields=display_fields)
def get_form_fields():
""" Fetch the form fields from `authmanagerinfo` module """
result = {}
response = S.get(url=API_ENDPOINT, params={
'action': 'query',
'meta': 'authmanagerinfo',
'amirequestsfor': 'create',
'format': 'json'
})
data = response.json()
query = data and data['query']
authmanagerinfo = query and query['authmanagerinfo']
fields = authmanagerinfo and authmanagerinfo['requests']
for field in fields:
if field['id'] in ('MediaWiki\\Auth\\UserDataAuthenticationRequest', \
'CaptchaAuthenticationRequest', 'MediaWiki\\Auth\\PasswordAuthenticationRequest'):
result[field['id']] = field['fields']
return result
def create_account(form, captcha_id):
""" Send a post request along with create account token, user information
and return URL to the API to create an account on a wiki """
createtoken = fetch_create_token()
response = S.post(url=API_ENDPOINT, data={
'action': 'createaccount',
'createtoken': createtoken,
'username': form['username'],
'password': form['password'],
'retype': form['retype'],
'email': form['email'],
'createreturnurl': 'http://127.0.0.1:5000/',
'captchaId': captcha_id,
'captchaWord': form['captchaWord'],
'format': 'json'
})
data = response.json()
createaccount = data['createaccount']
if createaccount['status'] == "PASS":
flash('Success! An account with username ' + \
form['username'] + ' has been created!')
else:
flash('Oops! Something went wrong -- ' + \
createaccount['messagecode'] + "." + createaccount['message'])
def fetch_create_token():
""" Fetch create account token via `tokens` module """
response = S.get(url=API_ENDPOINT, params={
'action': 'query',
'meta': 'tokens',
'type': 'createaccount',
'format': 'json'
})
data = response.json()
return data['query']['tokens']['createaccounttoken']
if __name__ == "__main__":
APP.run()
|
| create_account_form.html |
|---|
<!DOCTYPE html>
<title>MediaWiki Create Account</title>
<!-- CSS files are in here: https://github.com/srish/MediaWiki-Action-API-Code-Samples/tree/master/static -->
<link rel="stylesheet" href="static/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="static/css/account_form.css">
<div class="container">
<h2>Create MediaWiki Account</h2>
<form method="POST">
<div class="form-group">
<div class="form-field">
<div class="label-field">Enter your username</div>
<input name="username">
</div>
<div class="form-field">
<div class="label-field">Password</div>
<input type="password" name="password">
</div>
<div class="form-field">
<div class="label-field">Confirm password</div>
<input type="password" name="confirm-password">
</div>
<div class="form-field">
<div class="label-field">Enter address (optional)</div>
<input name="email">
</div>
<div class="form-field">
<div class="label-field">Enter the text you see on the image below</div>
<input name="captcha-word">
</div>
<img src="{{ captcha }}">
</div>
<button type="submit" class="btn btn-success">Create your account</button>
</form>
<br>
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-info">
{{ message[1] }}
</div>
{% endfor %}
{% endif %}
{% endwith %}
</div>
<br>
</div>
</div>
|
Пример 3: Создание учетной записи в вики с включенным CAPTCHA, расширением OpenID и расширением двухфакторной аутентификации
<span id="1._Fetch_fields_available_from_API:Authmanagerinfo_and_token_from_API:Токены">
Первый шаг: Извлеките доступные поля из API:Authmanagerinfo и токен из API:Токены
Выборка из API:Authmanagerinfo и API:Токены в основном такая же, как в предыдущем примере, и поэтому здесь не повторяется. Список запросов, возвращённых API:Authmanagerinfo, будет включать определения как для расширения CAPTCHA, так и для расширения OpenID.
Второй шаг: Ответьте на CAPTCHA и выберите аутентификацию OpenID.
| Результат |
|---|
{
"createaccount": {
"status": "REDIRECT",
"redirecttarget": "https://openid.example.net/openid-auth.php?scope=openid&response_type=code&client_id=ABC&redirect_uri=https://wiki.example.org/wiki/Special:OpenIDConnectReturn&state=XYZ123",
"requests": [
{
"id": "OpenIdConnectResponseAuthenticationRequest",
"metadata": {},
"required": "required",
"provider": "OpenID Connect at example.net",
"account": "",
"fields": {
"code": {
"type": "string",
"label": "OpenID Code",
"help": "OpenID Connect code response"
},
"state": {
"type": "string",
"label": "OpenID State",
"help": "OpenID Connect state response"
},
}
}
]
}
}
|
От клиента следует ожидать, что он перенаправит браузер пользователя на предоставленную в параметре redirecttarget цель перенаправления.
Провайдер OpenID произведёт аутентификацию и перенаправит на страницу вики Special:OpenIDConnectReturn, которая произведёт валидацию ответа OpenID и перенаправит на цель createreturnurl, предоставленную в первом POST-запросе к API, с добавленными параметрами code и state.
В этот момент клиент получает управление процессом обратно и производит свой следующий запрос API.
Третий шаг: Вернитесь из OpenID.
Клиент отправляет code и state обратно в API. Ответ API имеет расширение для двухфакторной аутентификации, предлагающее пользователю установить второй фактор.
| Результат |
|---|
{
"createaccount": {
"status": "UI",
"message": "Set up two-factor authentication",
"requests": [
{
"id": "TwoFactorAuthenticationRequest",
"metadata": {
"account": "Alice",
"secret": "6CO3 2AKV EP2X MIV5"
},
"required": "optional",
"provider": "",
"account": "",
"fields": {
"2FAInfo": {
"type": "null",
"label": "A bunch of text describing how to set up two-factor auth.",
"help": "Two-factor authentication setup instructions"
},
"code": {
"type": "string",
"label": "Code",
"help": "Two-factor authentication code"
}
}
},
{
"id": "MediaWiki\\Auth\\ButtonAuthenticationRequest:skip2FASetup",
"metadata": {},
"required": "optional",
"provider": "MediaWiki\\Auth\\ButtonAuthenticationRequest",
"account": "MediaWiki\\Auth\\ButtonAuthenticationRequest:skip2FASetup",
"fields": {
"skip2FASetup": {
"type": "button",
"label": "Skip",
"help": "Skip two-factor authentication setup"
}
}
}
]
}
}
|
Теперь клиенту следует указать призвать пользователя к созданию новой учётной записи в своём приложении для двухфакторной аутентификации и введению текущего кода, или же позволить пользователю пропустить настройку двухфакторной аутентификации. Предположим, что пользователь всё-таки настроил ДФА.
Четвёртый шаг: Настройте двухфакторную аутентификацию.
| Результат |
|---|
{
"createaccount": {
"status": "PASS",
"username": "Alice"
}
}
|
Создание учётной записи наконец-то завершено.
Если в каком-либо месте произойдёт ошибка создания учётной записи, будет возвращён ответ со статусом FAIL, также будет указано сообщение message, которое следует показать пользователю.
Возможные ошибки
| Код | Информация |
|---|---|
| badtoken | Неверный токен создания учетной записи |
| notoken | Параметр token должен быть задан. |
| mustpostparams | Следующий параметр был найден в строке запроса, но должен находиться в теле POST: createtoken. |
| missingparam | Как минимум один из параметров "createcontinue" и "createreturnurl" обязателен. |
| authmanager-create-no-primary | Предоставленные учётные данные не могут быть использованы для создания учётной записи. |
| noemailcreate | Вам необходимо указать корректный адрес электронной почты |
| invalidemailaddress | Адрес электронной почты не может быть принят, так как он не соответствует формату.
Пожалуйста, введите корректный адрес или оставьте поле пустым. |
| badretype | Введённые вами пароли не совпадают. |
| userexists | Введённое имя участника уже используется.
Пожалуйста, выберите другое имя. |
| captcha-createaccount-fail | Контрольная комбинация неверна или не введена. |
| acct_creation_throttle_hit | Посетители этой вики, использующие ваш IP-адрес, за последнее время ($2) создали num учётных записей, что является допустимым максимумом для такого промежутка времени.
В результате, посетители с этого IP-адреса в данный момент больше не могут создавать учётные записи. Если вы находитесь на мероприятии, фокусирующемся на вкладе в проекты Викимедиа, то в решении этой проблемы вам поможет запрос на временное увеличение лимита для IP. |
Дополнительная информация
- Создание учётных записей отражается в Special:log/newusers.
Если вы уже вошли на сайт, при создании новой учётной записи будет в журнал будет записано и ваше текущее имя учётной записи.
- При выполнении фрагментов кода, представленных на этой странице, помните:
- После создания учетной записи в вики, ее нельзя удалить.
- Always use
https://test.wikipedia.org/w/api.phpas the endpoint, so that you don't accidentally create accounts on production wikis.
- Администраторы сайта и разработчики расширений MediaWiki могут отключить эту функцию API, вставив следующую строку в файл конфигурации:
$wgAPIModules['createaccount'] = 'ApiDisabled';