2013-01-13 51 views
2

關於https://github.com/sinatra/sinatra/issues/596,我錯誤地診斷爲sinatra錯誤。Soundcloud Oauth實現:爲什麼散列參數?

我遇到以下問題:我正在使用Soundcloud OAuth工作流程在我的項目中實施單點登錄。爲此我使用「soundcloud」寶石。所以,在被重定向到soundcloud的登錄/授權表單並按下「連接」之後,我被重定向回來了我指定爲重定向url的應用程序中的URL ...但是一些散列參數被隱藏了!因此,讓我們說,而不是被重定向到「http://myapp.com/connect?code=123」,而是被重定向到「http://myapp.com/connect?code=123#access_token=qwerty 」。由於散列參數不是HTTP協議的一部分,它對服務器有副作用,但在客戶端上,bleepin散列參數不會消失!基本上,在我的重定向端點上,我獲取soundcloud提供的代碼,將Soundcloud的令牌交換換成新的訪問令牌,存儲並重定向到我的主頁'/'。但瀏覽器不會清除重定向上的哈希參數,這意味着我正被重定向到「http://myapp.com/#access_token=qwerty」。而這只是糟透了。有沒有解決這個問題或這是一個soundcloud「bug」? (不完全是一個錯誤,因爲它不會破壞一個東西,只有那些哈希參數纔是醜陋的)。

回答

0

一個原因,我能想到是確保JS交叉兼容的API [在您已關聯,但將嘗試總結的是,這裏線程回答了同樣的事情。也就是說,當使用JS對用戶進行身份驗證時,這是通過解析URL中的#之後的屬性來讀取身份驗證URL參數結果的唯一方法。據我所知,這是設計的原因。

是的,有一個變通:

實際上,API服務器具有未在Ruby驅動程序直接實現更多特徵。在client.authorize_url調用的結果是這樣的類型:

"https://#{host}#{AUTHORIZE_PATH}?response_type=code_and_token 
            &client_id=#{client_id} 
            &redirect_uri=#{URI.escape redirect_uri} 
            &#{additional_params}" 
(Ignore the `additional_params` part for now) 

response_type參數可以採用其他值也只可惜,這不是在Ruby API包裝了易於使用的功能。可能的值是:

  • response_type=code中嵌入其可隨後被用於產生該用戶的access_tokencode。這可以通過運行client.exchange_code(:code => params[:code])完成,如API參考文檔中所述。其中嵌入access_token並避免參數。但是,與code參數不同,access_token不是查詢參數,而是以#作爲前綴,所以JS是獲取此值的唯一方法。

您可以在此處驗證:http://developers.soundcloud.com/docs/api/reference#connect。其中一個參數可以更改爲response_type。附加參數是display,statescope列出在上面的鏈接

+0

已經閱讀您的問題的答案,只是沒有時間來測試它。將盡快完成並通過反饋回覆您。還會在那裏報告code_and_token問題,如果它是一個JavaScript黑客,它應該出現在他們的javascript包裝上,我會說,在最壞的情況下它應該是一個authorize_url()參數。猴子補丁sux :) – ChuckE

+0

我確實在他們的GitHub頁面上打開了一個問題,並將一個提交到我的回購。想知道爲什麼他們會忽略這樣一個簡單的選項:) – Kashyap

+1

嗯,他們忽略了不止一件事。我們只是說這個#問題不是我唯一的與soundcloud的Oauth集成問題。但是,這將留在另一個問題/職位。 – ChuckE