目標:使用RESTful服務安全且安全地更新用戶密碼。RESTful更新密碼
我有點困惑的工作流程,採用最佳實踐,應該是什麼:
1)更新了誰知道有現有的密碼,用戶密碼
2)設密碼如果用戶忘記了。
3.)URIs(資源)是RESTful嗎?爲了這個Web應用程序的目的,我只需要GET和POST進行更改。
我相信我的代碼可能是多餘的。密碼更新方法(如下所示)未正確更新密碼。它正在改變它,但是當我嘗試使用在new_password
中設置的新密碼登錄時,密碼不匹配。我同樣按照Michael Merickel的這個STACKs answer來更新。
用戶= DBSession.query(用戶).filter_by(電子郵件=電子郵件)。首先() 如果用戶: user.password的= NEW_PASSWORD
謝謝你的任何見解/輸入。我是新手,想要正確編碼。
所有這一切都是通過HTML而不是JSON。
軟件:Python的2.7.9,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我正在使用金字塔的身份驗證代碼進行登錄。至於重置密碼,我不知道該怎麼做。你能指出我的東西是不是Django,因爲我使用SQLAlchemy和Pyramid。也許例如僞代碼?作爲藍圖,這將非常有幫助。還是鏈接?謝謝!!! – thesayhey