在App Engine上使用Python/Django非关系数据库的JSON认证
我正在使用Google App Engine搭建一个网站,使用的是Python和Django non-rel。现在HTML的显示和数据的读取/发布都运行得很好。但随着我不断推进,我希望能用AJAX来进行很多更新,最终还想在安卓和iPhone等移动设备上实现。
我的页面使用的是Django non-rel,登录和登出认证在HTML中运行得很好。但是,通过JSON发送的更新信息需要验证用户是否有权限进行更改。我觉得仅仅为AJAX调用做认证并不难,因为你仍然是在访问网站,但如果要加入手机的认证呢?
我对此还很陌生,我该从哪里开始呢?
我该如何在GAE上设置服务,以便进行经过认证的CRUD操作?理想情况下,我希望能为AJAX、安卓等使用完全相同的REST服务。
1 个回答
在Python中,这个过程非常简单。你只需要创建一个装饰器方法来检查用户的身份认证,然后把这个装饰器加到任何需要身份认证的函数上。
def admin(handler_method):
"""
This decorator requires admin, 403 if not.
"""
def auth_required(self, *args, **kwargs):
if users.is_current_user_admin():
handler_method(self, *args, **kwargs)
else:
self.error(403)
return auth_required
...
@admin
def crudmethod_update(self, *args, **kwargs):
...
不过,这里假设你有一些关于如何获取用户数据的前提条件,但无论你的设置是什么,原理都是一样的。你可能会觉得,ajax请求在服务器上处理的方式有所不同,但实际上,和任何标准的HTTP请求一样,你得到的请求头是相同的。如果你能在普通的HTML请求中检查身份认证,那么你实际上可以用ajax请求来劫持表单提交,得到相同的结果。你可能希望得到JSON格式的数据,或者更小的HTML片段。为此,你可以选择:
在请求中添加一些可以检查的内容,以确认这是一个ajax请求,并根据这个进行调整。
专门实现一个RPC模型来处理ajax请求。
在处理身份认证方面,你可以使用google.appengine.ext users库,依赖于谷歌账户的认证,或者你可以自己编写一个。自己编写意味着你需要实现一个会话机制(用于在用户会话中保持状态),并将密码以哈希和加盐的方式存储以便进行验证。