SimpleXMLRPCServer & Autenticação

As funções abaixo podem ser utilizadas para obter o usuário e senha enviadas para um servidor criado com o SimpleXMLRPCServer do Python. Em uma classe derivada do SimpleXMLRPCRequestHandler, você pode fazer isso no método _dispatch, ou em cada método em particular, de acordo com sua necessidade.

A função getHeaders é genérica o suficiente para obter, como um dicionário, os headers de uma conexão HTTP. A getUserAndPassword usa a getHeaders para obter o header Authorization, verificar se o método de autenticação é Basic e, finalmente, decodificar o usuário e senha (usando o base64).

Isso está funcionando bem em um pequeno projeto (e eu sei que falta um pouco de tratamento de exceções ali, não estou preocupado com isso agora), mas não sei se é a maneira correta de fazer.

Por exemplo: se eu uso o módulo xmlrpclib, mais especificamente o ServerProxy, eu posso passar o usuário e senha pela URL (http://usuário:senha@host/…), que o módulo faz a autenticação por debaixo dos panos. No servidor, entretanto, não achei nada “pronto”, e achei um bocado estranho. Alguém tem idéia se há maneira mais “limpa” de se fazer isso?

from base64 import decodestring

def getHeaders(hdr):
 headers = {}
 for header in str(hdr).split("\n"):
   try:
     idx = header.index(":")
     name, content = header[:idx], header[idx+2:]
     headers[name] = content
   except:
     return headers

 return headers

def getUserAndPassword(headers):
 headers = getHeaders(headers)
 if not headers.has_key("Authorization"):
   raise AccessDenied

 auth = headers["Authorization"]
 if auth[:5] != "Basic":
   raise BadMethod

 return decodestring(auth[6:]).split(":")

Leave a Comment