HDEラボの桜井です。
今日2/9はなんと夏目漱石の誕生日(1867年)なんですねぇ。
今回は、Twistedを使ったWebサーバにBasic認証機能を追加してみます。
まずは、必要なパッケージをimportします。
次に、server.Siteクラスを継承したBasic認証を可能にするクラスを作成します。
今日2/9はなんと夏目漱石の誕生日(1867年)なんですねぇ。
今回は、Twistedを使ったWebサーバにBasic認証機能を追加してみます。
まずは、必要なパッケージをimportします。
from twisted.application import internet, service from twisted.web import error, server, twcgi, static, resource from twisted.cred import checkers, credentials import crypt import copy
次に、server.Siteクラスを継承したBasic認証を可能にするクラスを作成します。
class BasicAuthSite(server.Site): # パスワードファイルをセットします def setPasswordFile(self, file): self.passwordFile = file # server.Site.getResourceFor をオーバーライドします # superの使い方がよくわからなかったのでこんなコードになってます、すいません def getResourceFor(self, request): # ユーザ名とパスワードが違ったら、認証ダイアログをあげる if self.authorize(request.getUser(), request.getPassword()) == False: request.setResponseCode(401, "Authorization Required") request.setHeader('WWW-Authenticate', 'Basic realm="Authorization Required"') request.site = self request.sitepath = copy.copy(request.prepath) return resource.getChildForRequest(self.resource, request) # 認証を行うメソッド def authorize(self, user, password): # データベースファイル(Apacheのhtpasswdコマンドで作成)を開く file = checkers.FilePasswordDB(self.passwordFile) # 認証 try: # ファイルよりユーザを取得 data = file.getUser(user) # ユーザ名とパスワードをチェックするクラスのインスタンスを生成 check = credentials.UsernameHashedPassword(data[0], data[1]) # 入力されたパスワードが正しいかどうかチェックしてboolean型で返す return check.checkPassword(crypt.crypt(password, data[1])) # 該当するユーザがいない場合はFalse except KeyError: return False
最後に、"site = server.Site(res)"となっていたところを、上記のクラスに置き換えます。
これでアクセスした場合に、Basic認証を行うことができます。
site = BasicAuthSite(res) site.setPasswordFile(パスワードファイルのパス)
Leave a comment