API:Authentification

From MediaWiki.org
Jump to navigation Jump to search
This page is a translated version of the page API:Login and the translation is 100% complete.
Other languages:
Deutsch • ‎English • ‎dansk • ‎español • ‎français • ‎italiano • ‎polski • ‎русский • ‎українська • ‎العربية • ‎فارسی • ‎ไทย • ‎中文 • ‎文言 • ‎日本語 • ‎한국어

Il est possible que l'API MediaWiki demande à votre application ou au client de fournir les certificats d'authentification de l'utilisateur et de se connecter pour: (a) des demandes d'informations ou des actions de modification de données, (b) ou faire des requêtes plus larges avec une limite plus élevée du nombre de résultats par requête.

Deux méthodes pour authentifier

Il y a deux manières pour s'authentifier auprès de l'API action de MediaWiki :

Méthode 1. la connexion

Les robots et les autres application non interactives doivent utiliser les consommateurs OAuth des auteurs seulement si disponibles car il sont davantage sécurisés. S'ils ne sont pas disponibles, ou ne peuvent s'appliquer au client, vous pouvez utiliser l'action login avec les mots de passe des robots.

Documentation de l'API


action=login (lg)

(main | login)
  • This module only accepts POST requests.
  • Source: MediaWiki
  • License: GPL-2.0-or-later

Log in and get authentication cookies.

This action should only be used in combination with Special:BotPasswords; use for main-account login is deprecated and may fail without warning. To safely log in to the main account, use action=clientlogin.

Parameters:
lgname

User name.

lgpassword

Password.

lgdomain

Domain (optional).

lgtoken

A "login" token retrieved from action=query&meta=tokens

Exemple

Requête POST

lgtoken dans la requête ci-dessus est récupéré de API:Tokens/fr

Réponse

{  
   "login": {  
      "lguserid": 21,
      "result": "Success",
      "lgusername": "William"
   }
}

Exemple de code

Python

#!/usr/bin/python3

"""
    login.py

    MediaWiki API Demos
    Demo of `Login` module: Sending post request to login
    MIT license
"""

import requests

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':"your_bot_username",
    'lgpassword':"your_bot_password",
    'lgtoken':LOGIN_TOKEN,
    'format':"json"
}

R = S.post(URL, data=PARAMS_1)
DATA = R.json()

print(DATA)

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 );
}

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_0 = {
        action: "query",
        meta: "tokens",
        type: "login",
        format: "json"
    };

    request.get({ url: url, qs: params_0 }, function (error, res, body) {
        if (error) {
            return;
        }
        var 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(login_token) {
    var params_1 = {
        action: "login",
        lgname: "bot_username",
        lgpassword: "bot_password",
        lgtoken: login_token,
        format: "json"
    };

    request.post({ url: url, form: params_1 }, function (error, res, body) {
        if (error) {
            return;
        }
        console.log(body);
    });
}

// Start From Step 1
getLoginToken();

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 );
} );
Comme dans MediaWiki 1.27, l'utilistion du compte principal pour se connecter n'est pas prise en charge. Obtenir les certificats via Special:BotPasswords ou utiliser la méthode clientlogin . Se connecter et rester connecter nécessite que le client gère correctement les cookies pour toutes les requêtes. Dans l'exemple ci-dessus on montre comment un objet session requests.Session() permet aux cookies de persister.

Méthode 2. connexion du client

Doivent utiliser l'action clientlogin : (a) les applications interactives comme les éditeurs personnalisés ou les applications qui patrouillent fournissant une service sans avoir l'intention de se substituer complètement au site web, (b) les applications mobile qui ont pour but de remplacer complètement l'accès à l'interface utilisateur basé sur le web. Néanmoins, on peut préférer utiliser OAuth s'il est disponible pour authentifier l'outil, car il est plus facile et davantage sécurisé. Ce module est disponible depuis MediaWiki 1.27.

Documentation de l'API


action=clientlogin (login)

(main | clientlogin)
  • This module only accepts POST requests.
  • Source: MediaWiki
  • License: GPL-2.0-or-later

Log in to the wiki using the interactive flow.

The general procedure to use this module is:

  1. Fetch the fields available from action=query&meta=authmanagerinfo with amirequestsfor=login, and a login token from action=query&meta=tokens.
  2. Present the fields to the user, and obtain their submission.
  3. Post to this module, supplying loginreturnurl and any relevant fields.
  4. Check the status in the response.
    • If you received PASS or FAIL, you're done. The operation either succeeded or it didn't.
    • If you received UI, present the new fields to the user and obtain their submission. Then post to this module with logincontinue and the relevant fields set, and repeat step 4.
    • If you received REDIRECT, direct the user to the redirecttarget and wait for the return to loginreturnurl. Then post to this module with logincontinue and any fields passed to the return URL, and repeat step 4.
    • If you received RESTART, that means the authentication worked but we don't have a linked user account. You might treat this as UI or as FAIL.
Parameters:
loginrequests

Only use these authentication requests, by the id returned from action=query&meta=authmanagerinfo with amirequestsfor=login or from a previous response from this module.

Separate values with | or alternative. Maximum number of values is 50 (500 for bots).
loginmessageformat

