2013-08-16 55 views
1

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

接下来,API指示其用户通过使用用户的电子邮件和密码(由于多种原因我不能这样做)或使用用户的电子邮件地址以及API令牌来作为最终用户进行身份验证。以下是我尝试授权与授权头的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未授权。但是,用req.basic_auth {user_email}, {user_password}代替这两条线可以正常工作。

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

我在这个话题上做的谷歌搜索显示很少;显然,在处理Authorization头部时,使用正常的{username}:{password}格式比API令牌更常见。

在此先感谢!

更新:古怪,试图在尝试授权的request.headers['Authorize'] = "BasiC#{credentials}"确实与req['Authorization'] = "BasiC#{credentials}"最终用户不返回401错误未经授权或WWW身份验证头进行身份验证。

回答

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}" 

我希望任何人谁发现这个有用的可以发表评论。很高兴知道我从这种沮丧中幸免于难。

相关问题