You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R的httr2实现SSO认证登录API的问题求助

技术建议及修正代码

核心问题分析

你的R代码存在两个关键错误:

  1. 使用了GET请求提交登录信息,而Python中是用POST提交表单数据
  2. 错误使用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:57:48