如何使用httr::VERB通过Refresh Token刷新Google Fit API访问令牌
使用httr刷新Google Fit API的Access Token
直接把Refresh Token当作Access Token使用是无效的,必须向Google的OAuth2令牌端点发送特定POST请求来获取新的Access Token。以下是用httr::VERB实现的具体代码:
刷新令牌函数实现
library(httr) refresh_google_access_token <- function(client_id, client_secret, refresh_token) { # Google OAuth2令牌端点 token_endpoint <- "https://oauth2.googleapis.com/token" # 构造请求参数 request_body <- list( client_id = client_id, client_secret = client_secret, refresh_token = refresh_token, grant_type = "refresh_token" ) # 用VERB显式发送POST请求 response <- VERB("POST", url = token_endpoint, body = request_body, encode = "form") # 检查请求是否成功 if (http_status(response)$category != "Success") { stop("令牌刷新失败: ", content(response, "text")) } # 解析并返回新令牌数据 return(content(response)) }
使用示例
- 调用函数刷新令牌:
# 替换为你的应用凭证和已保存的refresh_token my_client_id <- "你的客户端ID" my_client_secret <- "你的客户端密钥" my_refresh_token <- "已获取的刷新令牌" new_token_data <- refresh_google_access_token(my_client_id, my_client_secret, my_refresh_token) # 提取关键信息 new_access_token <- new_token_data$access_token expires_in_seconds <- new_token_data$expires_in
- 在循环中自动验证并刷新:
# 初始化令牌及过期时间 current_access_token <- "初始的Access Token" token_expiry_time <- Sys.time() + 3600 # 初始有效期1小时 while(TRUE) { # 提前60秒触发刷新 if (Sys.time() >= token_expiry_time - 60) { cat("令牌即将过期,开始刷新...\n") new_token_data <- refresh_google_access_token(my_client_id, my_client_secret, my_refresh_token) current_access_token <- new_token_data$access_token token_expiry_time <- Sys.time() + new_token_data$expires_in cat("刷新完成,新令牌有效期至:", token_expiry_time, "\n") } # 使用当前令牌请求Google Fit步数数据 fit_response <- GET( url = "https://www.googleapis.com/fitness/v1/users/me/dataset:aggregate", add_headers(Authorization = paste("Bearer", current_access_token)), query = list( aggregateBy = '[{"dataTypeName":"com.google.step_count.delta"}]', startTimeMillis = as.character(as.integer(Sys.time())*1000 - 86400000), endTimeMillis = as.character(as.integer(Sys.time())*1000) ) ) # 处理API响应 if (http_status(fit_response)$category == "Success") { cat("获取步数数据成功\n") } else { cat("API请求失败:", content(fit_response, "text"), "\n") } # 每分钟轮询一次 Sys.sleep(60) }
注意事项
- 确保你的
refresh_token拥有fitness.activity.read权限,否则刷新或API请求会失败。 - 部分场景下Google会返回新的
refresh_token,建议保存该值用于后续刷新。 - 需处理令牌刷新失败的情况(如refresh_token过期),此时需要引导用户重新授权。
内容的提问来源于stack exchange,提问作者Lev
相关产品推荐
相关产品推荐

