API:Створення облікового запису
| Ця сторінка є частиною документації по MediaWiki Action API. |
| Версія MediaWiki: | ≥ 1.27 |
Документація API
Створення облікового запису
Процес складається з трьох загальних етапів:
- # Отримати поля від API:Authmanagerinfo і токен від API:Токени.
- # Надішліть запит POST із отриманим токеном, інформацією про користувача та іншими полями та поверніть URL-адресу до API.
- # Розробіть відповідь, яка може включати додаткові запити POST для надання додаткової інформації.
Приклад 1: Обробка у вікі без спеціальних розширень автентифікації
Вікі без спеціальних розширень автентифікації може бути досить простою. Якщо ваш код знає, які поля будуть потрібні, він може пропустити виклик до API:Authmanagerinfo і просто припустити, які поля будуть потрібні (наприклад, ім’я користувача, пароль і повторно введений пароль, електронна адреса, можливо справжнє ім’я).
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+\\"
}
}
}
|
Другий крок: надішліть запит на публікацію разом із токеном створення облікового запису, інформацією про користувача та зворотною 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 з кодом< Додано параметри і 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"
}
}
}
]
}
}
|
Тепер клієнт запропонує користувачеві створити новий обліковий запис у своїй програмі двофакторної автентифікації та ввести поточний код або дозволить користувачеві пропустити налаштування 2FA. Припустимо, що користувач налаштував 2FA.
Четвертий крок: налаштуйте двофакторну автентифікацію.
| Результат |
|---|
{
"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-адресу, створили num облікових записів за останній час ($2), що є максимальною кількістю для цього періоду часу.
В результаті відвідувачі, що використовують цю IP-адресу, наразі більше не можуть створювати облікові записи. Якщо Ви перебуваєте на заході, тематикою якого є внесок до проектів Вікімедіа, будь ласка, перегляньте сторінку запитів на тимчасове підвищення ліміту для IP, щоб отримати допомогу із вирішенням цього питання. |
Додаткові примітки
- Створення облікового запису записується в Special:log/newusers.
Якщо ви ввійшли, ваше ім’я користувача також буде записано під час створення облікового запису.
- Виконуючи фрагменти коду, надані на цій сторінці, пам’ятайте:
- Після створення облікового запису на вікі його не можна буде видалити.
- Завжди використовуйте
https://test.wikipedia.org/w/api.phpяк кінцеву точку, щоб випадково не створювати облікові записи на робочих вікі.
- MediaWiki адміністратори та розробники розширень можуть вимкнути цю функцію API, вставивши наступний рядок у файл конфігурації:
$wgAPIModules['createaccount'] = 'ApiDisabled';