API:Création de compte
Cette page fait partie de la documentation de l'API MediaWiki Action. |
Version de MediaWiki : | ≥ 1.27 |
Documentation de l'API
Création d'un compte
Le processus possède trois étapes générales :
- Récupérez les champs de API:Authmanagerinfo et le jeton de API:Tokens .
- Envoyez une requête POST avec le jeton récupéré, les informations utilisateur et les autres champs, et l'URL de retour de l'API.
- Gérez la réponse, qui peut impliquer d'autres requêtes POST pour fournir davantage d'informations.
Exemple 1: Traitement sur un wiki sans extensions d'authentification particulières
Un wiki sans extensions d'authentification spéciales peut être plutôt simple à traiter. Si votre code sait quels sont les champs qui seront obligatoires, il peut sauter l'appel à API:Authmanagerinfo et simplement supposer les champs nécessaires (par exemple le nom de l'utilisateur, le mot de passe & le mot de passe retapé, l'adresse de courriel, éventuellement le nom réel).
reason
dans la requête POST. Vous pouvez aussi utiliser mailpassword
à la place des paramètres password
et retype
pour que MediaWiki envoie au nouvel utilisateur un mot de passe temporaire par courriel.
Requête POST
Réponse
{
"createaccount": {
"status": "PASS",
"username": "Zane"
}
}
Exemple de code
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 );
} );
} );
Exemple 2: Traitement sur un wiki avec une extension CAPTCHA
Remarquez que la première étape ci-dessous pourrait, si vous le voulez, être faite en deux parties: la première pour récupérer les champs disponibles de API:Authmanagerinfo et la seconde pour récupérer le jeton de API:Tokens .
<span id="First_step:_Fetch_fields_available_from_API:Authmanagerinfo _and_token_from_API:Tokens ">
Première étape: récupérer les champs disponibles de API:Authmanagerinfo et le jeton de API:Tokens
Résultat |
---|
{
"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+\\"
}
}
}
|
Seconde étape: envoyer une requête Post avec un jeton de création de compte, les informations utilisateur et l'URL de retour
Résultat |
---|
{
"createaccount": {
"status": "PASS",
"username": "Zane"
}
}
|
Exemple de code
Notez que ce morceau de code sépare les requêtes API:Authmanagerinfo et API:Tokens , et suppose généralement qu'il y aura un CAPTCHA et pas d'autres complications.
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>
|
Exemple 3: création de compte sur un wiki avec un CAPTCHA, une extension OpenID, et une extension d'authentification à deux facteurs activée
<span id="First_step:_Fetch_fields_available_from_API:Authmanagerinfo _and_token_from_API:Tokens ">
Première étape: récupérer les champs disponibles de API:Authmanagerinfo et le jeton de API:Tokens
La récupération de API:Authmanagerinfo et API:Tokens est très similaire à l'exemple précédent, cela n'est donc pas répété ici. La liste des requêtes retournées par API:Authmanagerinfo va contenir en même temps les définitions pour l'extension CAPTCHA et l'extension OpenID.
Seconde étape : répondre au CAPTCHA et sélectionner l'authentification OpenID.
Résultat |
---|
{
"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"
},
}
}
]
}
}
|
Le navigateur de l'utilisateur va alors être redirigé vers le redirecttarget fourni.
Ensuite, l'authentification par OpenID va s'effectuer, avant de rediriger vers Special:OpenIDConnectReturn sur le wiki, qui validera la réponse de OpenID et renverra l'utilisateur vers le createreturnurl renseigné dans la première requête POST vers l'API, avec les paramètres code et state ajoutés.
L'utilisateur reprend alors le contrôle du processus à ce point et effectue la requête suivante vers l'API.
Troisième étape : après l'authentification par OpenID.
Le cient met code et state qu'il renvoie à l'API. La réponse de l'API comporte l'extension de l'authentification à deux facteurs qui demande à l'utilisateur de définir son second facteur.
Résultat |
---|
{
"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"
}
}
}
]
}
}
|
Maintenant le client va demander à l'utilisateur de définir un nouveau compte dans son application à authentification à deux facteurs et entrer le code actuel, ou bien autoriser l'utilisateur à sauter l'authentification à deux facteurs. Faisons comme si l'utilisateur effectuait cette authentification à deux facteurs.
Quatrième étape : choisir l'authentification à deux facteurs.
Résultat |
---|
{
"createaccount": {
"status": "PASS",
"username": "Alice"
}
}
|
La création du compte a finalement réussi.
Si la création du compte échoue à un moment quelconque, une réponse avec un statut FAIL sera retournée, au côté d'un message qui s'affichera chez l'utilisateur.
Erreurs possibles
Code | Infos |
---|---|
badtoken | Jeton non valide de création de compte |
notoken | Le paramètre token doit être défini. |
mustpostparams | Le paramètre suivant a été trouvé dans la chaîne de requête, mais doit figurer dans le corps de la requête POST : createtoken. |
missingparam | Au moins un des paramètres "createcontinue" et "createreturnurl" est obligatoire. |
authmanager-create-no-primary | Les informations d’identification fournies n’ont pas pu être utilisées pour la création de compte. |
noemailcreate | Vous devez fournir une adresse de courriel valide |
invalidemailaddress | Cette adresse courriel ne peut pas être acceptée car son format paraît incorrect.
Entrez une adresse correctement formatée ou laissez ce champ vide. |
badretype | Les mots de passe que vous avez saisis ne correspondent pas. |
userexists | Le nom d’utilisateur saisi est déjà utilisé.
Veuillez choisir un nom différent. |
captcha-createaccount-fail | CAPTCHA erroné ou manquant. |
acct_creation_throttle_hit | Les visiteurs de ce wiki utilisant votre adresse IP ont créé num compte lors de cette dernière journée, ce qui est le maximum autorisé pour cette période de temps. Par conséquent, les visiteurs utilisant cette adresse IP ne peuvent plus pour l’instant créer de compte.
Si vous participez à un événement qui a pour but de contribuer aux projets de Wikimedia, veuillez voir Demander la levée temporaire de la limitation IP pour aider à résoudre ce problème. |
Notes additionnelles
- Les créations de comptes sont enregistrées dans Special:log/newusers.
Si vous êtes connecté, votre nom d'utilisateur sera également enregistré si vous créez un compte.
- Quand vous excutez les parties de code fournies sur cette page, rappelez-vous que :
- Une fois qu'un compte est créé sur un wiki, il ne peut pas être supprimé.
- Utilisez toujours
https://test.wikipedia.org/w/api.php
comme point de terminaison, pour ne pas créer accidentellement de comptes sur les wikis de production.
- Les administrateurs de site MediaWiki et les développeurs d'extensions peuvent désactiver ces fonctionalités de l'API en insérant la ligne suivante dans le fichier de configuration :
$wgAPIModules['createaccount'] = 'ApiDisabled';