API:Oturum aç
Bu sayfa MediaWiki Eylem API'si belgelerinin bir parçasıdır. |
MediaWiki API, uygulamanızın veya istemcinizin kimliği doğrulanmış kullanıcı kimlik bilgileri sağlamasını ve (a) bilgi sorgulama veya veri değiştirme eylemleri (b) daha yüksek istek başına istek sınırına sahip büyük sorgular yapmak için oturum açmasını gerektirebilir.
Kimlik doğrulamanın iki yöntemi
MediaWiki Eylem API'sinde kimlik doğrulamanın iki yolu vardır:
Yöntem 1. oturum aç
Botlar ve diğer etkileşimli olmayan uygulamalar, daha güvenli olduğu sürece yalnızca sahip OAuth tüketiciler kullanmalıdır.
İstemci için kullanılamıyorsa veya uygulanamıyorsa, bot parolaları ile login
eylemi kullanılabilir.
API belgesi
Örnek
POST isteği
Yanıt
{
"login": {
"lguserid": 21,
"result": "Success",
"lgusername": "William"
}
}
Örnek kod
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
yöntemini kullanın. Oturum açmak ve oturumunuzu açık tutmak, istemcinizin tüm istekler üzerinde doğru HTTP çerez işlemesini gerektirir. Yukarıdaki örnekte, requests.Session()
oturum nesnesinin çerezlerin kalıcı olmasına nasıl yardımcı olduğunu gösteriyoruz.
Olası hatalar
Kod | Bilgi |
---|---|
Failed | Geçersiz kullanıcı adı ve parola. Lütfen tekrar deneyiniz. |
Failed | Unable to continue login. Your session most likely timed out. (or you are not correctly handling cookies). |
WrongToken | Geçersiz anahtar sağlandı |
NeedToken | `lgtoken` sağlanmadı |
Aborted | bot parolaları yerine ana hesap parolasını kullanarak oturum açın |
mustpostparams | Sorgu dizesinde şu parametresi bulundu, ancak POST gövdesinde olması gerekiyor: $1. |
Yöntem 2. kullanıcı oturumu
Web sitesini veya web tabanlı kullanıcı arabirimine erişimi tamamen değiştirmeyi amaçlayan mobil uygulamaları tamamen değiştirmeyi amaçlamadan hizmet sağlayan özel editörler veya devriye uygulamaları gibi etkileşimli uygulamalar clientlogin
eylemini kullanmalıdır.
Bununla birlikte, aracın kimliğini doğrulamak için mevcutsa, daha kolay ve daha güvenli olduğu için OAuth kullanmayı tercih etmelisiniz.
Bu modül MediaWiki 1.27'den beri mevcuttur.
API belgesi
Örnek 1: Özel kimlik doğrulama uzantıları olmayan bir viki için işlem
POST isteği
Yukarıdaki istekte API:Tokens ile anahtar oturumu alın.
Yanıt
{
"clientlogin":{
"status":"PASS",
"username":"William"
}
}
Örnek kod
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>
|
Örnek 2: Özel kimlik doğrulama uzantılarına sahip bir viki işlemi
ConfirmEdit (captcha), OpenID Connect , OATHAuth (iki faktörlü kimlik doğrulama) gibi özel kimlik doğrulama uzantılarına sahip bir vikinin daha karmaşık bir kimlik doğrulama işlemi olabilir. Bu durumda, açıklaması API:Authmanagerinfo sorgusundan alınabilecek belirli alanlar da gerekli olabilir.
Adım 1: Captcha'ya cevap verin ve OpenID kimlik doğrulamasını seçin
This documentation is an example and does not reflect the behavior of any specific currently-available OpenID extension.
redirecttarget
yönlendirmesi beklenir. OpenID sağlayıcı kimlik doğrulaması yapar ve vikide OpenID yanıtını doğrular ve daha sonra code
ve state
parametreleri eklendi. İstemci bu noktada sürecin kontrolünü ele geçirir ve bir sonraki API isteğini yapar.Yanıt |
---|
{
"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"
},
}
}
]
}
}
|
Adım 2: OpenID'den geri
Yanıt |
---|
{
"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"
}
}
}
]
}
}
|
3. Adım: İki faktörlü kimlik doğrulama
RESTART
yanıtı almak mümkündür; örneğin, OpenID Connect uzantısında herhangi bir yerel kullanıcı için OpenID hesabı için eşleme yoksa. Bu durumda, istemci oturum açma işlemini baştan başlatabilir veya bazı durumlarda korumak için loginpreservestate veya createpreservestate parametresini geçerek hesap oluşturmaya geçebilir. 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.Yanıt |
---|
{
"clientlogin": {
"status": "PASS",
"username": "Alice"
}
}
|
Ek notlar
- Anonim düzenlemeye izin veren vikilerde, giriş yapmadan API aracılığıyla düzenleme yapmak mümkündür, ancak oturum açmanıza önemle tavsiye edilir. Özel vikilerde, herhangi bir API işlevini kullanmak için oturum açmak gerekir.
- Uygulamanız için ayrı bir kullanıcı hesabı oluşturmanız önerilir. Bu, uygulamanız otomatik düzenleme veya büyük veya performans açısından yoğun sorgular yürütüyorsa özellikle önemlidir. Bununla, uygulama tarafından yapılan değişiklikleri izlemek ve uygulamanın hesabına özel haklar uygulamak kolaydır. 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.
- Oturum açmış bir kullanıcı tarafından yapılması gereken bir istek gönderiyorsanız, kullanıcının oturum açıp açmadığını kontrol etmek için gönderdiğiniz talebe
assert=user
parametresi ekleyin. Kullanıcı oturum açmamışsa,assertuserfailed
hata kodu döndürülür. See API:Assert for details. - Bir hesabın bot haklarına sahip olup olmadığını kontrol etmek için, isteğe
assert=bot
parametresi ekleyin. Hesabın bot hakları yoksa,assertbotfailed
hata kodu döndürülür. See API:Assert for details.
Ayrıca bakınız
- API:Oturumu kapat
- API:Userinfo - Oturum açmış olan kullanıcı hakkındaki bilgileri döndürür
- Interactive login with action=clientlogin in mwapi