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 から提供されたコードを取得しています。Soundcloud のトークン交換に ping を実行して新しいアクセス トークンを取得し、それを保存して、私のホームページ '/' にリダイレクトします。しかし、ブラウザはリダイレクト時にハッシュ パラメータを消去しないため、「http://myapp.com/#access_token=qwerty」にリダイレクトされます。そして、それはただひどいです。この問題の回避策はありますか、それともサウンドクラウドの「バグ」ですか? (何かを壊すわけではないので、厳密にはバグではありません。そこにハッシュ パラメータがあるのは単純に醜いだけです)。

4

1 に答える 1

0

[あなたがリンクしたそのスレッドで同じことを答えましたが、ここでそれを要約しようとします]

私が考えることができる理由の1つは、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値を取ることもできますが、残念ながら、これはRubyAPIラッパーですぐに利用できる機能ではありません。可能な値は次のとおりです。

  • response_type=codecodeこれは、後でユーザーのを生成するために使用できるを埋め込みaccess_tokenます。client.exchange_code(:code => params[:code])これは、APIリファレンスドキュメントに記載されているように実行することで実行できます。
  • response_type=tokenこれは、を埋め込み、パラメータaccess_tokenを回避しcodeます。ただし、パラメーターとは異なり、codeaccess_tokenクエリパラメーターではなく、接頭辞としてaが付いている#ため、この値を取得する唯一の方法はJSです。

これはここで確認できます:http://developers.soundcloud.com/docs/api/reference#connect。変更できるパラメータの1つはresponse_type。です。追加のパラメータはdisplaystatescopeあり、上記のリンクにリストされています

于 2013-01-14T15:31:20.810 に答える