如何在Ruby中为网络请求添加network credentials身份凭证
Ruby Net::HTTP 接口添加身份凭证方案
针对你调用Azure DevOps/TFS接口的场景,可通过以下两种常用方式添加认证:
方式1:PAT基本认证(官方推荐)
这是Azure DevOps/TFS最常用的认证方式,无需依赖额外库:
- 先在Azure DevOps后台生成具备Pull Request操作权限的个人访问令牌(PAT)
- 调整代码如下:
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
相关产品推荐
相关产品推荐

