跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
默认wiki名称
搜索
搜索
创建账号
登录
个人工具
创建账号
登录
查看“This is bot title v2”的源代码
页面
讨论
简体中文
阅读
查看源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
查看源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
←
This is bot title v2
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于这些用户组的用户执行:
用户
、
管理员
您可以查看和复制此页面的源代码。
[[#bodyContent|Jump to content]] <div class="vector-header-container"> <div class="vector-header mw-header"> <div class="vector-header-start"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right"> <span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Main menu</span> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" feature-name="main-menu-pinned" pinnable-element-id="vector-main-menu" pinned-container-id="vector-main-menu-pinned-container" unpinned-container-id="vector-main-menu-unpinned-container" saved-pinned-state="false"> <div class="vector-pinnable-header-label"> Main menu </div> move to sidebar hide </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation"> <div class="vector-menu-heading"> Navigation </div> <div class="vector-menu-content"> * <span id="n-mainpage-description">[[wiki/MediaWiki|<span>Main page</span>]]</span> * <span id="n-mw-download">[[wiki/Download|<span>Get MediaWiki</span>]]</span> * <span id="n-mw-extensions">[[wiki/Special:MyLanguage/Category:Extensions|<span>Get extensions</span>]]</span> * <span id="n-blog-text">[https://techblog.wikimedia.org/ <span>Tech blog</span>]</span> * <span id="n-mw-contribute">[[wiki/Special:MyLanguage/How_to_contribute|<span>Contribute</span>]]</span> </div> </div> <div id="p-support" class="vector-menu mw-portlet mw-portlet-support"> <div class="vector-menu-heading"> Support </div> <div class="vector-menu-content"> * <span id="n-help">[[wiki/Special:MyLanguage/Help:Contents|<span>User help</span>]]</span> * <span id="n-mw-faq">[[wiki/Special:MyLanguage/Manual:FAQ|<span>FAQ</span>]]</span> * <span id="n-mw-manual">[[wiki/Special:MyLanguage/Manual:Contents|<span>Technical manual</span>]]</span> * <span id="n-mw-supportdesk">[[wiki/Project:Support_desk|<span>Support desk</span>]]</span> * <span id="n-mw-communication">[[wiki/Special:MyLanguage/Communication|<span>Communication</span>]]</span> </div> </div> <div id="p-development" class="vector-menu mw-portlet mw-portlet-development"> <div class="vector-menu-heading"> Development </div> <div class="vector-menu-content"> * <span id="n-mw-developerportal">[https://developer.wikimedia.org/ <span>Developer portal</span>]</span> * <span id="n-svn-statistics">[[wiki/Development_statistics|<span>Code statistics</span>]]</span> </div> </div> <div id="p-mediawiki.org" class="vector-menu mw-portlet mw-portlet-mediawiki_org"> <div class="vector-menu-heading"> mediawiki.org </div> <div class="vector-menu-content"> * <span id="n-portal">[[wiki/Project:Help|<span>Community portal</span>]]</span> * <span id="n-recentchanges">[[wiki/Special:RecentChanges|<span>Recent changes</span>]]</span> * <span id="n-mw-translate">[[wiki/Special:LanguageStats|<span>Translate content</span>]]</span> * <span id="n-randompage">[[wiki/Special:Random|<span>Random page</span>]]</span> * <span id="n-mw-discussion">[[wiki/Project:Village_Pump|<span>Village pump</span>]]</span> * <span id="n-Sandboxlink-portlet-label">[[wiki/Project:Sandbox|<span>Sandbox</span>]]</span> </div> </div> <div id="p-lang" class="vector-menu mw-portlet mw-portlet-lang"> <div class="vector-menu-heading"> In other languages </div> <div class="vector-menu-content"> <div class="after-portlet after-portlet-lang"> <span class="wb-langlinks-add wb-langlinks-link">[https://www.wikidata.org/wiki/Special:NewItem?site=mediawikiwiki&page=OAuth%2FOwner-only+consumers Add links]</span> </div> </div> </div> </div> </div> </div> </div> [[wiki/MediaWiki|[[File:/static/images/icons/mediawikiwiki.svg|50x50px|class=mw-logo-icon]] <span class="mw-logo-container skin-invert"> [[File:/static/images/mobile/copyright/mediawikiwiki-wordmark.svg|class=mw-logo-wordmark|MediaWiki]] </span>]] </div> <div class="vector-header-end"> <div id="p-search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box" role="search"> [[wiki/Special:Search|<span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Search</span>]] <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> </div> Search </div> </div> </div> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet"> <div class="vector-menu-content"> * <span id="ca-uls">[[#|<span class="vector-icon mw-ui-icon-wikimedia-language mw-ui-icon-wikimedia-wikimedia-language"></span> <span>English</span>]]</span> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet"> <div class="vector-menu-content"> </div> </div> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet"> <div class="vector-menu-content"> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet"> <div class="vector-menu-content"> * <span id="pt-createaccount-2">[[w/index.php?title=Special:CreateAccount&returnto=OAuth%2FOwner-only+consumers|<span>Create account</span>]]</span> * <span id="pt-login-2">[[w/index.php?title=Special:UserLogin&returnto=OAuth%2FOwner-only+consumers|<span>Log in</span>]]</span> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="More options"> <span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Personal tools</span> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="User menu"> <div class="vector-menu-content"> * <span id="pt-createaccount">[[w/index.php?title=Special:CreateAccount&returnto=OAuth%2FOwner-only+consumers|<span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Create account</span>]]</span> * <span id="pt-login">[[w/index.php?title=Special:UserLogin&returnto=OAuth%2FOwner-only+consumers|<span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Log in</span>]]</span> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor"> <div class="vector-menu-heading"> Pages for logged out editors [[wiki/Help:Introduction|<span>learn more</span>]] </div> <div class="vector-menu-content"> * <span id="pt-anoncontribs">[[wiki/Special:MyContributions|<span>Contributions</span>]]</span> * <span id="pt-anontalk">[[wiki/Special:MyTalk|<span>Talk</span>]]</span> </div> </div> </div> </div> </div> </div> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice" class="notheme"> <div id="centralNotice"> </div> </div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </div> </div> <div class="vector-sticky-pinned-container"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" feature-name="toc-pinned" pinnable-element-id="vector-toc"> <span id="contents"></span> == Contents == move to sidebar hide </div> <ul> <li><span id="toc-mw-content-text">[[#|]]</span> <div class="vector-toc-text"> Beginning </div></li> <li><span id="toc-OAuth_2">[[#OAuth_2|]]</span> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>OAuth 2</span> </div> <ul> </ul> </li> <li><span id="toc-OAuth_1">[[#OAuth_1|]]</span> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>OAuth 1</span> </div> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle OAuth 1 subsection</span> <ul> <li><span id="toc-PHP">[[#PHP|]]</span> <div class="vector-toc-text"> <span class="vector-toc-numb">2.1</span> <span>PHP</span> </div> <ul> </ul> </li> <li><span id="toc-Python">[[#Python|]]</span> <div class="vector-toc-text"> <span class="vector-toc-numb">2.2</span> <span>Python</span> </div> <ul> </ul> </li> <li><span id="toc-Perl">[[#Perl|]]</span> <div class="vector-toc-text"> <span class="vector-toc-numb">2.3</span> <span>Perl</span> </div> <ul> </ul> </li></ul> </li> <li><span id="toc-Awk_/_shell">[[#Awk_/_shell|]]</span> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>Awk / shell</span> </div> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Awk / shell subsection</span> <ul> <li><span id="toc-Java">[[#Java|]]</span> <div class="vector-toc-text"> <span class="vector-toc-numb">3.1</span> <span>Java</span> </div> <ul> </ul> </li> <li><span id="toc-Algorithm">[[#Algorithm|]]</span> <div class="vector-toc-text"> <span class="vector-toc-numb">3.2</span> <span>Algorithm</span> </div> <ul> </ul> </li></ul> </li> <li><span id="toc-See_also">[[#See_also|]]</span> <div class="vector-toc-text"> <span class="vector-toc-numb">4</span> <span>See also</span> </div> <ul> </ul> </li></ul> </div> </div> </div> </div> <div class="mw-content-container"> <div id="content" class="mw-body" role="main"> <div class="mw-body-header vector-page-titlebar"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left"> <span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Toggle the table of contents</span> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> <span id="firstHeading"></span> = <span class="mw-page-title-main">OAuth/Owner-only consumers</span> = <div class="mw-indicators"> </div> </div> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages"> <div class="vector-menu-content"> * <span id="ca-nstab-main">[[wiki/OAuth/Owner-only_consumers|<span>Page</span>]]</span> * <span id="ca-talk">[[wiki/Talk:OAuth/Owner-only_consumers|<span>Discussion</span>]]</span> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet"> <span class="vector-dropdown-label-text">English</span> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet"> <div class="vector-menu-content"> </div> </div> </div> </div> </div> <div id="right-navigation" class="vector-collapsible"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views"> <div class="vector-menu-content"> * <span id="ca-view">[[wiki/OAuth/Owner-only_consumers|<span>Read</span>]]</span> * <span id="ca-viewsource">[[w/index.php?title=OAuth/Owner-only_consumers&action=edit|<span>View source</span>]]</span> * <span id="ca-history">[[w/index.php?title=OAuth/Owner-only_consumers&action=history|<span>View history</span>]]</span> </div> </div> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown"> <span class="vector-dropdown-label-text">Tools</span> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" feature-name="page-tools-pinned" pinnable-element-id="vector-page-tools" pinned-container-id="vector-page-tools-pinned-container" unpinned-container-id="vector-page-tools-unpinned-container" saved-pinned-state="false"> <div class="vector-pinnable-header-label"> Tools </div> move to sidebar hide </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="More options"> <div class="vector-menu-heading"> Actions </div> <div class="vector-menu-content"> * <span id="ca-more-view">[[wiki/OAuth/Owner-only_consumers|<span>Read</span>]]</span> * <span id="ca-more-viewsource">[[w/index.php?title=OAuth/Owner-only_consumers&action=edit|<span>View source</span>]]</span> * <span id="ca-more-history">[[w/index.php?title=OAuth/Owner-only_consumers&action=history|<span>View history</span>]]</span> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb"> <div class="vector-menu-heading"> General </div> <div class="vector-menu-content"> * <span id="t-whatlinkshere">[[wiki/Special:WhatLinksHere/OAuth/Owner-only_consumers|<span>What links here</span>]]</span> * <span id="t-recentchangeslinked">[[wiki/Special:RecentChangesLinked/OAuth/Owner-only_consumers|<span>Related changes</span>]]</span> * <span id="t-upload">[[/commons.wikimedia.org/wiki/Special:UploadWizard|<span>Upload file</span>]]</span> * <span id="t-specialpages">[[wiki/Special:SpecialPages|<span>Special pages</span>]]</span> * <span id="t-permalink">[https://www.mediawiki.org/w/index.php?title=OAuth/Owner-only_consumers&oldid=6500389 <span>Permanent link</span>]</span> * <span id="t-info">[[w/index.php?title=OAuth/Owner-only_consumers&action=info|<span>Page information</span>]]</span> * <span id="t-cite">[[w/index.php?title=Special:CiteThisPage&page=OAuth%2FOwner-only_consumers&id=6500389&wpFormIdentifier=titleform|<span>Cite this page</span>]]</span> * <span id="t-urlshortener">[[w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fwww.mediawiki.org%2Fwiki%2FOAuth%2FOwner-only_consumers|<span>Get shortened URL</span>]]</span> * <span id="t-urlshortener-qrcode">[[w/index.php?title=Special:QrCode&url=https%3A%2F%2Fwww.mediawiki.org%2Fwiki%2FOAuth%2FOwner-only_consumers|<span>Download QR code</span>]]</span> </div> </div> <div id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export"> <div class="vector-menu-heading"> Print/export </div> <div class="vector-menu-content"> * <span id="coll-create_a_book">[[w/index.php?title=Special:Book&bookcmd=book_creator&referer=OAuth%2FOwner-only+consumers|<span>Create a book</span>]]</span> * <span id="coll-download-as-rl">[[w/index.php?title=Special:DownloadAsPdf&page=OAuth%2FOwner-only_consumers&action=show-download-screen|<span>Download as PDF</span>]]</span> * <span id="t-print">[[w/index.php?title=OAuth/Owner-only_consumers&printable=yes|<span>Printable version</span>]]</span> </div> </div> </div> </div> </div> </div> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </div> </div> <div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" mw-ve-target-container=""> <div class="vector-body-before-content"> <div id="siteSub" class="noprint"> From mediawiki.org </div> </div> <div id="contentSub"> <div id="mw-content-subtitle"> <div class="subpages"> < [[wiki/Special:MyLanguage/OAuth|OAuth]] </div> </div> </div> <div id="mw-content-text" class="mw-body-content"> <div class="mw-pt-translate-header noprint nomobile" dir="ltr" lang="en"> [[w/index.php?title=Special:Translate&group=page-OAuth%2FOwner-only+consumers&action=page&filter=|Translate this page]] </div> <div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"> <div class="mw-pt-languages noprint navigation-not-searchable" lang="en" dir="ltr"> <div class="mw-pt-languages-label"> Languages: </div> * [[wiki/OAuth/Owner-only_consumers/en-gb|British English]] * <span class="mw-pt-languages-ui mw-pt-languages-selected mw-pt-progress mw-pt-progress--complete" lang="en" dir="ltr">English</span> * [[wiki/OAuth/Owner-only_consumers/ru|русский]] </div> Owner-only consumers are a method to use OAuth for authentication and permission control while avoiding most of the complexity of the OAuth protocol (which is in the grant authorization process). It's meant for bots and similar tools which always authenticate with the same user account. To use it, the target wiki must have version 1.27 or higher of the [[wiki/Special:MyLanguage/Extension:OAuth|Extension:OAuth]]<span style="display:none"> [[wiki/Extension:OAuth|wiki/Extension:OAuth]] </span> installed. <div class="mw-heading mw-heading2 ext-discussiontools-init-section"> <span id="oauth-2"></span> == <span id="OAuth_2" class="mw-headline"><span id="h-OAuth_2" mw-comment-start=""></span>OAuth 2<span mw-comment-end="h-OAuth_2"></span></span> == </div> Using an owner-only app in OAuth 2 is very simple. Just register the app via <code>Special:OAuthConsumerRegistration/propose</code> (make sure to set the protocol version to 2.0) with the option "owner-only" checked. (In case of a wikifarm, the special page is only available on the central wiki of the farm. In case of Wikimedia, it's at [https://meta.wikimedia.org/wiki/Special:OAuthConsumerRegistration/propose/oauth2?wpownerOnly=1 meta:Special:OAuthConsumerRegistration/propose].) Then, record the access token that's shown when submitting the form, and sign your API requests by adding the HTTP header <code>Authorization: Bearer <access token></code>. <div class="mw-heading mw-heading2 ext-discussiontools-init-section"> <span id="oauth-1"></span> == <span id="OAuth_1" class="mw-headline"><span id="h-OAuth_1" mw-comment-start=""></span>OAuth 1<span mw-comment-end="h-OAuth_1"></span></span> == </div> To work as an owner-only consumer, the application must take four strings as configuration settings: the consumer key, the consumer secret, the access token and the access secret. The user can obtain those via <code>Special:OAuthConsumerRegistration/propose</code>. The option "owner-only" has to be checked. (In case of a wikifarm, the special page is only available on the central wiki of the farm. In case of Wikimedia, it's at [https://meta.wikimedia.org/wiki/Special:OAuthConsumerRegistration/propose/oauth1a%3FwpownerOnly%3D1 meta:Special:OAuthConsumerRegistration/propose].) The application can then authenticate API requests by adding an <code>Authorization</code> header which is computed from those parameters as defined in the [http://oauth.net/core/1.0a/#auth_header OAuth 1.0a standard]; libraries exist [http://oauth.net/code/ in many languages] to help with this. Some libraries call this the two-legged OAuth 1.0 protocol. [https://github.com/Kong/mashape-oauth/blob/master/FLOWS.md The OAuth Bible] more correctly calls it one-legged. Some sources call the consumer key a "client ID", the consumer secret a "client secret", the access token just a "token", and the access secret a "token secret". The code snippets below assume the application uses a shared secret (HMAC-SHA1) for signing (i.e., the RSA field was left empty at registration). <span id="php"></span> === <span id="PHP" class="mw-headline"><span id="h-PHP-OAuth_1" mw-comment-start=""></span>PHP<span mw-comment-end="h-PHP-OAuth_1"></span></span> === Using [[wiki/Special:MyLanguage/oauthclient-php|Oauthclient-php]]<span style="display:none"> [[wiki/Oauthclient-php|wiki/Oauthclient-php]] </span>: <div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"> <pre>use MediaWiki\OAuthClient\Consumer; use MediaWiki\OAuthClient\Token; use MediaWiki\OAuthClient\Request; use MediaWiki\OAuthClient\SignatureMethod\HmacSha1; $consumer = new Consumer( $consumerKey, $consumerSecret ); $accessToken = new Token( $accessToken, $accessSecret ); $request = Request::fromConsumerAndToken( $consumer, $accessToken, 'GET', 'https://en.wikipedia.org/w/api.php', $apiParams ); $request->signRequest( new HmacSha1(), $consumer, $accessToken ); $authorizationHeader = $request->toHeader(); // Then use this header on a request, for example: $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_URL => 'https://en.wikipedia.org/w/api.php', CURLOPT_USERAGENT => 'My_bot', CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($apiParams), CURLOPT_HTTPHEADER => [$authenticationHeader], ]); $result = curl_exec($ch); </pre> </div> Using [https://php.net/book.oauth the PECL package]: <div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"> <pre>$oauth = new OAuth( $consumerKey, $consumerSecret ); $oauth->setToken( $accessToken, $accessSecret ); // Generate a header, perhaps to be sent via a CURL object: $authorizationHeader = 'Authorization: ' . $oauth->getRequestHeader( 'GET', 'https://en.wikipedia.org/w/api.php', $apiParams ); // Or simply fetch a page directly: $oauth->fetch('https://en.wikipedia.org/w/api.php', $apiParams); </pre> </div> <span id="python"></span> === <span id="Python" class="mw-headline"><span id="h-Python-OAuth_1" mw-comment-start=""></span>Python<span mw-comment-end="h-Python-OAuth_1"></span></span> === Using [https://requests-oauthlib.readthedocs.org/en/latest/ requests_oauthlib]: <div class="mw-highlight mw-highlight-lang-python mw-content-ltr" dir="ltr"> <pre>import requests from requests_oauthlib import OAuth1 auth = OAuth1(consumer_key, consumer_secret, access_token, access_secret) requests.post(url='https://en.wikipedia.org/w/api.php', data=data, auth=auth) </pre> </div> <span id="perl"></span> === <span id="Perl" class="mw-headline"><span id="h-Perl-OAuth_1" mw-comment-start=""></span>Perl<span mw-comment-end="h-Perl-OAuth_1"></span></span> === Using [https://metacpan.org/release/Net-OAuth Net::OAuth]: <div class="mw-highlight mw-highlight-lang-perl mw-content-ltr" dir="ltr"> <pre>use Net::OAuth; my $request = Net::OAuth->request( 'protected resource' )->new( request_method => 'POST', request_url => 'https://en.wikipedia.org/w/api.php', consumer_key => $consumer_key, consumer_secret => $consumer_secret, token => $access_token, token_secret => $access_secret, signature_method => 'HMAC-SHA1', timestamp => time(), nonce => $nonce, # Only if using GET or POST as application/x-www-form-urlencoded, # omit extra_params if POSTing as multipart/form-data. extra_params => \%params, ); $request->sign(); my $authorizationHeader = $request->to_authorization_header(); </pre> </div> To generate the nonce, you could just do something like <span class="nb"><code>int</code></span><span class="p"><code>(</code></span><span class="w"><code> </code></span><span class="nb"><code>rand</code></span><span class="p"><code>(</code></span><span class="w"><code> </code></span><span class="mi"><code>2</code></span><span class="o"><code>**</code></span><span class="mi"><code>32</code></span><span class="w"><code> </code></span><span class="p"><code>)</code></span><span class="w"><code> </code></span><span class="p"><code>)</code></span>, but using a random number generator such as [https://metacpan.org/release/Bytes-Random-Secure/ Bytes::Random::Secure] would be more secure: <div class="mw-highlight mw-highlight-lang-perl mw-content-ltr" dir="ltr"> <pre>use Bytes::Random::Secure (); # This object may be kept and reused for the lifetime of the program my $rand = Bytes::Random::Secure->new( NonBlocking => 1 ); # This generates the nonce, and replaces some characters with safer ones. my $nonce = $rand->bytes_base64( 15 ); $nonce =~ tr!+/\n!-_!; </pre> </div> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"> <span id="awk-shell"></span> == <span id="Awk_.2F_shell"></span><span id="Awk_/_shell" class="mw-headline"><span id="h-Awk_/_shell" mw-comment-start=""></span>Awk / shell<span mw-comment-end="h-Awk_/_shell"></span></span> == </div> Using GNU Awk and openssl. Function library in [https://github.com/greencardamom/Wikiget Wikiget]. <div class="mw-highlight mw-highlight-lang-awk mw-content-ltr" dir="ltr"> <pre># # MWOAuthGenerateHeader() - MediaWiki Generate OAuth Header # # Credit: translation of PHP script https://www.mediawiki.org/wiki/OAuth/Owner-only_consumers#Algorithm # function MWOAuthGenerateHeader(consumerKey, consumerSecret, accessKey, accessSecret, url, method, data, nonce,headerParams,dataArr,allParams,allParamsJoined,k,i,j,url2, signatureBaseParts,signatureBaseString,hmac,header,save_sorted) { # sort associative arrays by index string ascending (lexicographic order) PROCINFO["sorted_in"] = "@ind_str_asc" nonce = strip(splitx(sys2varPipe(systime() randomnumber(1000000), "openssl md5"), "= ", 2)) asplit(headerParams, "oauth_consumer_key=" consumerKey " oauth_token=" accessKey " oauth_signature_method=HMAC-SHA1 oauth_timestamp=" systime() " oauth_nonce=" nonce " oauth_version=1.0") asplit(dataArr, data, "=", "&") concatarray(headerParams,dataArr,allParams) for (k in allParams) allParamsJoined[i++] = k "=" allParams[k] url2 = urlElement(url, "scheme") "://" tolower(urlElement(url, "netloc")) urlElement(url, "path") asplit(signatureBaseParts, "0=" toupper(method) " 1=" url " 2=" join(allParamsJoined, 0, length(allParamsJoined) - 1, "&")) signatureBaseString = urlencodeawk(signatureBaseParts[0], "rawphp") "&" urlencodeawk(signatureBaseParts[1], "rawphp") "&" urlencodeawk(signatureBaseParts[2], "rawphp") hmac = sys2varPipe(signatureBaseString, "openssl sha1 -hmac " shquote(urlencodeawk(consumerSecret, "rawphp") "&" urlencodeawk(accessSecret, "rawphp")) " -binary") headerParams["oauth_signature"] = strip(sys2varPipe(hmac, "openssl base64") ) for (k in headerParams) header[j++] = urlencodeawk(k, "rawphp") "=" urlencodeawk(headerParams[k], "rawphp") return sprintf("%s", "Authorization: OAuth " join(header, 0, length(header) - 1, ", ")) } </pre> </div> <span id="java"></span> === <span id="Java" class="mw-headline"><span id="h-Java-Awk_/_shell" mw-comment-start=""></span>Java<span mw-comment-end="h-Java-Awk_/_shell"></span></span> === Using [https://github.com/scribejava/scribejava/blob/master/scribejava-apis/src/test/java/com/github/scribejava/apis/examples/MediaWikiExample.java ScribeJava]: <div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"> <pre>import java.io.*; import java.net.*; import java.nio.charset.*; import java.util.*; import com.github.scribejava.apis.MediaWikiApi; import com.github.scribejava.core.builder.*; import com.github.scribejava.core.model.*; import com.github.scribejava.core.oauth.*; public class MediaWikiOAuth1 { private URL apiUrl = new URL("https://commons.wikimedia.org/w/api.php"); private String consumerToken = ""; private String consumerSecret = ""; private String accessToken = ""; private String accessSecret = ""; private String userAgent = ""; // https://meta.wikimedia.org/wiki/User-Agent_policy private OAuth1AccessToken oAuthAccessToken; private OAuth10aService oAuthService; private String csrfToken; public MediaWikiOAuth1() throws IOException { oAuthService = new ServiceBuilder(consumerToken).apiSecret(consumerSecret).build(MediaWikiApi.instance()); oAuthAccessToken = new OAuth1AccessToken(accessToken, accessSecret); // Check authentication System.out.println(queryUserInfo()); // Fetch CSRF token, mandatory for upload using the MediaWiki API System.out.println(queryTokens()); csrfToken = ""; // should be extracted from above JSON response // Upload a file using the CSRF token System.out.println(upload("wikicode", "filename.jpg", new URL("http://server/filename.jpg"))); } public String queryTokens() throws IOException { return apiHttpGet("?action=query&meta=tokens"); } public String queryUserInfo() throws IOException { return apiHttpGet("?action=query&meta=userinfo&uiprop=blockinfo|groups|rights|ratelimits"); } private String apiHttpGet(String path) throws IOException { return httpGet(apiUrl.toExternalForm() + path + "&format=json"); } private String apiHttpPost(Map<String, String> params) throws IOException { return httpPost(apiUrl.toExternalForm(), params); } private String httpGet(String url) throws IOException { return httpCall(Verb.GET, url, Collections.emptyMap(), Collections.emptyMap()); } private String httpPost(String url, Map<String, String> params) throws IOException { return httpCall(Verb.POST, url, Map.of("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"), params); } private String httpCall(Verb verb, String url, Map<String, String> headers, Map<String, String> params) throws IOException { OAuthRequest request = new OAuthRequest(verb, url); request.setCharset(StandardCharsets.UTF_8.name()); params.forEach(request::addParameter); headers.forEach(request::addHeader); request.addHeader("User-Agent", userAgent); oAuthService.signRequest(oAuthAccessToken, request); try { return oAuthService.execute(request).getBody(); } catch (InterruptedException | ExecutionException e) { throw new IOException(e); } } public String upload(String wikiCode, String filename, URL url) throws IOException { String apiResponse = apiHttpPost(Map.of( "action", "upload", "comment", "", "format", "json", "filename", filename, "ignorewarnings", "1", "text", wikiCode, "token", csrfToken, "url", url.toExternalForm())); if (!apiResponse.contains("success")) { throw new IllegalArgumentException(apiResponse); } return apiResponse; } } </pre> </div> <span id="algorithm"></span> === <span id="Algorithm" class="mw-headline"><span id="h-Algorithm-Awk_/_shell" mw-comment-start=""></span>Algorithm<span mw-comment-end="h-Algorithm-Awk_/_shell"></span></span> === <pre> Authorization: OAuth oauth_consumer_key="<consumer key>", oauth_token="<access token>", oauth_signature_method="HMAC-SHA1", oauth_signature="<base64(HMAC_SHA1(key="<consumer secret>&<token secret>", text="<signature base string>"))>", oauth_timestamp="<current time as unix timestamp>", oauth_nonce="<a long random string>", oauth_version="1.0" </pre> where <code><signature base string></code> is the urlencoded, <code>&</code>-concatenated list of the request method, the request endpoint (ie. the full URL to <code>api.php</code>), and all the parameters of the request (GET, POST, and Authorization header, except <code>oauth_signature</code> itself) in lexicographic order. For example, computing the header in PHP would look like this (cutting some corners such as nested parameter handling): <div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"> <pre>function oauthHeader( $consumerKey, $consumerSecret, $accessToken, $accessSecret, $method, $url, $data ) { $headerParams = [ 'oauth_consumer_key' => $consumerKey, 'oauth_token' => $accessToken, 'oauth_signature_method' => 'HMAC-SHA1', 'oauth_timestamp' => time(), 'oauth_nonce' => md5( microtime() . mt_rand() ), 'oauth_version' => '1.0', ]; $allParams = array_merge( $headerParams, $data ); uksort( $allParams, 'strcmp' ); $allParamsJoined = array(); foreach ( $allParams as $key => $value ) { $allParamsJoined[] = rawurlencode( $key ) . '=' . rawurlencode( $value ); } $urlParts = parse_url( $url ); $url = $urlParts['scheme'] . '://' . strtolower( $urlParts['host'] ) . $urlParts['path']; $signatureBaseParts = [ strtoupper( $method ), $url, implode( '&', $allParamsJoined ) ]; $signatureBaseString = implode( '&', array_map( 'rawurlencode', $signatureBaseParts ) ); $headerParams['oauth_signature'] = base64_encode( hash_hmac( 'sha1', $signatureBaseString, rawurlencode( $consumerSecret ) . '&' . rawurlencode( $accessSecret ), true ) ); $header = array(); foreach ( $headerParams as $key => $value ) { $header[] = rawurlencode( $key ) . '=' . rawurlencode( $value ); } return 'Authorization: OAuth ' . implode( ', ', $header ); } </pre> </div> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"> <span id="see-also"></span> == <span id="See_also" class="mw-headline"><span id="h-See_also" mw-comment-start=""></span>See also<span mw-comment-end="h-See_also"></span></span> == </div> * [[wiki/Special:MyLanguage/OAuth/For_Developers|OAuth/For Developers]]<span style="display:none"> [[wiki/OAuth/For_Developers|wiki/OAuth/For_Developers]] </span> * [[wiki/Special:MyLanguage/Help:OAuth|Help:OAuth]]<span style="display:none"> [[wiki/Help:OAuth|wiki/Help:OAuth]] </span> * [[wiki/Special:MyLanguage/Manual:Pywikibot/OAuth|Manual:Pywikibot/OAuth]]<span style="display:none"> [[wiki/Manual:Pywikibot/OAuth|wiki/Manual:Pywikibot/OAuth]] </span> </div> [[File:https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1|1x1px]] <div class="printfooter" nosnippet=""> Retrieved from "https://www.mediawiki.org/w/index.php?title=OAuth/Owner-only_consumers&oldid=6500389" </div> </div> <div id="catlinks" class="catlinks catlinks-allhidden" mw="interface"> </div> </div> </div> </div> <div class="mw-footer-container"> * <span id="footer-info-lastmod">This page was last edited on 2 May 2024, at 23:26.</span> * <span id="footer-info-copyright">Text is available under the [https://creativecommons.org/licenses/by-sa/4.0/deed.en Creative Commons Attribution-ShareAlike License]; additional terms may apply. See [https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use Terms of Use] for details.</span> * <span id="footer-places-privacy">[https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy Privacy policy]</span> * <span id="footer-places-about">[[wiki/Project:About|About mediawiki.org]]</span> * <span id="footer-places-disclaimers">[[wiki/Project:General_disclaimer|Disclaimers]]</span> * <span id="footer-places-wm-codeofconduct">[https://www.mediawiki.org/wiki/Special:MyLanguage/Code_of_Conduct Code of Conduct]</span> * <span id="footer-places-developers">[https://developer.wikimedia.org Developers]</span> * <span id="footer-places-statslink">[https://stats.wikimedia.org/#/www.mediawiki.org Statistics]</span> * <span id="footer-places-cookiestatement">[https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement Cookie statement]</span> * <span id="footer-places-mobileview">[[/m.mediawiki.org/w/index.php?title=OAuth/Owner-only_consumers&mobileaction=toggle_view_mobile|Mobile view]]</span> * <span id="footer-copyrightico">[https://wikimediafoundation.org/ [[File:/static/images/footer/wikimedia-button.png|88x31px|Wikimedia Foundation]]]</span> * <span id="footer-poweredbyico">[https://www.mediawiki.org/ [[File:/static/images/footer/poweredby_mediawiki_88x31.png|88x31px|Powered by MediaWiki]]]</span> </div> </div> </div> <div id="p-dock-bottom" class="vector-settings"> * <span class="vector-icon mw-ui-icon-fullScreen mw-ui-icon-wikimedia-fullScreen"></span> <span>Toggle limited content width</span> </div> <div id="mw-teleport-target" class="vector-body"> </div> [https://www.mediawiki.org/wiki/OAuth/Owner-only_consumers?action=edit ] <div class="mw-notification-area-overlay"> <div id="mw-notification-area" class="mw-notification-area mw-notification-area-layout" style="display: none;"> </div> </div>
返回
This is bot title v2
。
开关有限宽度模式