使用R的httr2实现SSO认证登录API的问题求助
技术建议及修正代码
核心问题分析
你的R代码存在两个关键错误:
- 使用了GET请求提交登录信息,而Python中是用POST提交表单数据
- 错误使用了
req_auth_basic和req_auth_bearer_token——这两个函数是设置HTTP头部的认证方式,而目标SSO是通过表单字段接收用户名、密码和令牌,并非HTTP头认证
修正后的R代码
library(rvest) library(httr2) # URLs login_url <- "https://auth.ABCDEFG.org/" app_url <- "https://myDestination.ABCDEFG.org/" api_url <- paste0(app_url, "api/") # 1. 获取登录页及表单令牌(自动缓存Cookie) auth_resp <- request(login_url) %>% req_perform() auth_page_data <- resp_html(auth_resp) # 简化令牌提取方式 auth_form_token <- auth_page_data %>% html_element("#token") %>% html_attr("value") # 获取凭据(替换为你的实际用户名和密码) username <- "your_username" pwd <- "your_password" # 2. POST提交登录表单 login_resp <- request(login_url) %>% req_method("POST") %>% # 指定POST方法 req_body_form( # 提交表单数据,和Python的data参数对应 user = username, password = pwd, token = auth_form_token ) %>% req_perform() # 检查是否登录成功:可以查看响应是否重定向到目标页面,或检查Cookie # login_resp %>% resp_status() # login_resp %>% resp_cookies() # 3. 获取CSRF令牌并设置请求头 api_init_resp <- request(api_url) %>% req_perform() csrf_token <- api_init_resp %>% resp_cookies() %>% filter(name == "csrftoken") %>% pull(value) # 创建后续API请求的基础模板 api_req_template <- request(api_url) %>% req_headers( Referer = app_url, `X-CSRFToken` = csrf_token ) # 示例:发起API请求 # api_resp <- api_req_template %>% # req_url_path_append("your_endpoint") %>% # req_perform()
额外说明
- httr2会自动处理Cookie的缓存和传递,不需要手动管理会话,和Python的
requests.session()行为一致 - 登录后可以通过
resp_cookies()检查是否获取到认证相关的Cookie,以此判断登录是否成功 - 如果登录后有重定向,可以添加
req_follow_redirects()(默认已经开启)确保跟随重定向
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

