API:Вход
Эта страница является частью документации по API действий MediaWiki. |
MediaWiki API может потребовать от вашего приложения или клиента предоставить аутентифицированные учетные данные пользователя и войти в систему для (а) запроса информации или действий по изменению данных (б) для выполнения больших запросов с более высоким запросом на лимит.
Два метода аутентификации
Существует два способа аутентификации в MediaWiki Action API:
Метод 1. login
Боты и прочие неинтерактивные приложения, когда это возможно, должны использовать owner-only OAuth consumers для аутентификации, как более безопасный метод.
Если этот метод недоступен, или его реализация в этом клиенте невозможна, действие login
может быть использовано и с паролями для ботов.
Документация по API
Пример
POST-запрос
Ответ
{
"login": {
"lguserid": 21,
"result": "Success",
"lgusername": "William"
}
}
Пример кода
MediaWiki JS
/*
login.js
MediaWiki API Demos
Demo of `Login` module: Sending request to login
MIT License
*/
var api = new mw.Api();
api.login( 'your_bot_username', 'your_bot_password' ).done( function ( data ) {
console.log( 'You are logged in as ' + data.login.lgusername );
} );
JavaScript
/*
edit.js
MediaWiki API Demos
Demo of `Login` module: Sending post request to login
MIT license
*/
var request = require( 'request' ).defaults( { jar: true } ),
url = 'https://test.wikipedia.org/w/api.php';
// Step 1: GET request to fetch login token
function getLoginToken() {
var params = {
action: 'query',
meta: 'tokens',
type: 'login',
format: 'json'
};
request.get( { url: url, qs: params }, function ( error, res, body ) {
var data;
if ( error ) {
return;
}
data = JSON.parse( body );
loginRequest( data.query.tokens.logintoken );
} );
}
// Step 2: POST request to log in.
// Use of main account for login is not
// supported. Obtain credentials via Special:BotPasswords
// (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
function loginRequest( loginToken ) {
var params = {
action: 'login',
lgname: 'bot_username',
lgpassword: 'bot_password',
lgtoken: loginToken,
format: 'json'
};
request.post( { url: url, form: params }, function ( error, res, body ) {
if ( error ) {
return;
}
console.log( body );
} );
}
// Start From Step 1
getLoginToken();
PHP
<?php
/*
login.php
MediaWiki API Demos
Demo of `Login` module: Sending post request to login
MIT license
*/
$endPoint = "https://test.wikipedia.org/w/api.php";
$login_Token = getLoginToken(); // Step 1
loginRequest( $login_Token ); // Step 2
// Step 1: GET request to fetch login token
function getLoginToken() {
global $endPoint;
$params1 = [
"action" => "query",
"meta" => "tokens",
"type" => "login",
"format" => "json"
];
$url = $endPoint . "?" . http_build_query( $params1 );
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "/tmp/cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "/tmp/cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
$result = json_decode( $output, true );
return $result["query"]["tokens"]["logintoken"];
}
// Step 2: POST request to log in. Use of main account for login is not
// supported. Obtain credentials via Special:BotPasswords
// (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
function loginRequest( $logintoken ) {
global $endPoint;
$params2 = [
"action" => "login",
"lgname" => "your_bot_username",
"lgpassword" => "your_bot_password",
"lgtoken" => $logintoken,
"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, "/tmp/cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "/tmp/cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
echo( $output );
}
Python
#!/usr/bin/python3
"""
login.py
MediaWiki API Demos
Demo of `Login` module: Sending post request to login
MIT license
"""
import requests
USERNAME = "your_bot_username"
PASSWORD = "your_bot_password"
S = requests.Session()
URL = "https://www.mediawiki.org/w/api.php"
# Retrieve login token first
PARAMS_0 = {
'action':"query",
'meta':"tokens",
'type':"login",
'format':"json"
}
R = S.get(url=URL, params=PARAMS_0)
DATA = R.json()
LOGIN_TOKEN = DATA['query']['tokens']['logintoken']
print(LOGIN_TOKEN)
# Send a post request to login. Using the main account for login is not
# supported. Obtain credentials via Special:BotPasswords
# (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
PARAMS_1 = {
'action': "login",
'lgname': USERNAME,
'lgpassword': PASSWORD,
'lgtoken': LOGIN_TOKEN,
'format': "json"
}
R = S.post(URL, data=PARAMS_1)
DATA = R.json()
print(DATA)
assert DATA['login']['result'] == 'Success'
clientlogin
. Вход и нахождение в системе требуют корректных HTTP куки, обрабатываемых вашим клиентов для всех запросов. В примере выше демонстрируется, как объект сессии requests.Session()
помогает сохранить куки.
Возможные ошибки
Код | Информация |
---|---|
Failed | Введено неверное имя пользователя или пароль. Пожалуйста, попробуйте еще раз. |
Failed | Unable to continue login. Your session most likely timed out. (or you are not correctly handling cookies). |
WrongToken | Указан неверный токен |
NeedToken | `lgtoken` не предоставлен |
Aborted | Войдите, используя пароль основной учетной записи, а не пароли бота. |
mustpostparams | Следующие параметры были найдены в строке запроса, но должны находиться в теле POST: $1. |
Метод 2. клиентский логин
Интерактивные приложения, такие как произвольные инструменты редактирования или патрулирования, которые предоставляют службы без намерения полностью заменить сайт, или мобильные приложения, которые полностью заменяют доступ к пользовательскому интерфейсу, должны использовать действие clientlogin
.
Однако, для аутентификации инструмента следует использовать OAuth , если это доступно, поскольку это проще и более безопасно.
Этот модуль доступен начиная с MediaWiki 1.27.
Документация по API
Пример 1: Процесс в вики без специальных расширений для аутентификации
POST-запрос
В запросе выше, получение токена логина с помощью API:Токены .
Ответ
{
"clientlogin":{
"status":"PASS",
"username":"William"
}
}
Пример кода
clientlogin.py |
---|
#!/usr/bin/python3
"""
clientlogin.py
MediaWiki Action API Code Samples
Demo of `clientlogin` module: Sending post request to login
This demo app uses Flask (a Python web development framework).
MIT license
"""
import requests
from flask import Flask, render_template, flash, request
S = requests.Session()
URL = "https://en.wikipedia.org/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 """
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
start_client_login(username, password)
return render_template('clientlogin_form.html')
def start_client_login(username, password):
""" Send a post request along with login token, user information
and return URL to the API to log in on a wiki """
login_token = fetch_login_token()
response = S.post(url=URL, data={
'action': "clientlogin",
'username': username,
'password': password,
'loginreturnurl': 'http://127.0.0.1:5000/',
'logintoken': login_token,
'format': "json"
})
data = response.json()
if data['clientlogin']['status'] == 'PASS':
flash('Login success! Welcome, ' + data['clientlogin']['username'] + '!')
else:
flash('Oops! Something went wrong -- ' + data['clientlogin']['messagecode'])
def fetch_login_token():
""" Fetch login token via `tokens` module """
response = S.get(
url=URL,
params={
'action': "query",
'meta': "tokens",
'type': "login",
'format': "json"})
data = response.json()
return data['query']['tokens']['logintoken']
if __name__ == "__main__":
APP.run()
|
form.html |
---|
<!DOCTYPE html>
<title>MediaWiki Log in</title>
<link rel="stylesheet" href="static/bootstrap/css/bootstrap.min.css">
<div class="container">
<h2>MediaWiki Log in</h2>
<form action="" method="post" role="form">
<div class="form-group">
<div class="form-field">
<div class="label-field">Username</div>
<input name="username">
</div>
<div class="form-field">
<div class="label-field">Password</div>
<input type="password" name="password">
</div>
</div>
<button type="submit" class="btn btn-success">Log in</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>
|
Пример 2: Процесс для вики с расширениями для аутентификации
Вики с расширениями для аутентификации, такие как ConfirmEdit/ru (captcha), OpenID Connect , OATHAuth (двухфакторная аутентификация), может быть более сложный процесс аутентификации. В этом случае могут потребоваться дополнительные поля, описание которых могут быть получены с помощью запроса API:Authmanagerinfo .
Шаг 1: Ответьте на Captcha и выберите аутентификацию OpenID
This documentation is an example and does not reflect the behavior of any specific currently-available OpenID extension.
redirecttarget
. Провайдер OpenID произведёт аутентификацию и перенаправит на расположенную на вики страницу Special:OpenIDConnectReturn, которая произведёт валидацию ответа OpenID и перенаправит на адрес loginreturnurl
, указанный в первом POST-запросе к API, и к этому адресу будут добавлены параметры code
и state
. В этот момент клиент снова получает контроль над процессом и выполняет следующий запрос к API.Ответ |
---|
{
"clientlogin": {
"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"
},
}
}
]
}
}
|
Шаг 2: От от OpenID
Ответ |
---|
{
"clientlogin": {
"status": "UI",
"message": "Two-factor authentication",
"requests": [
{
"id": "TwoFactorAuthenticationRequest",
"metadata": {},
"required": "required",
"provider": "",
"account": "",
"fields": {
"code": {
"type": "string",
"label": "Code",
"help": "Two-factor authentication code"
}
}
}
]
}
}
|
Шаг 3: двухфакторная аутентификация
RESTART
, например если в расширении OpenID Connect у этой учётной записи OpenID не было привязки ни к какому локальному пользователю. In this case the client might restart the login process from the beginning or might switch to account creation, in either case passing the loginpreservestate
or createpreservestate
parameter to preserve some state.Ответ |
---|
{
"clientlogin": {
"status": "PASS",
"username": "Alice"
}
}
|
Дополнительные примечания
- На вики, разрешающих анонимное редактирование, возможно редактировать через API без входа в учётную запись, но это действие всё равно крайне рекомендуется выполнять. На приватных вики, вход необходим для использования любых API функций.
- Рекомендуется создавать отдельную учётную запись для своего приложения. This is especially important if your application is carrying out automated editing or invoking large or performance-intensive queries. With that, it is easy to track changes made by the application and apply special rights to the application's account.
- Если вы посылаете запрос, который должен осуществляться выполнившим ход пользователем, добавьте параметр
assert=user
к запросу, чтобы проверить, что пользователь выполнил вход. Если пользователь не зашел, то вернется код ошибкиassertuserfailed
. See API:Assert for details. - Чтобы проверить есть ли у аккаунта права бота, добавьте параметр
assert=bot
к запросу. Если у аккаунта нет прав бота, вернется код ошибкиassertbotfailed
. See API:Assert for details.
Смотрите также
- API:Выход
- API:Userinfo - Возвращает информацию о текущем вошедшем в систему пользователе.
- Interactive login with action=clientlogin in mwapi