我在python和web2py中都是新手。我的项目是使用angularjs作为前端,将web2py作为后端使用Rest Service。
我注意到web2py已经开发了用于身份验证和授权的类Auth
。但是,如果我使用Rest Api,我真的不知道如何在Rest API上重用这个类。
例如,我尝试进行ajax调用以注册新用户:
$http.post('/myapp/authentication/register', user)
以下代码根本不起作用:
def register():
return dict(form=auth.register())
我必须天真地以手动方式插入auth_user
表:
def register():
username = request.vars.username
password = request.vars.password
email = request.vars.email
row = db.auth_user(username=username)
if not row:
db.auth_user.insert(username=username, password=password, email=email)
else:
raise HTTP(409, 'username exists')
此方法确实可以将新用户插入auth_user
表。但是,当我尝试使用方法login_bare
时:
login_bare(self, username, password)
上述方法注册的用户总是失败。我有什么方法可以解决这个问题吗?
答案 0 :(得分:3)
db.auth_user.insert(username=username, password=password, email=email)
上面是插入明文密码。但是,默认情况下,db.auth_user.password
字段具有哈希密码的CRYPT()
验证程序,哈希值是登录时检查的内容。通常,在提交和处理表单时会运行字段验证程序(包括密码字段的CRYPT
验证程序)(在这种情况下不会发生这种情况,因为您没有使用web2py表单来提交注册)。但是,您可以按如下方式运行验证器:
db.auth_user.validate_and_insert(username=username, password=password,
email=email)
答案 1 :(得分:0)
看来你在auth表中创建了一个用户记录,很好。但是你在哪里登录用户?您正在使用的auth模型基本上是用户在UI中执行的操作 - 首先注册,稍后使用用户ID和密码登录。
这种授权方式对于REST客户端来说并不理想,原因有多种,其中一个原因是典型的REST客户端不像浏览器那样,不维护cookie,因此无法维护会话。您可以要求您的REST客户端维护cookie,但这很奇怪。
我建议使用为REST构建的授权框架。我们用3Scale取得了不错的成绩。这为您提供了一种定义用户及其权限的方法;提供用户管理其帐户的门户(例如,可以重新发行密钥);如果你选择把它放在那里,甚至可以访问API doco。
如果您不喜欢这种方法,请考虑做亚马逊所做的事情 - 为每个用户发布公钥和私钥,并建立客户端必须如何签署每个请求的协议。您可以从开源AWS工具中获取解决方案。
简而言之,您可能会找到一种方法来为REST创建用户身份验证框架功能,但如果不这样做,您将获得更好的结果。