从扭曲的Web WSGI应用程序中访问客户端的x509证书

时间:2016-08-17 10:16:21

标签: python flask openssl twisted

我已经设置了一个twisted + flask https服务器,它也可以通过Twisted网站here上的文档进行基于证书的客户端身份验证。到目前为止,非常好。

除了使用证书对客户端进行身份验证之外,烧瓶应用程序中的应用程序代码还需要用户名(存在于客户端x509证书中)才能完成其工作。我找不到一种简单的方法来访问这些信息。信息(基于文档)似乎在进行身份验证时位于pyopenssl X509Name对象中,每次处理来自该客户端的请求时,我都需要在烧瓶层使用标识。

请求对象烧瓶似乎没有这个信息(除非我读错了),所以我假设我需要在Twisted级别修改一些选项以将它们发送到烧瓶。我还需要以某种方式将它们从OpenSSL层中取出。

你会怎么做?

1 个答案:

答案 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) 中检索其信息。