是否无法使用不记名令牌创建新的 Wiki 页面
(OAuth) 通过 wiki 的 Rest API?
当然是的,这是可能的。您可以在本地使用 PAT 令牌执行的任何其余 api,都可以通过编程方式运行System.AccessToken
在 Powershell 任务中。
对于您面临的错误,事实上,如果您只是Write-Host $response
,错误消息会让你更清楚:
Invoke-RestMethod : {"$id":"1","innerException":null,"message":"The wiki page operation failed with message : User does not have write permissions for this wiki.","typeName":"Microsoft.TeamFoundation.Wiki.Server.WikiPageOperationFailedException,
Microsoft.TeamFoundation.Wiki.Server","typeKey":"WikiPageOperationFailedException","errorCode":0,"eventId":3000}
事实上,这是您需要关注的根本错误原因。
当你跑步时Rest api在Azure Devops pipeline中使用powershell任务,此时,该api的请求用户帐户为{项目名称}构建服务({组织名称})。换句话说,在构建期间请求添加 wiki 页面的用户是{项目名称}构建服务({组织名称}),这是一个构建服务帐户,权限范围仅在管道中。
此外,由于 Wiki 托管在存储库中,解决这个问题,你必须添加这个项目构建服务(组织名称)帐户进入您的存储库权限组,并确保其Contribute
许可为Allow。因此这个构建服务帐户可以有足够的权限来添加wiki页面:
(Public 是我的项目名称,ForMerlin 是我的组织名称)
为了让您更清楚地了解您收到的原因400 Bad request error
代替this non-permission error
打印出来后$_.Exception.Message;$_.Exception.Response.StatusCode.value__ ; $_.Exception.Response.StatusDescription;
,我重现了这个问题然后检查我们的后端IIS日志。
执行这个api的时候,实际上是服务端在调用Microsoft.TeamFoundation.Wiki.Web.Controllers.WikiPagesController.CreateOrUpdatePage
打包“请求正文”这将发送到使用的下一个操作方法。 (Note:这个“请求体”与我们在rest API中使用的普通“请求体”不一样。这里我指的是已经完成的,也就是需要的服务器)。在其参数中,有一个可以代表用户的参数:callerName
.
正如我之前提到的,调用此 API 请求的用户帐户是建立服务帐户,其权限范围不满足服务器要求。所以,服务器所需的这个“请求体”是无效的。然后你通过命令收到 400 代码$_.Exception.Response.StatusCode.value__
.