問題タブ [rack-middleware]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby - [Facebook][Canvas] 元のリクエスト方法を抽出
短縮版
POST
Facebook が Web アプリケーションに対して実行しているリクエストから元のリクエスト メソッドを取得することは何とか可能ですか?
ロングバージョン
現在の Web アプリケーション Facebook キャンバス フレームを最低レベルで互換性を持たせたいと考えています。
Facebookキャンバスについて
Facebook のアプリは、Canvas フレームに読み込まれる Web ページです。ユーザーが Facebook で Canvas アプリを読み込むと、そのページの iframe 内に Canvas URL が読み込まれます。これにより、アプリは標準の Facebook クロム内に表示されます。
私はRubyプログラマーであり、Rack Middlewareはこの問題に対する合理的な解決策のようです。
ラックについて
Rack は、Ruby と Ruby フレームワークをサポートする Web サーバー間の最小限のインターフェースを提供します。
ラックミドルウェアについて
サーバーとフレームワークの間で、ラックはミドルウェアを使用してアプリケーションのニーズに合わせてカスタマイズできます
各ミドルウェアは、このオブジェクトと呼ばれるオブジェクトで初期化され、env
ある種のハッシュです。REQUEST_METHOD
HTTP リクエスト メソッドを表すキーが含まれています。
Facebook はすべてのリクエスト メソッドを に変換しPOST
ます。POST
アプリケーションを Facebook Canvas コンテキストで動作させるには、アプリケーションにルートを追加する必要があります。
env['REQUEST_METHOD']
代わりに、元のリクエスト メソッドに書き直したいと思います。
調査中に、 rack-facebookという宝石を見つけました。
この宝石はまさに私が望むことをしています。params から抽出['fb_sig']['request_method']
し、に割り当てenv['REQUEST_METHOD']
ます。
悲しいことに、facebook dev blog でブログエントリも見つけました
すべての Canvas アプリは signed_request を処理する必要があります (fb_sig は削除されます)
2011 年 5 月 10 日午後 8 時 25 分
Facebook署名付きリクエストについて
特定のタイプのアプリでは、パーミッションが要求される前であっても、いくつかの追加情報フィールドを含む署名付き要求がアプリに渡されます。
Facebook 開発者用ドキュメントを調べたところ、リクエスト メソッドまたは類似のものがパラメーターの一部ではなくなっていることがわかりましたsigned_request
。
POST
Facebook が Web アプリケーションに対して実行しているリクエストから元のリクエスト メソッドを取得することは何とか可能ですか?
ruby-on-rails - ミドルウェアで実行中のスレッドが古いバージョンの親のインスタンス変数を使用しています
Heroku チュートリアルを使用して websocket を実装しました。
Thin では正常に動作しますが、Unicorn と Puma では動作しません。
また、クライアントのメッセージに応答するエコー メッセージも実装されています。各サーバーで適切に動作するため、websockets の実装に問題はありません。
Redis のセットアップも正しいです (すべてのメッセージをキャッチし、subscribe
ブロック内のコードを実行します)。
今はどのように機能しますか:
サーバーの起動時に、空の@clients
配列が初期化されます。次に、Redis をリッスンし、そのメッセージを @clients 配列から対応するユーザーに送信するための新しいスレッドが開始されます。
ページの読み込み時に、新しい websocket 接続が作成され、@clients 配列に保存されます。
ブラウザーからメッセージを受信すると、同じユーザーに接続されているすべてのクライアントにメッセージを送り返します (その部分は、Thin と Puma の両方で適切に機能しています)。
Redis からメッセージを受信した場合、@clients 配列に保存されているすべてのユーザーの接続も検索します。ここで奇妙なことが起こります:
Thin で実行している場合、@clients 配列で接続を検出し、それらにメッセージを送信します。
Puma/Unicorn で実行している場合、@clients 配列は、その順序で試しても (ページのリロードなどを行わずに) 常に空です。
- ブラウザからメッセージを送信 ->
@clients.length
が 1 の場合、メッセージが配信されます - Redis 経由でメッセージを送信 ->
@clients.length
は 0、メッセージは失われます - ブラウザからメッセージを送信 ->
@clients.length
は 1 のままで、メッセージは配信されます
- ブラウザからメッセージを送信 ->
誰かが私に欠けているものを明確にしてもらえますか?
Puma サーバーの関連構成:
関連するミドルウェア コード:
ruby-on-rails - ラック攻撃はIPをブラックリストに登録しません
Rack-attackとのやり取りはこれが初めてなので、コードに誤りがある可能性がある場合は遠慮なく指摘してください。私が試みているのは、次のようなルートにアクセスしようとしている人をブラックリストに登録するip
ことです攻撃は、上記の URL にアクセスしようとするものをブロックしていません。"/azenv.php", "/setup.php" etc..
.php
ip
私が実行しようとしているコードのブロックは次のとおりです。
ブロックのいくつかは、Wiki 自体からのものです。ここで何か間違っている場合は修正してください。
アップデート
これは、与えられた例から試しているコードです: