2013-08-16 77 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}" 

我希望任何人誰發現這個有用的可以發表評論。很高興知道我從這種沮喪中倖免於難。

相關問題