1

我正在使用 Zendesk API,仅 HTTPS、JSON API 和身份验证需要更新资源,并且 API 提供 API 令牌以在以不同用户身份进行身份验证时使用。更新资源时,我通过 SSL 发出 PUT 请求,将适当的 JSON 内容分配给请求正文,并将Content-Type请求标头指定为application/json.

接下来,API 指示其用户通过使用用户的电子邮件和密码(由于多种原因我不能这样做)或使用用户的电子邮件地址和 API 令牌来作为最终用户进行身份验证。以下是我尝试使用 Authorization 标头向 API 授权:

@id = params[:id]
@comment_body = params[:comment]

uri = URI.parse "https://{subdomain}.zendesk.com/api/v2/requests/#{@id}.json"
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
req = Net::HTTP::Put.new(uri.request_uri)
req.body = '{"request": {"comment":{"value":' + "\"#{@comment_body}\"" + '}}}'
req['Content-Type'] = 'application/json'

#The following two lines do not work!
credentials = Base64::encode64("{user_email}/token:{api_token}")
request.headers['Authorization'] = "Basic #{credentials}"

response = http.request(req)

API 指定使用 API 令牌进行身份验证的格式为{user_email}/token:{api_token}. 我用 编码该格式Base64::encode64并将其传递给以 开头的授权标头Basic,但响应是 401 Unauthorized。但是,将这两行替换为req.basic_auth {user_email}, {user_password}工作正常。

所以我的问题是,我如何使用电子邮件和给定的 API 令牌作为身份验证作为不同的用户进行身份验证,而不是提供用户的电子邮件和密码req.basic_auth

我在该主题上所做的谷歌搜索几乎没有透露任何信息。{username}:{password}显然,在处理 Authorization 标头时使用普通格式比使用 API 令牌更常见。

提前致谢!!

更新:奇怪的是,尝试以最终用户身份进行身份验证req['Authorization'] = "Basic #{credentials}"不会返回 401 Unauthorized Error 或 WWW-Authenticate 标头,同时尝试进行授权request.headers['Authorize'] = "Basic #{credentials}"

4

1 回答 1

3

经过多次头部撞击,几乎把我的笔记本电脑扔出窗外,终于弄明白了。突然,答案似乎非常明显。

使用 Net::HTTP 时,其 basic_auth 方法也可以根据 API 接受令牌,Zendesk API 指定使用 API 令牌的格式为 {email}/token:{token}。基本身份验证使用格式 {username}:{password},其中两个字段由冒号分隔,这意味着在 Zendesk 的情况下,我可以将 {email}/token 作为第一个参数,将 {token} 作为第二个参数(而不是用户名作为第一个参数,密码作为第二个参数),所以下面的代码是正确的:

req.basic_auth "{email}/token", "{api_token}"

我希望任何觉得这很有用的人都可以发表评论。很高兴知道我让某人免于这种挫败感。

于 2013-08-16T23:11:44.407 回答