TwistedでCGIの動くWebサーバを書いてみる、にBasic認証機能を追加してみる

| | Comments (0) | TrackBacks (0)
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

最後に、"site = server.Site(res)"となっていたところを、上記のクラスに置き換えます。
site = BasicAuthSite(res)
site.setPasswordFile(パスワードファイルのパス)
これでアクセスした場合に、Basic認証を行うことができます。

0 TrackBacks

Listed below are links to blogs that reference this entry: TwistedでCGIの動くWebサーバを書いてみる、にBasic認証機能を追加してみる.

TrackBack URL for this entry: https://lab.hde.co.jp/blog/mt-tb.cgi/91

Leave a comment

About this Entry

This page contains a single entry by Takeshi SAKURAI published on February 9, 2009 1:39 PM.

web.pyのテンプレート機能を使ってみるぞなもし was the previous entry in this blog.

Pythonでhtpasswd実装のメモを残してみる is the next entry in this blog.

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