通过 rfigshare 使用 Figshare API 时出现身份验证错误

时间:2021-06-07 06:05:08

标签: r api oauth rfigshare

根据 Rfigshare readme:

<块引用>

您第一次使用 rfigshare 功能时,它会要求您进行在线身份验证。只需登录并单击“确定”即可对 rfigshare 进行身份验证。 R 将允许您缓存您的登录凭据,这样您就不会被要求再次进行身份验证(即使在 R 会话之间),只要您将来使用相同的工作目录。

在新机器上安装 rfigshare 之后(没有现有的 .httr-oauth)

library(devtools) 
install_github('ropensci/rfigshare')
library(rfigshare)

id = 3761562
fs_browse(id)

Error in value[[3L]](cond) : Requires authentication.
       Are your credentials stored in options?
       See fs_auth function for details.

因此,尽管自述文件说了些什么,但我不会被要求进行身份验证。

直接调用 fs_auth 也不起作用:

> fs_auth()
Error in init_oauth1.0(self$endpoint, self$app, permission = self$params$permission,  :
  Bad Request (HTTP 400).

我的sessionInfo如下:

<块引用>

sessionInfo()

R version 4.0.5 (2021-03-31)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Big Sur 10.16

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib

locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] rfigshare_0.3.7.100

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.6       magrittr_2.0.1   tidyselect_1.1.0 munsell_0.5.0
 [5] colorspace_2.0-1 R6_2.5.0         rlang_0.4.11     fansi_0.5.0
 [9] httr_1.4.2       dplyr_1.0.5      grid_4.0.5       gtable_0.3.0
[13] utf8_1.2.1       DBI_1.1.1        ellipsis_0.3.2   assertthat_0.2.1
[17] yaml_2.2.1       tibble_3.1.2     lifecycle_1.0.0  crayon_1.4.1
[21] RJSONIO_1.3-1.4  purrr_0.3.4      ggplot2_3.3.3    later_1.2.0
[25] vctrs_0.3.8      promises_1.2.0.1 glue_1.4.2       compiler_4.0.5
[29] pillar_1.6.1     generics_0.1.0   scales_1.1.1     XML_3.99-0.6
[33] httpuv_1.6.1     pkgconfig_2.0.3

有人有任何提示或解决方法吗?这肯定在 6 个月前我上次尝试时确实有效。我也有一个关于 Figshare 支持的关于这个问题的开放线程,但他们对 R 库的了解似乎有限。

(从 Github 交叉发布)

4 个答案:

答案 0 :(得分:2)

rfigsharemaster branch 似乎已经超出了 figshare 现在提供的接收器范围,因为 master 分支似乎使用 api 的 v1 以及 oauth v1 身份验证,而 figshare 已经继续使用 v2 api,现在推广使用 oauth v2。

虽然我不确定 figshare 是否关闭了 api 的 v1 和/或禁止了 oauth v1,但如果您从 sckott branch 安装并使用个人访问权限,您似乎仍然可以使用该软件包令牌(PAT)。

要生成 PAT,请在网络浏览器中导航至 https://figshare.com/account/applications。在此页面的底部,您可以生成 PAT。当令牌出现时,复制它,因为您将无法再次查看它(尽管您可以随时轻松生成一个新的)。

您需要将此令牌存储在您的 .Renviron 文件中。 usethis 包有一个漂亮的 edit_r_environ() 函数,让这件事变得更容易:

usethis::edit_r_environ()

在 R 中运行上面的代码应该会找到您的 .Renviron 文件并打开它进行编辑。将您的 PAT 存储在新行上。

RFIGSHARE_PAT="the-really-long-pat-you-should-have-on-your-clipbord"

保存并关闭文件。确保重新启动 R 会话以使此更改生效。

然后您可以通过运行来测试以上是否有效:

Sys.getenv("RFIGSHARE_PAT")

查看是否找到了您的 PAT。

然后从 rfigshare 分支安装 sckott

remotes::install_github("https://github.com/ropensci/rfigshare/tree/sckott")

现在你应该可以

library(rfigshare)
fs_browse()

答案 1 :(得分:1)

我认为其中一个问题是您将 article_id 传递给 fs_browse,第一个参数不是那个。如果您想浏览一个公共集合,您可以设置 mine = FALSEsession = NULL,例如:

out = fs_details(article_id = 3761562, mine = FALSE, session = NULL)

答案 2 :(得分:1)

您还可以考虑利用当前的 figshare api 与 Open API 兼容这一事实,并使用 swagger 规范即时构建您自己的客户端。

如我在其他答案中所述,生成并存储个人访问令牌。那你就可以了

library(rapiclient)
library(httr)

fs_api <- get_api("https://docs.figshare.com/swagger.json")
header <- c(Authorization = sprintf("token %s", Sys.getenv("RFIGSHARE_PAT")))
fs_api <- list(operations = get_operations(fs_api, header), 
               schemas = get_schemas(fs_api))

my_articles <- fs_api$operations$private_articles_list()
content(my_articles)

答案 3 :(得分:0)

Figshare 支持人员通知我,他们已阻止使用 http:// 完成的请求。将请求切换到 https:// 似乎解决了 rfigshare 上的一些问题。特别是,fs_details()fs_delete() 在切换到 https:// 后起作用。

fs_upload() 即使切换到 https 也会损坏。