1

ページを提供するPythonのサーバーがあります。これらのページへのログインは、IdP(IDプロバイダー)を使用して行われます。したがって、ユーザーが私のサーバーページを開こうとすると、IdPページにリダイレクトされます。その間、サーバーはIdP応答のリッスンを開始します。ユーザーがIdPページにログインすると、IdPはデータをサーバーに送信します。サーバーはデータを処理し、ユーザーにページを表示します。

問題は、複数のクライアントがログインしようとした場合、サーバーが1つのIdPから最初の応答を受信すると、すべてのユーザーが最初のユーザーの資格情報でログインしたものとして私のページを表示することです。

つまり、サーバーがリッスンを開始すると、すべての人を待っています。最初のユーザーだけがログインすると、待機しているすべてのユーザーが同じ資格情報でログに記録されます。

この非常に大きな問題をどのように解決できますか?マルチスレッドが役立つかもしれませんか?

ここにいくつかの重要なコードがあります。idpによって応答されたデータの一部を、自分のページのログインフォームの「名前」フィールドにロードしたいとします。

class Login(django.forms.SelfHandlingForm):
    def __init__(self, *args, **kwargs):
        super(Login, self).__init__(*args, **kwargs)
        response = self.getIdPResponse()
        self.fields['name'].widget=forms.TextInput(attrs={'value': response['name']})


    def getIdPResponse(self):
        global response
        response = None
        timeout = 300
        class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
            def do_POST(self):
                global response
                self.send_response(200)
                self.send_header("Content-type", "text/html")
                self.end_headers()
                varLen = int(self.headers["Content-Length"])
                #response = urlparse.parse_qs(self.rfile.read(varLen))
                response = self.rfile.read(varLen)

                self.wfile.write("Log-in ok! now you can close this page.")
        httpd = BaseHTTPServer.HTTPServer(('0.0.0.0', 8080), RequestHandler)
        try:
            httpd.socket.settimeout(1)
        except BaseException as e:
            print e
        count = 0
        '''at this point, the IdP page is already showed to the user '''
        while response is None and count < timeout:
           try:
               httpd.handle_request()
               count = count + 1
               print 'waiting for the Idp answer...'
           except Exception as e:
               print e
        return response

このように、ユーザーが正常にログインすると、ログインを待機しているすべてのユーザーが「名前」フィールドに最初にログインしたユーザーの名前を表示します。明らかに、これは望ましくありません。

4

1 に答える 1

0

1 つのアプローチは、 twistedなどのイベント駆動型システムを使用して、getIdPResponseメソッドを 2 つの部分に分割することです。

  1. リクエストを送る
  2. 応答を処理する

その後、単一のスレッドはブロックされず、その間に他のクライアントにイベントをディスパッチできます。

アプリケーション ロジックを簡素化したい場合は、この上にブロッキング呼び出しのレイヤーをラップできますが、これはお勧めしません。

于 2013-01-24T16:33:43.137 に答える