【发布时间】:2020-08-28 15:09:56
【问题描述】:
我正在尝试使用 R 将数据库文件上传到外部组织的 API。我有一个用户名和密码,以及一个单独的地址来获取令牌,然后上传文件。
usr<-"username"
pw<-"passwood"
url <- "https:/routurl/api/"
Token='Token'
UploadFile='UploadFile'
#Get Token
r <- httr::POST(url = paste0(url,Token),
body = list(
UserName = usr,
Password = pw,
grant_type = "password"
), verbose())
tkn=jsonlite::prettify(httr::content(r, "text"))
这似乎可行,因为我可以从内容中提取令牌。
> tkn
{
"result": {
"token": "eyJhbGciOiJIUzFAKEIsInR5cCI6IkpCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiZ3JphzZSIsImp0aSI6IjUwNmIwN2MyLTTHISISFAKEIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL2VIVECHANGEDTHINGScyI6ImVtaWx5dGdyaWZmaXRoc0BiaW9zLmF1LmRrIiwiZXhwIjoxNTk4NzEwMTU3LCJpc3MiOiJ2bXNhcHAiLCJhdWQiOiJ2bXN1c2VycyJ9.z8sr-HT21u1bN7qCEXAMPLEONLY-TKAluO3k",
"expiration": "29 August 2020 16:09:17"
},
"id": 2,
"exception": null,
"status": 5,
"isCanceled": false,
"isCompleted": true,
"isCompletedSuccessfully": true,
"creationOptions": 0,
"asyncState": null,
"isFaulted": false
}
#re-formatting
tkn=jsonlite::fromJSON(content(r, "text"), simplifyVector = FALSE)
所以,这一切看起来都不错,但是,如果我尝试在 JSON 解码器上仔细检查,我的正确 Web 信息会出现在有效负载中,但在底部它声称它是无效签名。
另外,请求中的 auth_token 变量为 NULL,这似乎不正确。
> r$request$auth_token
NULL
但是,我无法对此进行测试,因为我终其一生都无法弄清楚如何使用此 JWT 将文件 POST 到 rooturl/UploadFile。我查看的每个文档都涉及如何 POST 到 API 不包括如何在 POST 中包含您的 JWT,或者至少不是很清楚。它在标题中吗?是这样的吗?
r2=POST(url=paste0(url,UploadFile), body = list(y = upload_file('O:/Igoturfilerighthere.h5')),
add_headers('Authorization' = paste("Bearer", tkn$result$token, sep = " ")), encode = "json", verbose())
我是否错误地设置了标题?
r3=POST(url=paste0(url,UploadFile), body = list(y = upload_file('O:/Igoturfilerighthere.h5')),
httr::add_headers("x-auth-token"=tkn$result$token), verbose())
对于 r3 请求,我收到 401 错误,这让我认为我在正确的路径上并且我输入的令牌信息不正确。如果有人可以帮助指导我进行下一步,我将不胜感激。我只是不知道在哪里可以放置这些信息。
干杯, 等
更新:
如果在初始请求中添加'encode = "json"',则会引发 400 Bad Request Error。这就是我尝试上传的网站编写自己的代码的方式。我已经仔细检查了我的用户名和密码,它们都是正确的。
r <- httr::POST(url = paste0(url,Token),
body = list(
UserName = usr,
Password = pw,
grant_type = "password"
),encode = "json", verbose())
HTTP/1.1 400 Bad Request
Transfer-Encoding: chunked
Content-Type: application/problem+json; charset=utf-8
Server: Microsoft-IIS/10.0
Strict-Transport-Security: max-age=2592000
X-Powered-By: ASP.NET
【问题讨论】:
-
根据JWT documentation 和R examples like this one 我会说你与
add_headers('Authorization' = paste("Bearer", tkn$result$token, sep = " "))完全在正确的轨道上 - 但是,如果你要发送文件,我认为你需要编码作为“多部分”或just not specify anything -
不幸的是,这两个选项都会产生 400 错误,即错误请求。我不相信我的令牌是正确的,因为将其粘贴到调试器中称其为无效签名,即使有效负载信息是正确的。