API:Přihlášení

From mediawiki.org
This page is a translated version of the page API:Login and the translation is 100% complete.

MediaWiki API může vyžadovat, aby vaše aplikace nebo klient poskytla ověřené uživatelské přihlašovací údaje a přihlášení pro (a) dotazování na informace nebo akce upravující data (b) provádění velkých dotazů s vyšším limitem požadavku na jeden.

Dvě metody ověření

Existují dva způsoby, jak se ověřit v MediaWiki Action API: pomocí action=login nebo action=clientlogin.

1. metoda action=login

Boti a další neinteraktivní aplikace by měly používat, pokud jsou k dispozici, zákazníky OAuth pouze pro vlastníka protože je to bezpečnější. Pokud není k dispozici nebo se na klienta nevztahuje, lze akci login použít s hesly robotů.

Dokumentace API


action=login (lg)

(main | login)
  • This module requires write rights.
  • 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.

Specific parameters:
Other general parameters are available.
lgname

Username.

lgpassword

Password.

lgdomain

Domain (optional).

lgtoken

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

Příklad

Požadavek POST


lgtoken ve výše uvedeném požadavku se získá z API: Tokeny

Odpověď

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

Ukázkový kód

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'
Od MediaWiki 1.27 není použití hlavního účtu pro přihlášení podporováno. Získejte přihlašovací údaje prostřednictvím Special:BotPasswords nebo použijte metodu clientlogin. Přihlášení a setrvání v přihlášení vyžaduje správné zpracování HTTP cookie vaším klientem při všech požadavcích. Ve výše uvedeném příkladu Pythonu ukazujeme, jak objekt relace requests.Session() pomáhá udržovat soubory cookie.

Možné chyby

Kód Popis
Failed Zadali jste nesprávné uživatelské jméno nebo heslo. Prosím zkuste to znovu.
Failed Nelze pokračovat v přihlášení. Vaše relace s největší pravděpodobností vypršela. (nebo správně nezacházíte s cookies).
WrongToken Byl poskytnut neplatný token
NeedToken `lgtoken` nebyl poskytnut
Aborted přihlásit se pomocí hesla hlavního účtu namísto hesla botu
mustpostparams The following parameters were found in the query string, but must be in the POST body: $1.

2. metoda action=clientlogin

Interaktivní aplikace, jako jsou vlastní editory nebo hlídací aplikace, které poskytují službu, aniž by měly v úmyslu plně nahradit webovou stránku, nebo mobilní aplikace, jejichž cílem je zcela nahradit přístup k webovému uživatelskému rozhraní, by měly používat akci clientlogin. Měli byste však preferovat použití OAuth , pokud je k dispozici pro ověření nástroje, protože je jednodušší a bezpečnější. Tento modul je dostupný od MediaWiki 1.27.

Dokumentace API


action=clientlogin (login)

(main | clientlogin)
  • This module requires write rights.
  • 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.
Specific parameters:
Other general parameters are available.
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 clients that are allowed higher limits).
loginmessageformat

Format to use for returning messages.

One of the following values: html, none, raw, wikitext
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]

Příklad 21: Proces pro wiki bez speciálních autentizačních rozšíření

Požadavek POST


Získejte přihlašovací token ve výše uvedené žádosti prostřednictvím API: Tokeny .

Odpověď

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

Ukázkový kód

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>

Příklad 22: Proces pro wiki se speciálními autentizačními rozšířeními

Wiki se speciálními autentizačními rozšířeními, jako je Rozšíření:ConfirmEdit (captchas), OpenID Connect , OATHAuth (dvoufaktorové ověřování), může mít složitější proces ověřování. V takovém případě mohou být také vyžadována specifická pole, jejichž popis lze získat z dotazu API:Authmanagerinfo .

Krok 1: Odpovězte na Captcha a vyberte autentizaci OpenID

Tato dokumentace je příkladem a neodráží chování žádného konkrétního aktuálně dostupného rozšíření OpenID.


Očekává se, že klient přesměruje prohlížeč uživatele na zadaný redirecttarget. Poskytovatel OpenID by se ověřil a přesměroval na Special:OpenIDConnectReturn na wiki, což by ověřilo odpověď OpenID a poté by přesměrovalo na loginreturnurl poskytnuté v prvním POST do API s přidanými parametry code a state. Klient získá kontrolu nad procesem zpět v tomto okamžiku a provede svůj další požadavek API.
Odpověď
{
    "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"
                    },
                }
            }
        ]
    }
}
Nyní musí klient požádat uživatele, aby zkontroloval svou aplikaci dvoufaktorového ověřování na aktuální kód a odeslal jej zpět na server, aby mohl pokračovat v procesu ověřování.
Odpověď
{
    "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"
                    }
                }
            }
        ]
    }
}
V určitých případech je možné obdržet odpověď RESTART, například pokud rozšíření OpenID Connect nemělo žádné mapování pro účet OpenID na žádného místního uživatele. V tomto případě může klient restartovat proces přihlášení od začátku nebo může přejít na vytvoření účtu, v obou případech předáním parametru loginpreservestate nebo createpreservestate, aby se zachoval určitý stav.
Odpověď
{
    "clientlogin": {
        "status": "PASS",
        "username": "Alice"
    }
}

Další poznámky

  • Na wikinách, které umožňují anonymní úpravy, je možné upravovat prostřednictvím API bez přihlášení, ale důrazně doporučujeme, abyste se přihlásili. Na soukromých wikinách je pro použití jakékoli funkce API vyžadováno přihlášení.
  • Pro vaši aplikaci se doporučuje vytvořit samostatný uživatelský účet. To je zvláště důležité, pokud vaše aplikace provádí automatické úpravy nebo vyvolává velké nebo výkonově náročné dotazy. Díky tomu je snadné sledovat změny provedené aplikací a uplatňovat speciální práva na účet aplikace.
  • Pokud posíláte požadavek, který by měl podat přihlášený uživatel, přidejte k odesílanému požadavku parametr assert=user, abyste zkontrolovali, zda je uživatel přihlášen. Pokud uživatel není přihlášen, bude vrácen kód chyby assertuserfailed. Další podrobnosti najdete na stránce API:Ověření .
  • Chcete-li zkontrolovat, zda má účet práva robota, přidejte do požadavku parametr assert=bot. Pokud účet nemá práva robota, bude vrácen kód chyby assertbotfailed. Podrobnosti najdete na stránce API:Ověření .

Související odkazy