如何在R中自动使用http进行YouTube OAuth认证/重新认证



我一直在使用http包向YouTube Data 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.

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

当我发出请求时,我知道http会自动使用刷新令牌来获得新的访问令牌,并且我知道Google api对刷新令牌可以使用的次数有限制。我认为可能当它获得新的令牌时,它不会更新"。html -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令牌的有效期很短(通常有效期为一小时)。使用httrs功能refresh_oauth2.0.

查看我在离线处理刷新令牌的过程中的回答:如何获得我自己的Google API访问令牌而不使用"登录与Google"?

请注意,可以根据需要多次使用刷新令牌来更新即将过期的访问令牌。刷新令牌通常不会过期(当应用程序处于测试阶段时它们会过期),但可以撤销。

最新更新