Format to use for returning messages.

One of the following values: html, wikitext, raw, none
Default: wikitext
loginmergerequestfields

Merge field information for all authentication requests into one array.

Type: boolean (details)
loginpreservestate

Preserve state from a previous failed login attempt, if possible.

Type: boolean (details)
loginreturnurl

Return URL for third-party authentication flows, must be absolute. Either this or logincontinue is required.

Upon receiving a REDIRECT response, you will typically open a browser or web view to the specified redirecttarget URL for a third-party authentication flow. When that completes, the third party will send the browser or web view to this URL. You should extract any query or POST parameters from the URL and pass them as a logincontinue request to this API module.

logincontinue

This request is a continuation after an earlier UI or REDIRECT response. Either this or loginreturnurl is required.

Type: boolean (details)
logintoken

A "login" token retrieved from action=query&meta=tokens

This parameter is required.
*
This module accepts additional parameters depending on the available authentication requests. Use action=query&meta=authmanagerinfo with amirequestsfor=login (or a previous response from this module, if applicable) to determine the requests available and the fields that they use.
Examples:
Start the process of logging in to the wiki as user Example with password ExamplePassword.
api.php?action=clientlogin&username=Example&password=ExamplePassword&loginreturnurl=http://example.org/&logintoken=123ABC [open in sandbox]
Continue logging in after a UI response for two-factor auth, supplying an OATHToken of 987654.
api.php?action=clientlogin&logincontinue=1&OATHToken=987654&logintoken=123ABC [open in sandbox]

Exemple 1: processus pour un wiki sans extensions particulières d'authentification

Requête POST

Obtenir un jeton en se connectant dans la requête ci-dessus via API:Tokens/fr .

Réponse

{  
   "clientlogin":{  
      "status":"PASS",
      "username":"William"
   }
}

Exemple de code

Exemple 2: processus pour un wiki ayant des extensions d'authentification spéciales

Un wiki avec des extensions d'authentification spéciales telles que ConfirmEdit (les captchas), OpenID , OATHAuth (l'authentification à deux facteurs), peuvent avoir un processus d'authentication plus compliqué. Des champs spécifiques peuvent aussi être obligatoires dans ce cas; leur description peut être récupérée par la requête API:Authmanagerinfo .

Etape 1: répondre au Captcha et sélectionner l'authentification OpenID

Il est attendu que le client redirige le navigateur de l'utilisateur vers la redirecttarget fournie. Le fournisseur OpenID va authentifier, et rediriger vers Special:OpenIDConnectReturn sur le wiki, ce qui va valider la réponse OpenID et ensuite rediriger vers la loginreturnurl fournie dans le premier POST fait à l'API en y ajoutant les paramètres code et state. Le client obtient de nouveau le contrôle du processus à ce point et envoie ses requêtes suivantes à l'API.

Etape 2: retour de OpenID

Maintenant le client a besoin de demander à l'utilisateur de vérifer sont application d'authentification à deux facteurs pour le code actuel, et de le renvoyer au serveur pour continuer le processus d'authentification.

Etape 3: authentification à deux facteurs

Note: dans certains cas il est possible de recevoir une réponse RESTART, par exemple si l'extension OpenID Connect ne trouve pas de correspondance du compte OpenID avec un utilisateur local. Dans ce cas, le client a la possibilité de redémarrer le processus de connexion du début ou de basculer vers une création de compte, dans tous les cas en passant le paramètre loginpreservestate ou createpreservestate pour préserver un certain état.

Erreurs possibles

Code Informations
Failed L'authentification entrée, identifiant ou mot de passe, est incorrecte. Merci de bien vouloir réessayer.
WrongToken Le jeton fourni est non valide
NeedToken `lgtoken` non fourni
Aborted connexion utilisant le mot de passe du compte principal plutôt que les mots de passe des robots
mustpostparams Le paramètre suivant a été trouvé dans la chaîne de requête, mais doit être dans le corps du POST : $1.

Notes additionnelles

  • Sur les wikis qui authorisent les modifications anonymes, il est possible d'éditer par l'API sans s'authentifier, mais il est fortement recommandé de le faire tout de même. Sur les wikis privés, vous devez vous identifier pour utiliser l'API, quelle que soit la fonctionnalité
  • Il est recommandé de créer un compte utilisateur séparé pour votre application. Ceci est particulièrement important si votre application génère des éditions automatiques ou invoque des requêtes qui demandent beaucoup de ressources ou de performances d'exécution. Avec cela, il est facile de suivre les modifications faites par l'application et d'appliquer des droits spéciaux au compte utilisateur de l'application.
  • Si vous envoyez une requête qui doit être faite par un utilisateur connecté, ajoutez le paramètre assert=user à la requête que vous envoyez, pour vérifier si elle provient bien d'un utilisateur connecté. Si l'utilisateur n'est pas connecté, un code d'erreur assertuserfailed sera retourné.
  • Pour vérifier si un compte possède des droits de robot, ajoutez le paramètre assert=bot à la requête. Si le compte ne possède pas les droits des robots, un code d'erreur assertbotfailed sera retourné.

Voir également

  • API:Userinfo - Renvoie les informations concernant l'utilisateur actuellement connecté