随着MediaWiki 1.27的更新,对API进行了一些身份验证更改(与Wiki引擎的一般身份验证更改一起)。作为其中的一部分,我似乎在维基中遇到权限错误,该错误设置为不允许匿名用户阅读。
wiki有$wgGroupPermissions['*']['read'] = false;
来关闭匿名用户的访问权限。
但是使用由新Special:BotPasswords
页面创建的bot似乎有问题。我为现有的admin
用户创建了一个机器人,用于授予"基本权利"访问新机器人作为基线("基本权利"包括read
和writeapi
)。
使用API,我可以成功获取登录令牌并登录(返回cookie以设置会话),然后使用该会话cookie尝试进行页面查询(例如,列出allpages
)导致readapidenied
错误("您需要读取权限才能使用此模块")。
readapi
我必须在某处获得新的许可吗?或者,只是呈现会话cookie不足以将页面列表请求链接到登录请求(如何将login
呼叫转发的授权转发给其他呼叫?)?或者这只是新Bot用户基础架构中的一个错误?
我猜测我的错误是将会话信息传递到列表查询,因为如果我暂时将$wgGroupPermissions['*']['read']
放回true
,并使用assert=user
查询选项,它返回assertuserfailed
错误,表示用户未登录。
答案 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
)。