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