【问题标题】:How to do YouTube OAuth Authentication/Reauthentication in R Automatically Using HTTR如何使用 HTTR 在 R 中自动进行 YouTube OAuth 身份验证/重新身份验证
【发布时间】:2021-11-17 04:52:38
【问题描述】:

我一直在使用 HTTR 包向 YouTube 数据 API 发出请求。我有两个渠道可以获取统计信息。在第一次使用时,在请求访问令牌时,我完成了整个 OAuth 舞蹈,并按预期将我重定向到 Google。但是,我将令牌保存在 .httr-oauth 文件中。我开发了一个类似于以下的 for 循环来获取我的统计信息:

channelOneFile <- ".httr-oauth-channel1"
channelTwoFile <- ".httr-oauth-channel2"

myData <- list()
for(i in 1:2){
    token <- try(suppressWarnings(readRDS(tokenFile)), silent = TRUE)[[1]]
    # And Then I get stats with a GET Request
    url <- paste0("https://youtube.googleapis.com/youtube/v3/videospart=contentDetails%2Csnippet",
                  "&id=",videoId)
    request <- GET(url, token)
    myData[[i]] <- request
}

这在一段时间内运作良好。但是,在运行此代码大约 20 倍左右之后(由于一些测试和调整参数,一个 get 请求返回了

Auto-refreshing stale OAuth token.
Warning: Unable to refresh token: invalid_grant
Token has been expired or revoked.

此时我只需删除“.httr-oauth”文件,重新进行身份验证,保存新文件,然后我的代码就会再次运行。但是,我希望在本地服务器上自动执行此代码,如果令牌不起作用,服务器(我认为)将无法进行 OAuth 舞蹈。

当我发出请求时,我知道 HTTR 会自动使用刷新令牌来获取新的访问令牌,并且我知道 Google API 对刷新令牌的使用次数有限制。我认为也许当它获得新令牌时它不会更新“.httr-oauth”文件?我怎样才能让它做到这一点?如果这不是一个选项,我该怎么做才能进行一次身份验证,将凭据和访问令牌等保存在一个文件中,然后在发出服务器请求时引用该文件?

更新:这是我的 OAuth 流程:

if (file.exists(tokenFile)) {
   token <- try(suppressWarnings(readRDS(tokenFile)), silent = TRUE)[[1]]
} else if (is.null(appId) | is.null(appSecret)) {
    stop("Missing App Credentials")
} else {
  token <- httr::oauth2.0_token(httr::oauth_endpoints("google"), 
                                httr::oauth_app("google", appId, appSecret), 
                                scope = c("https://www.googleapis.com/auth/youtube.readonly", 
                                                        "https://www.googleapis.com/auth/yt-analytics.readonly"))
}

【问题讨论】:

  • 请发布您实现 OAuth 2 流程的 httr 代码。
  • 我更新了问题。这有帮助吗?

标签: r oauth-2.0 youtube-api youtube-data-api httr


【解决方案1】:

您需要刷新您的访问令牌,因为这种 OAuth 令牌是短暂的(通常是一小时有效)。使用httrs 函数refresh_oauth2.0

离线处理刷新令牌的过程见我的这个答案:How to get my own Google API access token without using "Log in with Google"?

请注意,可以根据需要多次使用刷新令牌来更新expiring access token。刷新令牌usually do not expireone's app is in testing stage 时会这样做),但可以撤销。

【讨论】:

  • 当我调用 GET 请求时,总是收到消息Auto-refreshing stale OAuth token.,那不是已经刷新令牌了吗?至于在测试阶段到期的刷新令牌事情,两个应用程序都处于测试阶段(每个频道有一个应用程序),但一个从来没有这个问题,另一个有 - 授予一个从未有问题的应用程序是我一年多以前开发的,而这个一直发出问题的只有一两个月的历史 - 这可能是为什么?
  • @Jacob:较旧的项目(在 Google 引入 7 天到期规则之前创建的项目)自动将其发布状态设置为生产中;因此具有不会过期的刷新令牌。请注意,项目的发布状态显示在 Google 的开发者控制台中。
  • @Jacob:stale 消息是由函数 request_perform 引起的。在source code of httr 包中查找:httr 没有实现刷新访问令牌的正确逻辑(基于 API 提供的 the expiration timestamp expires_in 以及令牌本身)。
  • @Jacob:每次调用request_perform(例如在GET 调用时),它会刷新访问令牌,无论该令牌是否过期。结果:httr 需要改进。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2016-09-21
  • 2021-02-08
  • 2015-02-02
  • 1970-01-01
  • 2011-09-09
相关资源
最近更新 更多