【发布时间】:2016-03-13 22:40:30
【问题描述】:
目标:使用 RESTful 服务安全可靠地更新用户密码。
我对使用最佳实践的工作流应该用于什么有点困惑:
1.) 为知道现有密码的用户更新密码
2.) 如果用户忘记了,则重置密码。
3.) URI(资源)是 RESTful 的吗?就这个网络应用而言,我只需要 GET 和 POST 来进行更改。
我相信我的代码可能是多余的。密码更新方法(如下所示)未正确更新密码。它正在更改它,但是当我尝试使用new_password 中设置的新密码登录时,密码不匹配。我同样关注了 Michael Merickel 的 STACKs answer 进行更新。
user = DBSession.query(User).filter_by(email=email).first() 如果用户: user.password = new_password
感谢您提供任何见解/意见。我是新手,想正确编码。
所有这些都是通过 HTML 而不是 JSON。
软件:Python 2.7.9、Pyramid 1.5.7、SQLAlchemy 1.0.9
资源:
__init__.py
config.add_route('users', '/users')
config.add_route('user', '/users/{id:\d+}/{login}') #/{login} added login
config.add_route('reset_password', '/users/{username}/reset_password')#reset
config.add_route('new_password', '/users/{username}/new_password')#new
config.add_route('save_password', '/save_password')#new
views.py
#http://0.0.0.0:6432/users/dorisday/reset_password <--like this
@view_config(route_name='reset_password', renderer='templates/password_recovery.jinja2')
def forgot_password(request):
if request.method == 'GET':
username = request.params['username']
if username is not None:
user = api.retrieve_user(username)
return {}
#http://0.0.0.0:6432/users/macycat/new_password <--like this
@view_config(route_name='new_password', request_method='GET', renderer='templates/new_password.jinja2')
def new_password(request):
logged_in_userid = authenticated_userid(request)
if logged_in_userid is None:
raise HTTPForbidden()
user = api.retrieve_user(logged_in_userid)
return {'user': user.username}
@view_config(route_name='save_password', request_method='POST', renderer='templates/new_password.jinja2')
def save_password(request):
with transaction.manager:
logged_in_userid = authenticated_userid(request)
if logged_in_userid is None:
raise HTTPForbidden()
user = api.retrieve_user(logged_in_userid)
if 'form.submitted' in request.params:
password = request.params['old_password']
new_password = request.params['new_password']
confirm_password = request.params['confirm_password']
if new_password == confirm_password:
continue
if user is not None and user.validate_password(password): #encrypted way of checking password from DB
user.password = new_password
message = 'Whoops! Passwords do not match.'
transaction.commit()
raise HTTPSeeOther(location=request.route_url('login'))
return {'message': message, 'new_password': new_password}
SQLALCHEMY DB 方案中的哈希密码如下所示:
Storing and validating encrypted password for login in Pyramid
【问题讨论】:
-
你应该使用一些身份验证(oauth 可以进行身份验证并且它仍然很安静)......你也不应该实际更改密码,而是通过电子邮件发送关联的电子邮件帐户链接到“更改密码”类型的东西
-
@JoranBeasley 我正在使用 Pyramid 的验证码登录。至于重置密码,我不知道该怎么做。当我使用 SQLAlchemy 和 Pyramid 时,你能指出一些不是 Django 的东西吗?也许示例伪代码?作为蓝图,这将非常有帮助。还是链接?谢谢!!!
标签: python rest sqlalchemy pyramid