如何重新使用Auth注册,在Web2py中验证为Rest Api

时间:2013-08-07 12:12:57

标签: python web2py

我在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)

上述方法注册的用户总是失败。我有什么方法可以解决这个问题吗?

2 个答案:

答案 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创建用户身份验证框架功能,但如果不这样做,您将获得更好的结果。