API:Account creation/tw
This page is part of the MediaWiki Action API documentation. |
MediaWiki version: | ≥ 1.27 |
API ho nkrataa
Creating an account
Adeyɛ no wɔ anammɔn abiɛsa a ɛfa nneɛma nyinaa ho:
- Fa mfuw no fi API:Authmanagerinfo na fa token no fi API:Tokens .
- Send a POST request with the fetched token, user information and other fields, and return URL to the API.
- Deal with the response, which might involve further POST requests to supply more information.
Nhwɛsoɔ 1: Dwumadie wɔ wiki a enni ahotosoɔ ntrɛmu soronko
A wiki without special authentication extensions can be rather straightforward. If your code knows which fields will be required, it might skip the call to API:Authmanagerinfo and just assume which fields will be needed (i.e. username, password & retyped password, email, possibly realname).
reason
parameter to the POST request. You could also use mailpassword
in place of password
and retype
parameters to have MediaWiki send the new user a temporary password via email.
POST abisadeɛ
Mmuae
{
"createaccount": {
"status": "PASS",
"username": "Zane"
}
}
koodu Nhwɛsode
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 );
} );
} );
Nhwɛsoɔ 2: Dwumadie wɔ wiki a ɛwɔ CAPTCHA ntrɛmu so
Hyɛ no nsow sɛ anammɔn a edi kan a ɛwɔ ase ha no betumi, sɛ wopɛ a, wɔbɛyɛ no sɛ anammɔn abien: biako sɛ wobɛfa afuw a ɛwɔ hɔ no afi API:Authmanagerinfo na foforo nso wobɛfa token no afi API:Tokens .
<span id="First_step:_Fetch_fields_available_from_API:Authmanagerinfo _and_token_from_API:Tokens ">
Anamɔn a edi kan: Fa afuw a ɛwɔ hɔ fi API:Authmanagerinfo ne token fi API:Tokens
Result |
---|
{
"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+\\"
}
}
}
|
Anamɔn a ɛtɔ so mmienu: Fa post abisadeɛ ka ho ne create account token, ɔdefoɔ ho nsɛm ne URL sanba
Result |
---|
{
"createaccount": {
"status": "PASS",
"username": "Zane"
}
}
|
koodu Nhwɛsode
Hyɛ no nsow sɛ saa koodu nhwɛso yi tetew API:Authmanagerinfo ne API:Tokens abisade ahorow no mu, na mpɛn pii no ɛfa no sɛ CAPTCHA bɛba na nsɛnnennen foforo biara nni hɔ.
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>
|
Nhwɛsoɔ 3: Akontaabuo a wɔayɛ wɔ wiki a ɛwɔ CAPTCHA, OpenID ntrɛmu, ne nneɛma mmienu ahotosoɔ ntrɛmu a wɔama ayɛ adwuma
<span id="First_step:_Fetch_fields_available_from_API:Authmanagerinfo _and_token_from_API:Tokens ">
Anamɔn a edi kan: Fa afuw a ɛwɔ hɔ fi API:Authmanagerinfo ne token fi API:Tokens
API:Authmanagerinfo ne API:Tokens a wɔde bɛba no yɛ nea ɛwɔ nhwɛso a atwam no mu no ara pɛ kɛse, na enti wɔnsan nyɛ bio wɔ ha. Abisadeɛ a wɔde API:Authmanagerinfo bɛsan aba no din bɛka nkyerɛaseɛ a ɛfa CAPTCHA ntrɛmu ne OpenID ntrɛmu no nyinaa ho.
Anamɔn a ɛtɔ so mmienu: Bua CAPTCHA no na paw OpenID authentication.
Result |
---|
{
"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"
},
}
}
]
}
}
|
Anka wɔbɛhwɛ kwan sɛ akraman no bɛdan ɔdefo no brawsa no akɔ redirecttarget a wɔde ama no so.
The OpenID provider would authenticate, and redirect to Special:OpenIDConnectReturn on the wiki, which would validate the OpenID response and then redirect to the createreturnurl provided in the first POST to the API with the code and state parameters added.
Client no nya tumi wɔ dwumadie no so san wɔ saa beaeɛ yi na ɔyɛ ne API abisadeɛ a ɛdi hɔ no.
Anamɔn a ɛto so abiɛsa: San fi OpenID.
Akraman no de code ne state no san kɔ API no so. API no mmuaeɛ no wɔ nneɛma mmienu ahotosoɔ ntrɛmu a ɛkanyan ɔdefoɔ no sɛ ɔmfa wɔn factor a ɛtɔ so mmienu no nsi hɔ.
Result |
---|
{
"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"
}
}
}
]
}
}
|
Afei na akraman no bɛka akyerɛ nea ɔde di dwuma no sɛ ɔmfa akontaabu foforo nsi hɔ wɔ wɔn nneɛma abien ho adansedi app no mu na ɔmfa mprempren koodu no nhyɛ mu, anaasɛ ɔmma nea ɔde di dwuma no kwan ma onhuruw 2FA nhyehyɛe no. Momma yɛmfa no sɛ nea ɔde di dwuma no yɛ set up 2FA.
Fourth step: Set up two-factor authentication.
Result |
---|
{
"createaccount": {
"status": "PASS",
"username": "Alice"
}
}
|
Awiei koraa no, akontaabu a wɔyɛe no adi nkonim.
If at any point account creation fails, a response with status FAIL will be returned, along with a message to display to the user.
Mfomso a ebetumi aba
Koodu | Asɛm |
---|---|
badtoken | Invalid create account token |
notoken | The token parameter must be set. |
mustpostparams | The following parameter was found in the query string, but must be in the POST body: createtoken. |
missingparam | At least one of the parameters "createcontinue" ɛne "createreturnurl" is required. |
authmanager-create-no-primary | The supplied credentials could not be used for account creation. |
noemailcreate | Ɛsɛ sɛ wo di email address a ɛyɛ adwuma na yɛn. |
invalidemailaddress | The email address cannot be accepted as it appears to have an invalid format.
Please enter a well-formatted address or empty that field. |
badretype | Kukuwa mu ahyɛnsode abien no nsɛ |
userexists | Obi foforo kita din an wo pɛ no.
Yɛsrɛ wo sesa fa foforo. |
captcha-createaccount-fail | Incorrect or missing CAPTCHA. |
acct_creation_throttle_hit | Visitors to this wiki using your IP address have created num accounts in the last day, which is the maximum allowed in this time period.
As a result, visitors using this IP address cannot create any more accounts at the moment. If you are at an event where contributing to Wikimedia projects is the focus, please see Requesting temporary lift of IP cap to help resolve this issue. |
Nsɛm foforo a wɔakyerɛw
- Account creations are recorded in Special:log/newusers.
Sɛ woakɔ mu a, wɔbɛkyerɛw wo din nso bere a woreyɛ akontaabu no.
- While executing the code snippets provided on this page, remember:
- Once an account on a wiki is created, it cannot be deleted.
- Fa
https://test.wikipedia.org/w/api.php
di dwuma bere nyinaa sɛ awiei, sɛnea ɛbɛyɛ a worennyɛ akontaabu wɔ akwanhyia mu wɔ adwumayɛ mu wiki ahorow.
- MediaWiki sait sohwɛfo ne ntrɛwmu ayɛfo' betumi asiw API afã yi ano denam nkyerɛwde a edidi so yi a wɔde bɛhyɛ nhyehyeɛ fael no mu no so:
$wgAPIModules['createaccount'] = 'ApiDisabled';