2016-08-17 3 views
0

Twistedサイトの文書hereに従って、証明書ベースのクライアント認証も行うツイスト+フラスコhttpsサーバーをセットアップしました。ここまでは順調ですね。Twisted Web内のクライアントのx509証明書にアクセスするWSGIアプリ

フラスコアプリ内のアプリケーションコードには、証明書を使用してクライアントを認証するだけでなく、そのジョブを実行するためにユーザー名(クライアントx509証明書に存在する)が必要です。私はこの情報にアクセスする簡単な方法を見つけることができませんでした。この情報は、認証時にpyopenssl X509Nameオブジェクトにあるようですが、そのクライアントからの要求を処理するたびに、フラスコレイヤーにIDが必要です。

リクエストオブジェクトのフラスコにはこの情報がないようですが(私が間違って読んでいない限り)、フラスコに送るためにツイストレベルでいくつかのオプションを変更する必要があると仮定します。私は何とかOpenSSL層からそれらを取り除く必要もあります。

どうすればよいですか?

答えて

0

Protocol.dataReceivedの代わりにHTTPChannel.allHeadersReceivedを使用して、チャンク要求をサポートしました。

あなたは、接続情報を格納するためのHTTPヘッダーを使用することができます: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) 

私はツイストでクライアント証明書を使用に慣れていませんよ。私はProtocol.transportで情報を取得できると仮定します。

+0

ありがとうございました。このdata_receivedの実装では、単一の要求を複数のdata_received呼び出しに分割していないと想定していることが懸念されます。これは正当な仮定ですか? – orm

+0

@ormはい、そうです、私はそれについて考えませんでした。より正確な方法は 'HTTPChannel.allHeadersReceived'をオーバーライドすることです。コード例を更新しました。 –

関連する問題