API:Login
Esta página es parte de la documentación de la API de acciones de MediaWiki. |
MediaWiki API puede requerir que tu aplicación o cliente proporcione credenciales de usuario autenticado e inicie sesión para (a) consultar información o acciones de modificación-de-datos (b) realizando grandes consultas con un mayor límite de solicitud.
Dos métodos para autenticar
Hay dos maneras para autenticar al MediaWiki Acción API:
Método 1. login
Los bots y otras aplicaciones no interactivas deben usar owner-only OAuth consumer si está disponible, ya que es más seguro.
Si no está disponible o no es aplicable al cliente, la acción login
se puede usar con bot passwords.
Documentación de la API
Ejemplo
Petición de CORREO
Respuesta
{
"login": {
"lguserid": 21,
"result": "Success",
"lgusername": "William"
}
}
Código de muestra
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
. Iniciar sesión y permanecer conectado requiere que tu cliente maneje correctamente las cookies HTTP en todas las peticiones. En el ejemplo anterior, mostramos cómo un objeto de sesión requests.Session()
ayuda a mantener las cookies.
Errores posibles
Código | Información |
---|---|
Failed | Nombre de usuario o contraseña ingresado incorrecto. Por favor inténtalo de nuevo. |
Failed | Unable to continue login. Your session most likely timed out. (or you are not correctly handling cookies). |
WrongToken | Token proporcionado no válido |
NeedToken | `lgtoken` No proporcionado |
Aborted | iniciar sesión utilizando la contraseña de la cuenta principal en lugar de con las contraseñas bot |
mustpostparams | Se encontraron los siguientes parámetros en la cadena de la consulta, pero deben estar en el cuerpo del POST: $1. |
Método 2. clientlogin
Las aplicaciones interactivas, como editores personalizados o aplicaciones de vigilancia que proporcionan un servicio sin intención de reemplazar completamente el sitio web o las aplicaciones móviles que apuntan a reemplazar completamente el acceso a la interfaz de usuario basada en la web, tendrían que utilizar la acción clientlogin
.
Sin embargo, uno debería preferir usar OAuth si está disponible para autenticar la herramienta, ya que es más fácil y más seguro.
Este módulo está disponible desde MediaWiki 1.27.
API Documentación
Ejemplo 1: Proceso para un wiki sin extensiones especiales de autenticación
Petición de CORREO
Obtén token login en la petición anterior a través de API:Tokens .
Respuesta
{
"clientlogin":{
"status":"PASS",
"username":"William"
}
}
Código de ejemplo
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>
|
Ejemplo 2: Proceso para un wiki con extensiones especiales de autentificación
Una wiki con extensiones de autenticación especiales como ConfirmEdit (captchas), OpenID Connect , OATHAuth (dos factores de autenticación) puede tener un proceso de autentificación más complicado. Los campos específicos también pueden ser necesarios en ese caso, cuya descripción se puede obtener de la consulta de API:Authmanagerinfo .
Paso 1: Responde el Captcha y selecciona OpenID autentificación
This documentation is an example and does not reflect the behavior of any specific currently-available OpenID extension.
redirecttarget
. El proveedor de OpenID autentificaría y redirigiría a Special: OpenIDConnectReturn en el wiki, que validaría la respuesta de OpenID y luego redirigiría al
loginreturnurl proporcionado en el primer CORREO a la API con el código
y los parámetros
state
agregados. El cliente recupera el control del proceso en este punto y realiza su próxima solicitud de API.Respuesta |
---|
{
"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"
},
}
}
]
}
}
|
Paso 2: Volver de OpenID
Respuesta |
---|
{
"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"
}
}
}
]
}
}
|
Paso 3: autentificación de Dos factores
REINICIAR
, por ejemplo, si la extensión OpenID Connecta no tenía asignado para la cuenta OpenID a ningún usuario local. En este caso, el cliente puede reiniciar el proceso de inicio de sesión desde el principio o puede cambiar a creación de cuenta, en cualquier caso pasando el parámetro loginpreservestate o
createpreservestate para preservar algún estado. 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.Respuesta |
---|
{
"clientlogin": {
"status": "PASS",
"username": "Alice"
}
}
|
Notas adicionales
- En wikis que permiten edición anónima, es posible editar a través del API sin iniciar sesión, pero es altamente recomendable que inicies sesión. En wikis privados, es necesario iniciar sesión para usar
cualquier funcionalidad API .
- Es recomendado crear una cuenta de usuario separada para tu aplicación. Esto es especialmente importante si tu aplicación está llevando a cabo edición automatizada o invocando consultas grandes o rendimiento-intensivo. Con eso, es fácil rastrear los cambios realizados por la aplicación y aplicar derechos especiales a la cuenta de la aplicación. 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.
- Si estás enviando una petición que debería ser hecha por un usuario conectado, añade el parámetro
assert=user
a la petición que estás enviando en orden de verificar si el usuario ha iniciado sesión. Si el usuario no ha iniciado sesión, un errorassertuserfailed
Será devuelto. See API:Assert for details. - Para verificar si una cuenta tiene derechos de bot, añade el parámetro
assert=bot
a la petición. Si la cuenta no tiene derechos de bot, un código errorassertbotfailed
será retornado. See API:Assert for details.
Véase también
- API:Cierre de sesión
- API:Userinfo - Devuelve información sobre el usuario actualmente conectado
- Interactive login with action=clientlogin in mwapi