使用 JSON 网络令牌将文件发布到外部 API

Posting a file to an outside API with a JSON web token

我正在尝试使用 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 解码器上仔细检查,我的正确网络信息出现在有效载荷中,但在底部它声称它是无效的签名。

此外,请求中的 auth_token 变量为 NULL,这似乎不对。

> r$request$auth_token
 NULL

但是,我无法对此进行测试,因为在我的一生中,我无法弄清楚如何使用此 JWT 将 POST 文件传输到 rooturl/UploadFile。我查看的每份文档都涉及如何 POST 到 API,但不包括如何将您的 JWT 包含在 POST 中,或者至少不是很清楚。它在 header 中吗?是这样吗?

 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())

我 header 设置不正确吗?

 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 错误,这让我认为我在正确的路径上,并且我输入的令牌信息不正确。如果有人可以帮助指导我下一步,我将不胜感激。我只是不知道该把这些信息放在哪里。

干杯, etg

更新:

如果在初始请求中添加 '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

因此,我联系了我试图访问的 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() 函数不是必需的。它只是帮助您排除故障。祝你好运!