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