2

我真的是python和web2py的新手。我的项目使用 angularjs 作为前端,使用 web2py 作为后端服务。

我注意到 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)

通过上述方法注册的用户总是失败。有什么办法我需要解决这个问题吗?

4

2 回答 2

3
db.auth_user.insert(username=username, password=password, email=email)

Above you are inserting the plaintext password. However, by default the db.auth_user.password field has a CRYPT() validator that hashes the password, and the hash is what is checked upon login. Typically the field validators (including the password field's CRYPT validator) are run when the form is submitted and processed (which doesn't happen in this case because you are not using a web2py form to submit the registration). However, you can run the validators as follows:

db.auth_user.validate_and_insert(username=username, password=password,
                                 email=email)
于 2013-08-07T13:44:27.070 回答
0

看来您正在 auth 表中创建用户记录,很好。但是你在哪里登录用户?您使用的身份验证模型基本上是用户在 UI 中所做的事情——首先注册,然后使用用户 ID 和密码登录。

这种授权方式对于 REST 客户端并不理想,原因有几个,其中之一是典型的 REST 客户端的行为不像浏览器,不维护 cookie,因此无法维护会话。您可以要求您的 REST 客户端维护 cookie,但这很奇怪。

我建议使用为 REST 构建的授权框架。我们使用 3Scale 取得了不错的成绩。这为您提供了一种定义用户及其权限的方法;提供用户管理其帐户的门户(例如,可以重新颁发密钥);如果您选择将它放在那里,甚至可以访问 API doco。

如果您不赞成这种方法,请考虑采用 Amazon 的做法——为每个用户颁发公钥和私钥,并为客户端必须如何签署每个请求建立协议。您可能可以从开源 AWS 工具中找到解决方案。

简而言之,您可能会找到一种方法使用户身份验证框架适用于 REST,但如果不这样做,您将获得更好的结果。

于 2013-08-07T12:45:15.520 回答