2

채널 API에 문제가 있지만 프로덕션에서만 문제가 있습니다. dev 서버에서이 작동하지만 프로덕션에서 내 자바 스크립트에서 잘못된 + 토큰 오류가 발생하고 파이썬에서 여하튼 빈 오류가 발생합니다.채널 API - 프로덕션 환경에서 유효하지 않은 토큰, dev 서버에서 작동

내 서버 측 코드는 다음과 같습니다. 'channel_test'는 제 컨트롤러이고 'do_send_message'는 연기되는 함수이고 'send_message'는 try-except 블록이있는 래퍼입니다. 기본적으로 채널을 생성하고 토큰을 쿠키로 설정하며 카운터가 최대 100이 될 때까지 지연된 작업을 호출합니다. 작업이 실행될 때마다 채널을 통해 메시지를 보냅니다.

def channel_test(self, key): 
    if not users.is_current_user_admin(): return 403 
    client_id = self.user.email()+key 
    token = channel.create_channel(client_id, duration_minutes=10) 
    print 'token: %s' % token 
    self.response.set_cookie('token', urllib.quote(token)) 
    deferred.defer(do_send_message, client_id, _queue='retry') 

# channel communication 
def send_message(client_id, msg): 
    """ 
    msg is a dict 
    """ 
    if client_id: 
     print 'client_id: ', client_id 
     try: 
      channel.send_message(client_id, json.dumps(msg)) 
      print 'sent message %s' % msg 
     except Exception as e: 
      print 'something went wrong with msg, %s: %s, %s' % (msg, e, e.__str__()) 
    else: 
     print 'not sending message; no client id' 

def do_send_message(client_id, x=10): 
    time.sleep(1) 

    text = "here's a message! %s" % x 
    if x >= 100: 
     text = "Done!" 
    msg = {"text":text, "percent":x} 
    send_message(client_id, msg) 

    if x < 100: 
     deferred.defer(do_send_message, client_id, x+10, _queue='retry') 

'send_message'가 호출 될 때마다 실패하지만 'e'는 아무 것도 출력하지 않습니다. 로그의 결과는 다음과 같습니다.

something went wrong with msg, {'text': "here's a message! 10", 'percent': 10}: , 

또한 클라이언트 측 JavaScript가 연결을 열지 못합니다. 'Invalide + token'오류가 발생합니다. 이것은 기본적으로 쿠키에서 토큰을 읽고, 연결을 열고, 메시지가 전달 될 때마다 메시지 == '완료!'메시지가 나타날 때까지 알림 트레이에 메시지를 씁니다. 그런 다음 페이지를 다시로드합니다. 하지만, 즉시 실패하고 onError는 'Object {description : "Invalid + token.", code : "401"}'을 출력합니다.

// globals 
var channel, socket, hide; 
var $msg = $('#channel-message'); 
var $bar = $('#notification-tray .progress-bar'); 


onMessage = function(obj){ 
    var message = JSON.parse(obj.data); 
    if (message.percent !== undefined){ 
     $bar.css('width', message.percent+'%'); 
    } 
    switchMsg(message.text); 
}; 

onOpen = function(){ 
    $('#notification-tray').fadeIn(); 
    $bar.css('width', '10%'); 
}; 

onClose = function(){ 
    $('#notification-tray').fadeOut(); 
}; 

onError = function(err){ 
    $('#notification-tray').fadeOut(); 
    console.log(err); 
}; 


function closeAndReload(){ 
    socket.close(); 
    $.removeCookie('token', {path:'/'}); 
    $.removeCookie('hide', {path:'/'}); 
    location.reload(); 
} 

function switchMsg(msg){ 
    $msg.fadeOut(function(){ 
     $msg.html(msg); 
     $msg.fadeIn(function(){ 
      if (msg == 'Done!'){ 
       closeAndReload(); 
      } 
     }); 
    }); 
} 

function initializeChannel(){ 
    channel = new goog.appengine.Channel(token); 
    socket = channel.open(); 
    socket.onmessage = onMessage; 
    socket.onopen = onOpen; 
    socket.onclose = onClose; 
    socket.onerror = onError; 
} 


$(function(){ 
    token = $.cookie('token'); 
    if (token !== undefined && token != ""){ 
     initializeChannel(); 
    } 
}); 

프로덕션 환경에서이 문제가 발생하더라도 내 개발자 서버에서 완벽하게 작동합니다.

미리 감사드립니다.

답변

2

그래, 이건 실망 스럽지만 토큰이 문서화되지 않은 최대 길이를 가지고 있다고 생각했습니다. 나는

client_id = self.user.email()+key[0:10] 

대신

client_id = self.user.email()+key 

에 CLIENT_ID를 설정하고 그것을 작동합니다. 물론 그것은 (1) dev 서버에서 작동하고 (2) 오류는 매우 유익하지 않습니다.