Цель: безопасное и безопасное обновление пароля пользователя с использованием служб RESTful.RESTful update password
Я немного запутался о том, что рабочий процесс, используя лучшие практики, должны быть для:
1.) обновление пароля для пользователя, который знает, что есть существующий пароль
2.) сброс пароля если пользователь забыл.
3.) Являются ли URI (ресурсы) RESTful? Для целей этого веб-приложения мне просто нужны GET и POST для изменений.
Я считаю, что мой код может быть избыточным. Метод обновления пароля (показано ниже) не обновляет пароль правильно. Он меняет его, но когда я пытаюсь войти с новым паролем, установленным в new_password
, пароль не совпадает. Я так же следил за этим STACKs answer Майклом Мерикелем для обновления.
пользователя = DBSession.query (Пользователь) .filter_by (электронная почта = электронная почта) .first() если пользователь: user.password = new_password
Благодарим Вас за какие-либо идеи/ввода. Я новичок и хочу правильно закодировать.
Все это через HTML, а не JSON.
Software: 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 Я использую код аутентификации Pyramid для входа в систему. Что касается пароля сброса, я понятия не имею, как это сделать. Можете ли вы указать мне на то, что не является Django, поскольку я использую SQLAlchemy и Pyramid. Может быть, пример псевдокода? Это было бы очень полезно в качестве плана. Или ссылки? благодаря!!! – thesayhey