【问题标题】:RestClient basic auth with # in usernameRestClient基本身份验证在用户名中带有#
【发布时间】:2013-03-22 10:14:10
【问题描述】:

我在访问 REST api 的守护程序时遇到问题。

访问需要基本身份验证。用户名和密码是固定的,不能更改。

问题似乎是,用户名看起来像这样:#ws+R4nd0mS7r1n

我像这样访问 API:

resource = RestClient::Resource.new( "#{base_url}/failover/#{failover_ip}", { :user => user_name, :password => user_password})
response = resource.get

这给我带来了一个糟糕的 URI 错误:

bad URI(absolute but no path): https://#ws+R4nd0mS7r1n:RaNdOmPaSsWoRd@robot-ws.your-server.de/failover/11.11.11.11

当我故意从用户名中删除 # 时,它可以工作,但我得到一个 NOT Authenticated 错误。

有没有办法将包含# 的用户名或密码传递给restclient? 手动将完整的 URI 传递给 .get 也不起作用。

【问题讨论】:

  • 你试过其他客户端吗?喜欢faradayHTTParty
  • 你试过用%23替换#吗?
  • 用户名/密码组合最终会进入 http 请求的授权标头部分,因此 Oto 尝试替代客户端的建议是合理的。另外,您可以尝试直接设置标题
  • 我尝试了 HTTParty,但现在出现“无法将 HTTParty.Response 转换为字符串”之类的错误。有没有办法轻松做到这一点,这样我就不必调整整个应用程序?
  • 在下面查看我的答案 - 您使用的是什么版本的 Ruby 和 rest-client? rest-client 也很可能正在使用更深层次的 http 传输库,而正是它拒绝了 URI。您可能不需要重新工具,只需找到已过期或与您所需服务不兼容的组件

标签: ruby basic-authentication rest-client


【解决方案1】:

我没有得到同样的错误。你安装的是什么版本的rest-client

您可以简单地更新版本来解决您的问题(我使用 gem 的 1.6.7 版本进行了测试)

或者,这可以通过直接写入授权标头来解决 URI 故障(无论如何,这是数据结束的地方):

require 'base64'
auth = 'Basic ' + Base64.encode64( "#{user_name}:#{user_password}" ).chomp
resource = RestClient::Resource.new( "#{base_url}/failover/#{failover_ip}", { :headers => { 'Authorization' => auth } } )
resource.get

【讨论】:

  • 我也在使用 1.6.7,使用 ruby​​ 1.8。
  • 我尝试了 1.6.7 和 ruby​​ 1.8.7-p352,并获得了与 echo 服务的连接,该服务显示 auth 标头设置如下:Authorization: Basic I3dzK1I0bmQwbVM3cjFuOmZvbw==。 . .所以我怀疑你在调用堆栈中还有其他东西失败了。我会尽力为您找出解决方法
  • 在我的回答中加入一个变通方法。您可能仍希望检查您的网络堆栈是否引发错误 - 它可能只是某个地方的过时 gem。
  • 我试过了,它似乎工作正常。在 END 中切换到其他 API。
猜你喜欢
  • 2017-07-31
  • 2016-04-19
  • 2017-06-26
  • 2016-04-07
  • 2015-01-17
  • 2011-12-05
  • 1970-01-01
  • 2020-06-08
  • 2018-01-24
相关资源
最近更新 更多