2

关于https://github.com/sinatra/sinatra/issues/596,我错误地将其诊断为 sinatra 错误。

我遇到以下问题:我正在使用 Soundcloud OAuth 工作流程在我的项目中实现单点登录。为此,我使用了“soundcloud” gem。因此,在被重定向到 soundcloud 的登录/授权表单并按下“连接”后,我被重定向回我指定为重定向 url 的应用程序中的 URL……但是一些哈希参数落后了!因此,假设我没有被重定向到“http://myapp.com/connect?code=123”,而是被重定向到“http://myapp.com/connect?code=123#access_token=qwerty” ”。由于散列参数不是 HTTP 协议的一部分,它确实对服务器有次要影响,但在客户端上,bleepin 散列参数并没有消失!基本上,在我的重定向端点上,我正在获取 soundcloud 给出的代码,ping Soundcloud 的令牌交换以获得新的访问令牌,将其存储并重定向到我的主页“/”。但是浏览器不会清除重定向时的哈希参数,这意味着我被重定向到“http://myapp.com/#access_token=qwerty”。这很糟糕。是否有解决此问题的方法,或者这是 soundcloud“错误”?(不完全是一个错误,因为它不会破坏任何东西,在那里有那些哈希参数简直是丑陋的)。

4

1 回答 1

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其中嵌入了code稍后可用于生成access_token用户的。这可以通过client.exchange_code(:code => params[:code])API 参考文档中提到的运行来完成。
  • response_type=token它嵌入access_token并避免了code参数。但是,与code参数不同的是,access_token它不是查询参数,而是以a为前缀,#因此,JS是获取该值的唯一方法。

您可以在此处验证这一点:http: //developers.soundcloud.com/docs/api/reference#connect。可以更改的参数之一是response_type. 附加参数是display,state并且scope在上面的链接中列出

于 2013-01-14T15:31:20.810 回答