使用Channel API时,是否可以将token和client_id传递给客户端?

时间:2012-02-23 19:46:45

标签: python google-app-engine channel-api

我需要创建一个应用程序,其中GAE服务器将始终只与一个客户端通信(即一条消息应始终只发送给一个客户端)。

我执行以下操作 -

的Python:

def get(self):
    # generate token, when page is loaded
    client_id = uuid.uuid4().hex
    token = channel.create_channel(client_id)
    template_values = {'token': token,
                       'client_id': client_id
                       }
    self.response.out.write(template.render('page.html', template_values))

def post(self):
    # reply to the client
    ... 
    client_id = self.request.get('id')
    channel.send_message(client_id, message)

使用Javascript:

sendMessage = function(field) {
  $.ajax({
    type: "POST",
    url: "/",
    data: "f=" + field + "&id=" + "{{ client_id }}", // WARNING!
    contentType: "application/x-www-form-urlencoded",
    success: function(data) {
    }
  });          
};

onOpened = function() {
  connected = true;
  sendMessage('opened');
};
onMessage = function(msg) {
  alert(msg.data);
};
onError = function(err) {
  alert(err);
};        
onClose = function() {
  alert("close");
};        
// open new session
channel = new goog.appengine.Channel('{{ token }}'); // WARNING!
socket = channel.open();
socket.onopen = onOpened;
socket.onmessage = onMessage;
socket.onerror = onError;
socket.onclose = onClose;

效果很好,但是在这种情况下,tokenclient_id都会传递给客户端。可以吗?

1 个答案:

答案 0 :(得分:0)

没有技术理由不这样做。如果您担心安全性,则令牌更有价值:可以侦听您的流量的攻击者可以获取令牌并在不同的上下文中收听频道消息。 clientid不会让他们那样做。

但我确实有一个问题:为什么不在POST响应中返回消息,而不是通过频道发送消息?或者示例代码是否仅为示例简化了?