如何使用R语言httr包实现OAuth2密码授权模式生成访问Token
实现方案
你可以直接用httr::POST完全模拟你终端执行的curl命令获取token,不需要硬套oauth2.0_token的封装逻辑,出错概率更低,配置也更简单:
library(httr) library(jsonlite) # 完全对应你的curl命令构造请求 token_resp <- POST( url = "https://{website}.com/rest/v2/oauth/token", # 直接复用你现有请求头即可 add_headers( `Content-type` = "application/x-www-form-urlencoded", Authorization = "Basic xxxyyy123xxx==" ), # 对应curl的-d参数内容 body = list( grant_type = "password", username = "{实际用户名}", password = "{实际密码}" ), encode = "form" # 自动处理x-www-form-urlencoded编码 ) # 校验请求是否成功 stop_for_status(token_resp, "获取token") # 提取可用的access token access_token <- content(token_resp)$access_token
获取token后可以直接复用你原来的API调用逻辑:
call <- "https://{website}.com/rest/v2/services/APIService/getRegistryRecordByAccessionID?id={id#}" df <- as.data.frame(fromJSON(content(httr::GET(call, add_headers(Authorization = paste("Bearer", access_token))), "text"), flatten = TRUE))
如果你需要使用oauth2.0_token函数的配置说明
你之前代码报错的核心问题是缺少密码授权模式的必要配置,正确配置方式如下:
token <- oauth2.0_token( endpoint = oauth_endpoint( authorize = NULL, access = "https://{website}.com/rest/v2/oauth/token" ), # oauth_app填客户端信息,对应你Basic头解码后`client_id:client_secret`的两段内容 app = oauth_app( appname = "自定义应用名称", key = "{客户端ID}", # Basic头Base64解码后冒号前的内容 secret = "{客户端密钥}" # Basic头Base64解码后冒号后的内容 ), type = "password", # 明确指定为密码授权模式,默认是授权码模式所以会报错 use_basic_auth = TRUE, # 开启后会自动生成Basic头,不需要手动添加 # 传入账号密码 credentials = list( username = "{实际用户名}", password = "{实际密码}" ) ) # 提取token的方式为 access_token <- token$credentials$access_token
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

