【问题标题】:Posting a file to an outside API with a JSON web token使用 JSON Web 令牌将文件发布到外部 API
【发布时间】: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 documentationR examples like this one 我会说你与add_headers('Authorization' = paste("Bearer", tkn$result$token, sep = " ")) 完全在正确的轨道上 - 但是,如果你要发送文件,我认为你需要编码作为“多部分”或just not specify anything
  • 不幸的是,这两个选项都会产生 400 错误,即错误请求。我不相信我的令牌是正确的,因为将其粘贴到调试器中称其为无效签名,即使有效负载信息是正确的。

标签: r post jwt httr jsonlite


【解决方案1】:

因此,我联系了我试图访问的 API 背后的组织,我的 JWT 请求存在一些问题。这是正确的代码:

r <- httr::POST(paste0(url,Token), 
            body = list(UserName = usr, password = pw),
            encode = "form", verbose())

最大的区别是删除了“grant_type”和“encode="form"',因为我试图通过他们网站上的表单登录。有了这个区别,我可以使用以下方法上传文件:

r2=POST(url=paste0(url,UploadFile), body = list(fileToUpload = httr::upload_file('O:/IGotUrFileHere.h5')),
         httr::add_headers('Authorization' = paste("Bearer", tkn$result$token, sep = " ")), verbose())

同样,verbose() 函数不是必需的。它只是帮助您排除故障。祝你好运!

【讨论】:

    猜你喜欢
    • 2018-08-10
    • 2019-10-15
    • 2016-02-07
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2021-12-23
    • 2012-08-24
    • 2016-08-02
    相关资源
    最近更新 更多