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

如何在Ruby中为网络请求添加network credentials身份凭证

Ruby Net::HTTP 接口添加身份凭证方案

针对你调用Azure DevOps/TFS接口的场景,可通过以下两种常用方式添加认证:

方式1:PAT基本认证(官方推荐)

这是Azure DevOps/TFS最常用的认证方式,无需依赖额外库:

  1. 先在Azure DevOps后台生成具备Pull Request操作权限的个人访问令牌(PAT)
  2. 调整代码如下:
url = URI.parse("http://dev.azure/tfs/#{collection}/#{proyect}/_apis/git/repositories/#{idrepositori}/pullrequest/#{idPR}?api-version=5.0")
puts "  url #{url}"
req = Net::HTTP::Post.new(url, 'Content-Type' => 'application/json')
# 新增认证代码:Azure DevOps基本认证用户名可留空,密码填生成的PAT
req.basic_auth('', '你生成的PAT令牌')
res = Net::HTTP.start(url.hostname, url.port) do |http| 
  http.request(req) 
end

建议通过环境变量读取PAT,不要硬编码到代码中避免凭证泄露,例如将PAT替换为ENV['AZURE_DEVOPS_PAT']

方式2:域账号认证(适用于本地部署的域内TFS)

如果你的TFS是本地部署且需要Windows域账号验证,先安装ntlm认证依赖:
gem install net-ntlm
调整代码如下:

require 'net/ntlm'
require 'net/http'

url = URI.parse("http://dev.azure/tfs/#{collection}/#{proyect}/_apis/git/repositories/#{idrepositori}/pullrequest/#{idPR}?api-version=5.0")
puts "  url #{url}"
req = Net::HTTP::Post.new(url, 'Content-Type' => 'application/json')
# 配置域账号信息
ntlm_auth = Net::NTLM::Message::Negotiate.new
ntlm_auth.domain = '你的域名'
ntlm_auth.workstation = '你的工作站名(可选)'
req['Authorization'] = "NTLM #{ntlm_auth.encode64}"

res = Net::HTTP.start(url.hostname, url.port) do |http|
  first_resp = http.request(req)
  if first_resp.code == '401'
    # 处理NTLM挑战
    challenge = Net::NTLM::Message.parse(first_resp['WWW-Authenticate'].split(' ').last)
    auth_response = challenge.response({user: '你的用户名', password: '你的密码'}, {ntlmv2: true})
    req['Authorization'] = "NTLM #{auth_response.encode64}"
    http.request(req)
  else
    first_resp
  end
end

注意事项

  • 如果接口地址为HTTPS协议,需要在Net::HTTP.start参数中添加use_ssl: true
  • 生产环境不要禁用SSL证书校验,测试环境如果是自签名证书可临时添加verify_mode: OpenSSL::SSL::VERIFY_NONE参数

内容的提问来源于stack exchange,提问作者stevencap3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:30:01