You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell调用Workfront API下载文档遇权限验证问题

Workfront API 文档下载问题解决(PowerShell)

问题原因

你拿到的/internal/document/download是Workfront的内部跳转链接,这类链接依赖会话验证,API Key仅对正式API端点(如/attask/api/v15.0)生效,无法用于内部下载链接的验证。浏览器能正常下载是因为保留了登录后的Session Cookie,自动完成了跳转验证,而PowerShell的curl调用没有携带会话信息,所以返回跳转HTML。


解决方案1:使用SessionID绕过跳转验证

先通过API Key获取有效SessionID,再拼到下载URL中即可直接下载:

  1. 获取SessionID
$apiKey = "你的Workfront API密钥"
$domain = "https://your-domain.my.workfront.com"

# 调用会话接口获取SessionID
$sessionResult = Invoke-RestMethod -Uri "$domain/attask/api/v15.0/session" -Method Post -Body @{ apiKey = $apiKey }
$sessionID = $sessionResult.data.sessionID
  1. 拼接带SessionID的下载URL
$originalDownloadUrl = "$domain/internal/document/download?ID=abc123456def123456"
# 追加sessionID参数
$validDownloadUrl = "$originalDownloadUrl&sessionID=$sessionID"
  1. 执行下载
$downloadPath = "C:\path\to\your\file.ext"
Invoke-WebRequest -Uri $validDownloadUrl -OutFile $downloadPath
# 或者用curl(PowerShell中curl是Invoke-WebRequest的别名)
curl -Uri $validDownloadUrl -OutFile $downloadPath

解决方案2:正确生成OAuth2 JWT(解决JWT无效问题)

如果想用OAuth2替代API Key,需严格按照Workfront要求生成JWT,步骤如下:

前置准备

确保你已在Workfront OAuth2应用配置中获取:

  • 客户端ID
  • 已上传到Workfront的公钥对应的私钥文件(.pem或.pfx格式)
  • 正确配置的重定向URI(即使是服务端应用,也需填写合法地址如https://localhost)

生成JWT签名

# 加载必要的.NET程序集
Add-Type -AssemblyName System.IdentityModel.Tokens.Jwt
Add-Type -AssemblyName System.Security.Cryptography.Xml

# 配置参数
$clientId = "你的OAuth2客户端ID"
$privateKeyPath = "C:\path\to\your\private-key.pem"
$workfrontUsername = "your-workfront-user@example.com"
$domain = "https://your-domain.my.workfront.com"

# 读取PEM格式私钥
$privateKeyContent = Get-Content $privateKeyPath -Raw
$rsa = [System.Security.Cryptography.RSA]::Create()
$rsa.ImportFromPem($privateKeyContent)

# 构建JWT声明(必填字段)
$now = [DateTimeOffset]::Now
$expiry = $now.AddHours(1) # 过期时间设为1小时内
$claims = @(
    [System.Security.Claims.Claim]::new("sub", $workfrontUsername),
    [System.Security.Claims.Claim]::new("iss", $clientId),
    [System.Security.Claims.Claim]::new("aud", $domain)
)

# 创建签名凭据与JWT令牌
$signingCreds = New-Object System.IdentityModel.Tokens.Jwt.SigningCredentials(
    [System.IdentityModel.Tokens.RsaSecurityKey]::new($rsa),
    [System.IdentityModel.Tokens.SecurityAlgorithms]::RsaSha256
)
$jwtHeader = New-Object System.IdentityModel.Tokens.Jwt.JwtHeader($signingCreds)
$jwtPayload = New-Object System.IdentityModel.Tokens.Jwt.JwtPayload(
    $clientId, $domain, $claims, $now.UtcDateTime, $expiry.UtcDateTime
)
$jwtToken = New-Object System.IdentityModel.Tokens.Jwt.JwtSecurityToken($jwtHeader, $jwtPayload)
$jwt = [System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler]::WriteToken($jwtToken)

获取访问令牌并下载

# 调用令牌接口获取access_token
$tokenResult = Invoke-RestMethod -Uri "$domain/attask/api/v15.0/oauth2/token" -Method Post -Body @{
    grant_type = "urn:ietf:params:oauth:grant-type:jwt-bearer"
    assertion = $jwt
}
$accessToken = $tokenResult.access_token

# 携带Bearer令牌下载文档
$headers = @{ Authorization = "Bearer $accessToken" }
Invoke-WebRequest -Uri $originalDownloadUrl -Headers $headers -OutFile $downloadPath

内容的提问来源于stack exchange,提问作者Jason Shaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:15:14