我正在编写一个应用程序,它将包含一些 HTML 内容(显示表等)并且还有一个 JSON API。
对于普通 HTML,我AuthTktAuthenticationPolicy
用于身份验证和ACLAuthorizationPolicy
授权。因此,用户会看到一个登录表单,并在成功登录时auth_tkt
设置 cookie。该系统工作正常。
现在我想为 JSON API 复制一个类似的系统。问题是对于 API 请求,用户不一定会登录。所以每个请求都需要一个api_key
参数。根据密钥,如果我找到一个有效用户,我会发回 JSON。否则我会显示 403 页面。
一种方法是在每个视图中执行此操作
api_key = request.GET.get('api_key',None)
user = FrontEndUsers.User_by_api_key(api_key)
if user:
#Process view
else:
return HTTPForbidden
但是,对于每个视图来说,要完全按照身份验证策略所做的工作,似乎太多了样板文件。我可以为 JSON 路由指定单独的身份验证策略吗?或者有没有其他方法可以做到这一点?
编辑
再三考虑,即使使用AuthTktAuthenticationPolicy
,我也必须
security.authenticated_userid()
在每个视图中都这样做(如果我需要身份验证信息)。这我已经考虑到一个单独的函数中
def get_auth_info():
user_id = security.authenticated_userid()
login_info = {}
if user_id is not None:
login_info['login'] = True
login_info['logged_in_user'] = FrontendUsers.get_user_by_id(user_id).name
else:
login_info['login'] = False
return login_info
我可以在这个函数中包含 API_key 检查函数调用,这样我的视图都不会改变(我仍然只调用get_auth_info()
),但我可以检查是否提供了正确的 API 密钥。
我仍然想看看是否有其他方法可以做到这一点,或者我目前的方案是否有问题