MediaWiki bot用户阅读权限?

时间:2016-12-01 16:07:26

标签: php mediawiki bots mediawiki-api

随着MediaWiki 1.27的更新,对API进行了一些身份验证更改(与Wiki引擎的一般身份验证更改一起)。作为其中的一部分,我似乎在维基中遇到权限错误,该错误设置为不允许匿名用户阅读。

wiki有$wgGroupPermissions['*']['read'] = false;来关闭匿名用户的访问权限。

但是使用由新Special:BotPasswords页面创建的bot似乎有问题。我为现有的admin用户创建了一个机器人,用于授予"基本权利"访问新机器人作为基线("基本权利"包括readwriteapi)。

使用API​​,我可以成功获取登录令牌并登录(返回cookie以设置会话),然后使用该会话cookie尝试进行页面查询(例如,列出allpages )导致readapidenied错误("您需要读取权限才能使用此模块")。

readapi我必须在某处获得新的许可吗?或者,只是呈现会话cookie不足以将页面列表请求链接到登录请求(如何将login呼叫转发的授权转发给其他呼叫?)?或者这只是新Bot用户基础架构中的一个错误?

我猜测我的错误是将会话信息传递到列表查询,因为如果我暂时将$wgGroupPermissions['*']['read']放回true,并使用assert=user查询选项,它返回assertuserfailed错误,表示用户未登录。

1 个答案:

答案 0 :(得分:1)

在这种情况下,结果与BotPassword基础设施无关,而是与单独的扩展相关:

我在这个维基上也有一个自定义会话提供程序(ImmutableSessionProviderWithCookie),它没有正确地避开BotPassword会话提供程序。

所以,如果你有一个会话提供者不应该对API请求有效:

  • 确保会话提供商从null电话中返回newSessionInfo。默认情况下,ImmutableSessionProviderWithCookie实施已从此调用中返回null,因为canChangeUser会返回false。如果您的实现更改了该逻辑,以至于在某些情况下newSessionInfo返回非null,则您必须覆盖它。
  • 在会话提供商的provideSessionInfo( WebRequest $request )方法中,添加:

    // For API requests, ignore
    if ( defined( 'MW_API' )) {
        return null;
    }
    

只要newSessionInfo方法和provideSessionInfo方法都返回null,就不会为该会话提供程序创建会话cookie,因此它不会干扰其他会话cookie提供者(如BotPassword)。