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中即可直接下载:
- 获取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
- 拼接带SessionID的下载URL
$originalDownloadUrl = "$domain/internal/document/download?ID=abc123456def123456" # 追加sessionID参数 $validDownloadUrl = "$originalDownloadUrl&sessionID=$sessionID"
- 执行下载
$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
相关产品推荐
相关产品推荐

