我已经设置了一个twisted + flask https服务器,它也可以通过Twisted网站here上的文档进行基于证书的客户端身份验证。到目前为止,非常好。
除了使用证书对客户端进行身份验证之外,烧瓶应用程序中的应用程序代码还需要用户名(存在于客户端x509证书中)才能完成其工作。我找不到一种简单的方法来访问这些信息。信息(基于文档)似乎在进行身份验证时位于pyopenssl X509Name对象中,每次处理来自该客户端的请求时,我都需要在烧瓶层使用标识。
请求对象烧瓶似乎没有这个信息(除非我读错了),所以我假设我需要在Twisted级别修改一些选项以将它们发送到烧瓶。我还需要以某种方式将它们从OpenSSL层中取出。
你会怎么做?
答案 0 :(得分:0)
已更新:使用$(document).on("pagecreate", function() {
// bind click events
$(document).on('click', '#play', function() {
playVideo();
return false;
});
$(".ui-popup iframe")
.attr("width", 0)
.attr("height", "auto");
$("#popupVideo").on({
popupbeforeposition: function() {
initYoutubePlayer();
// call our custom function scale() to get the width and height
var size = scale(497, 298, 15, 1),
w = size.width,
h = size.height;
$("#popupVideo iframe")
.attr("width", w)
.attr("height", h);
},
popupafterclose: function() {
$("#popupVideo").html("<span></span>");
$("#popupVideo iframe")
.attr("width", 0)
.attr("height", 0);
},
});
});
function initYoutubePlayer() {
var tag = document.createElement('script');
tag.src = 'https://www.youtube.com/iframe_api';
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var player;
function onYouTubeIframeAPIReady() {
alert('onYouTubeIframeAPIReady');
player = new YT.Player('iframe-video', {
events: {
'onReady': onPlayerReady,
}
});
};
function onPlayerReady(event) {
alert('ready');
};
alert('initialized');
}
function playVideo() {
alert('playVideo...');
//player.playVideo();
}
代替HTTPChannel.allHeadersReceived
来支持分块请求。
您可以使用HTTP标头存储连接信息:使用Protocol.dataReceived
方法设置它们并从HTTPChannel.allHeadersReceived
检索,例如:
flask.request.headers
我不熟悉使用扭曲的客户端证书。我假设您可以在from twisted.application import internet, service
from twisted.internet import reactor
from twisted.web.http import HTTPChannel
from twisted.web.server import Site
from twisted.web.wsgi import WSGIResource
from flask import Flask, request
app = Flask('app')
@app.route('/')
def index():
return 'User ID: %s' % request.headers['X-User-Id']
class MyHTTPChannel(HTTPChannel):
def allHeadersReceived(self):
user_id = 'my_user_id'
req = self.requests[-1]
req.requestHeaders.addRawHeader('X-User-Id', user_id)
HTTPChannel.allHeadersReceived(self)
class MySite(Site):
protocol = MyHTTPChannel
application = service.Application('myapplication')
service = service.IServiceCollection(application)
http_resource = WSGIResource(reactor, reactor.getThreadPool(), app)
http_site = MySite(http_resource)
internet.TCPServer(8008, http_site).setServiceParent(service)
中检索其信息。