Channel API-生产中的无效令牌,可在开发服务器上使用

乔纳森·弗兰克尔(Jonathan Frankel)

我在使用Channel API时遇到了困难,但仅限生产环境。在开发服务器上可以运行,但是在生产环境中,我的javascript中出现了Invalid + token错误,而我的Python中出现了空白错误。

这是我的服务器端代码。“ channel_test”是我的控制器,“ do_send_message”是一个延迟的函数,“ send_message”是一个带有try-except块的包装器。基本上是创建通道,将令牌设置为cookie,然后调用延迟的任务直到计数器达到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”。这基本上是从cookie中读取令牌,打开连接,并且每次传递消息时,都会将消息写入通知托盘,直到消息==“完成!”。然后重新加载页面。但是,可以这样说,它立即失败,并且onError打印'Object {description:“ Invalid + token。”,代码:“ 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();
    }
});

即使我在生产环境中遇到此问题,这也可以在我的开发服务器上完美运行。

提前致谢。

乔纳森·弗兰克尔(Jonathan Frankel)

好的,这令人沮丧,但是我想我已经知道该令牌具有一定的未证明最大长度。我将client_id设置为

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

代替

client_id = self.user.email()+key

现在就可以了。当然,令人讨厌的是(1)它可以在dev服务器上运行,而不是在生产环境上运行;(2)该错误不是很有帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Android API 29应用中无法在通道“ channel_id_here”上发布通知失败

为什么Sendgrid API可在localhost上运行,但在服务器上需要另一个API

在服务器上存储API密钥

净值closeFuture()。sync()。channel(); 块休息API

有关授权令牌的信息存储在ASP.NET WEB API服务器上?

在生产服务器上监视Django Rest Framework API

使用Phoenix Channel Cross Origin

开发/生产中的Ansible服务器/组

来自身份服务器连接\令牌的令牌对我的API无效

REST API Java微服务可在同一应用程序服务器中使用

ASP.NET Core API-500内部服务器错误,仅在生产中

服务器上用于Graph API的ADAL令牌

如何使用channel.overwritePermissions

Laravel Passport:API的令牌存储在服务器上吗?在哪里?

MERN API GET请求在Heroku上返回404,可在本地Raspi服务器上使用

Plumber API可在服务器上使用,但在我使用systemd进行设置时无法使用

在服务器上的dotnet core 3.1 Web API开发sql连接失败

是否可以使用Rest-API在不使用Admin SDK的应用服务器上订阅令牌?

我可以使用客户端访问/刷新令牌来访问服务器上的Google API

RouteMapping可在开发服务器上使用,但会在生产中产生404

Chrome应用-使用GAE频道javascript API调用channel.open()时出错

为什么在使用App Engine Channel API时进行如此多的XHR轮询

使用Channel API时内部通道错误过多

在服务器/ API上从iOS客户端检查OAuth Facebook令牌

处理App Engine Channel API的超出配额

python服务器上的API参数中提供了无效的appsecret_proof

使用激活的API密钥在Evernote生产中生成身份验证令牌时出错

基于 Django rest 函数的 api 中的 Swagger 在 ubuntu 服务器(生产)上无法正确显示

Nuxt 后端的 API Koa 服务器不在 Heroku(生产)上运行