[英]Authenticating a non-ORM User Resource via TastyPie
我正在嘗試將Django與非ORM數據源一起使用,並且通過我的自定義后端訪問其他資源而未進行任何身份驗證成功時,現在我需要引入用戶身份驗證。 沒有本地數據庫。 當我收到一個請求(例如,用用戶名和密碼發出的cURL命令)時,我需要對遠程URL執行HTTP基本身份驗證,成功后,我應該返回一個本地創建的用戶對象,該對象只有一個用戶名,沒有花哨的地方。 因此,在我的Tastypie資源中,我這樣寫:
class dict2obj(object):
"""
Convert dictionary to object
@source http://stackoverflow.com/a/1305561/383912
"""
def __init__(self, d):
self.__dict__['d'] = d
def __getattr__(self, key):
value = self.__dict__['d'][key]
if type(value) == type({}):
return dict2obj(value)
return value
class RemoteAuth(Authentication):
def is_authenticated(self, request, **kwargs):
username = request.user.username
password = request.user.password
r = requests.get(AUTHENTICATION_URL, auth=(username, password))
if r.status_code == 200:
return True
return False
class UserResource(Resource):
username = fields.CharField(attribute='username')
class Meta:
resource_name = 'user'
authentication = RemoteAuth()
authorization = Authorization()
def obj_get_list(self, request=None, **kwargs):
result = []
posts.append(dict2obj(
{
'username': request.POST.get('username'),
}
))
return result
但是,這當然是行不通的,因為身份驗證對象無法獲得這樣的密碼。 請提出一種不涉及任何本地數據庫的刪除用戶身份驗證的好方法。
如果您想進行用戶身份驗證而又不存儲任何實際數據,則可以使用session
或cookies
(最后一種選擇)。 會話數據可以被加密並存儲在會話cookie本身或側面cookie中。
那將如何工作?
您可以創建一個端點,例如api/v1/user/login
,作為UserResource
方法來處理用戶身份驗證/登錄。 您可以這樣做:
def override_urls(self):
return [
url(r"^(?P<resource_name>%s)/login%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('user_login'), name="api_user_login"),
]
def user_login(self, request, **kwargs):
# Authentication process happens here.
return self.create_response(request, {})
為了使上述方法起作用,您必須導入tastypie.utils.trailing_slash
和django.conf.urls.url
。 不幸的是,spastepie不支持任何幫助方法來減輕痛苦。
然后,在user_login
方法中,您將針對遠程端點對通過POST
傳遞的憑據進行身份驗證,並將用戶名和密碼以及任何特定於遠程身份驗證端點的數據存儲在request.session
。 然后,您可以在RemoteAuthentication
檢查會話密鑰是否存在。
如果會話是本地文件系統中的數據,則可以認為其中的數據更加安全。 如果您決定將會話數據存儲在加密的cookie中,則必須為每個會話密鑰存儲一個值和一個校驗和,可能在單個cookie條目中或在單獨的cookie條目中。
由於用戶將以純文本形式傳遞其憑據來登錄,因此您可以考慮通過SSL為user_login
視圖提供服務(確保cookie才不是secure_only
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.