API:Hesap oluşturma
Bu sayfa MediaWiki Eylem API'si belgelerinin bir parçasıdır. |
MediaWiki sürümü: | ≥ 1.27 |
API belgesi
Bir hesap oluşturma
Sürecin üç genel adımı vardır:
- API:Authmanagerinfo üzerinden ve API:Tokens üzerinden anahtar alın.
- Alınan anahtar, kullanıcı bilgileri ve diğer alanlarla birlikte bir POST isteği gönderin ve URL'yi API'ye geri gönderin.
- Daha fazla bilgi sağlamak için daha fazla POST talebini içerebilecek olan yanıtla ilgilen.
Örnek 1: Özel kimlik doğrulama uzantıları olmadan bir vikide işlem yap
Özel kimlik doğrulama uzantıları olmayan bir viki oldukça kolay olabilir. Kodunuz hangi alanların gerekli olacağını biliyorsa, aramayı API:Authmanagerinfo olarak atlayabilir ve yalnızca hangi alanların gerekli olacağını varsayabilir (ör. kullanıcı adı, parola & yeniden parola edinmiş, e-posta, muhtemelen gerçek ad).
reason
parametresi ekleyerek bunun için bir neden belirtmeniz gerekir. MediaWiki'nin yeni kullanıcıya e-postayla geçici bir şifre göndermesini sağlamak için mailpassword
yerine password
ve retype
yerine parametreler kullanabilirsiniz.
POST isteği
Yanıt
{
"createaccount": {
"status": "PASS",
"username": "Zane"
}
}
Örnek kod
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 );
} );
} );
Örnek 2: CAPTCHA uzantılı bir vikide işlem yap
İsterseniz, aşağıdaki ilk adımın iki adım olarak gerçekleştirilebileceğini unutmayın: biri API:Authmanagerinfo üzerinden mevcut alanları almak için diğeri ise API:Tokens üzerinde anahtarı almak için.
<span id="First_step:_Fetch_fields_available_from_API:Authmanagerinfo _and_token_from_API:Tokens ">
İlk adım: API:Authmanagerinfo mevcut alanları ve API:Tokens anahtarlarını al
Sonuç |
---|
{
"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+\\"
}
}
}
|
İkinci adım: Bir hesap oluşturma belirteci, kullanıcı bilgileri ve dönüş URL'si ile birlikte bir gönderi isteği gönderin
Sonuç |
---|
{
"createaccount": {
"status": "PASS",
"username": "Zane"
}
}
|
Örnek Kod
Bu kod örneğinin, API:Authmanagerinfo ve API:Tokens isteklerini ayırdığını ve genellikle bir CAPTCHA olacağını ve başka bir komplikasyon olmayacağını varsaydığını unutmayın.
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>
|
Örnek 3: Bir CAPTCHA, bir OpenID uzantısı ve iki faktörlü bir kimlik doğrulama uzantısı etkinleştirilmiş bir vikide hesap oluşturma
<span id="First_step:_Fetch_fields_available_from_API:Authmanagerinfo _and_token_from_API:Tokens ">
İlk adım: API:Authmanagerinfo mevcut alanları ve API:Tokens anahtarları al
API:Authmanagerinfo ve API:Tokens değerinin alınması, önceki örnekte olduğu gibi büyük ölçüde aynıdır ve bu nedenle burada tekrar edilmez. API:Authmanagerinfo tarafından döndürülen isteklerin listesi hem CAPTCHA uzantısı hem de OpenID uzantısı için tanımları içerecektir.
İkinci adım: CAPTCHA'yı cevaplayın ve OpenID kimlik doğrulamasını seçin.
Sonuç |
---|
{
"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"
},
}
}
]
}
}
|
Müşterinin, kullanıcının tarayıcısını sağlanan redirecttarget adresine yönlendirmesi beklenir.
OpenID sağlayıcı kimliğini doğrular ve OpenID cevabını doğrular ve sonra kodunu içeren ilk POST'ta sağlanan createreturnurl'ye yönlendirir ve vikideki Special:OpenIDConnectReturn'e yönlendirir.
İstemci bu noktada sürecin kontrolünü ele geçirir ve bir sonraki API isteğini yapar.
Üçüncü adım: OpenID'den geri dönün.
İstemci, code ve state API'ye geri gönderir. API'nin cevabı, kullanıcının ikinci faktörünü ayarlamasını isteyen iki faktörlü kimlik doğrulama uzantısına sahiptir.
Sonuç |
---|
{
"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"
}
}
}
]
}
}
|
Şimdi müşteri, kullanıcıdan iki faktörlü kimlik doğrulama uygulamasında yeni bir hesap açmasını ve mevcut kodu girmesini ister veya kullanıcının 2FA kurulumunu atlamasına izin verir. Kullanıcının 2FA kurduğunu varsayalım.
Dördüncü adım: İki faktörlü kimlik doğrulamayı ayarlayın.
Sonuç |
---|
{
"createaccount": {
"status": "PASS",
"username": "Alice"
}
}
|
Hesap oluşturma sonunda başarılı oldu.
Herhangi bir noktada hesap oluşturma işlemi başarısız olursa, kullanıcıya göstermesi için message ile birlikte FAIL durumuyla bir yanıt döndürülür.
Olası hatalar
Kod | Bilgi |
---|---|
badtoken | Geçersiz hesap anahtarı oluşturma |
notoken | token parametresi ayarlanmalıdır. |
mustpostparams | Sorgu dizesinde şu parametresi bulundu, ancak POST gövdesinde olması gerekiyor: createtoken. |
missingparam | "createcontinue" ve "createreturnurl" parametrelerden en az biri gerekli. |
authmanager-create-no-primary | Sağlanan kimlik bilgileri hesap oluşturmak için kullanılamadı. |
noemailcreate | Geçerli bir e-posta adresi sağlamalısınız. |
invalidemailaddress | Geçersiz bir biçiminde yazıldığından dolayı bu e-posta adresi kabul edilemez.
Lütfen geçerli bir biçimde e-posta adresi yazın veya bu bölümü boş bırakın. |
badretype | Girdiğiniz parolalar eşleşmiyor. |
userexists | Girdiğiniz kullanıcı adı zaten kullanımda.
Lütfen farklı bir kullanıcı adı seçiniz. |
captcha-createaccount-fail | Hatalı ya da eksik CAPTCHA. |
acct_creation_throttle_hit | Bu viki ziyaretçisini IP adresinizi kullanarak, geçen gün num hesap oluşturmuş ve bu süre içinde izin verilen maksimum tutardır.
Sonuç olarak, bu IP adresini kullanan ziyaretçiler şu anda daha fazla hesap oluşturamaz. Wikimedia projelerine katkıda bulunmanın odak olduğu bir etkinlikte bulunuyorsanız, bu sorunun çözülmesine yardımcı olmak için lütfen IP kapağının geçici olarak kaldırılması istenmesine bakın. |
Ek notlar
- Hesap oluşturmaları Special:log/newusers cinsinden kaydedilir.
Oturum açtıysanız, bir hesap oluştururken kullanıcı adınız da kaydedilecektir.
- Bu sayfada verilen kod parçacıklarını yürütürken, unutmayın:
- Vikide bir hesap oluşturulduktan sonra silinemez.
- Her zaman bitiş noktası olarak
https://test.wikipedia.org/w/api.php
kullanın, böylece üretimde yanlışlıkla hesap oluşturmazsınız.
- MediaWiki site yöneticileri ve uzantı geliştiricileri, yapılandırma dosyasına şu satırı ekleyerek bu API özelliğini devre dışı bırakabilir:
$wgAPIModules['createaccount'] = 'ApiDisabled';