Twisted: February 2009 Archives

HDEラボの桜井です。
今日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

About this Archive

This page is a archive of entries in the Twisted category from February 2009.

Twisted: January 2009 is the previous archive.

Twisted: March 2009 is the next archive.

Find recent content on the main index or look in the archives to find all content.