1

したがって、私はnode.jsとfayeに非常に慣れていないため、これはかなり基本的なことだと思いますが、何を尋ねるべきかわかりません。

ノードjitsuで実行されているfayeサーバー用に次のセットアップがあります。

var http = require('http'),
    faye = require('faye');

var bayeux = new faye.NodeAdapter({mount: '/faye', timeout: 45});

// Handle non-Bayeux requests
var server = http.createServer(function(request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.write('Hello, non-Bayeux request');
  response.end();
});
bayeux.attach(server);
server.listen(8000);

var fayeToken = "myToken";

var serverAuth = {
  incoming: function(message, callback) {
    // Add an error if the tokens don't match
    if (fayeToken !== message.ext.auth_token)
        message.error = 'Invalid auth token';

      // Call the server back now we're done
      callback(message);
  }
};

bayeux.addExtension(serverAuth);

次に、それに接続するレールアプリがあります。

serverAuth を追加する前は、問題なく動作していました。

私がそのようにカールすると:

curl http://myapp.jit.su/faye -d 'message={"channel":"/alerts", "data":"hello", "ext":{"auth_token":"myToken"}}'

成功メッセージが表示されます。

Rails アプリの JS ファイルには、次のものがあります。

$(function() {
    //FAYE CLIENT
    var faye = new Faye.Client('http://myapp.jit.su/faye');
    faye.setHeader('ext.auth_token', 'myToken');
    faye.subscribe("/alerts", function(data) {
        alert(data);
    });
});

Rails アプリが faye スクリプト用に読み込まれると、bad request 400 エラーが発生するようになりました。

送信されるパラメーターは具体的には次のとおりです。

[{"channel":"/meta/handshake","version":"1.0","supportedConnectionTypes":["callback-polling"],"id":"1"}]

そのため、設定しているヘッダー パラメータは、faye が行うこの「メタ」ハンドシェイクで送信されていないようです。

このサーバー認証を導入する前は、問題なく機能し、メッセージをアプリにカールさせることができました。ダイスはありません。

私が間違っているアイデアはありますか?

ありがとう!

4

2 に答える 2

2

今後の参考のために:

メタ呼び出しを行っていないことを確認する必要がありました。

var serverAuth = {
  incoming: function(message, callback) {
    // Let non-subscribe messages through
        if (message.channel.indexOf("/meta/") !== 0){
            if (fayeToken !== message.ext.auth_token){
                message.error = 'Invalid auth token';
            }
        }   
      callback(message);
  }
};
于 2012-05-16T02:11:19.143 に答える
1

ここには 2 つの問題があります。まず、メッセージにフィールドがない場合、拡張機能は失敗しextます。チェックする前にチェックする必要がありますmessage.ext.auth_token

var serverAuth = {
    incoming: function(message, callback) {
    // Let non-subscribe messages through
        if (message.channel.indexOf("/meta/") !== 0){
            if (!message.ext || fayeToken !== message.ext.auth_token){
                message.error = 'Invalid auth token';
            }
        }   
        callback(message);
    }
};

また、何を認証しようとしているのかわかりません。if (message.channel.indexOf("/meta/") !== 0)メタ以外のメッセージ、つまり送信されたすべてのメッセージに一致しますpublish()(メタ メッセージは、ハンドシェイク、ポーリング、(un)subscribe、および切断に使用されます)。つまり、誰でもメッセージを発行できますが、サーバーのみが任意のチャネルにサブスクライブできます。

2 つ目extは、メッセージ自体の一部ですが、setHeader()HTTP ヘッダーの設定に使用されます。つまり、トランスポート層の一部です。extメッセージに追加するには、拡張機能を使用する必要があります。

client.addExtension({
    outgoing: function(message, callback) {
        message.ext = message.ext || {};
        message.ext.auth_token = THE_TOKEN;
        callback(message);
    }
});
于 2012-05-17T09:37:02.387 に答える