2016-08-22 1 views
2

Я создаю приложение для пирамиды. В «обычном» использовании пользователи должны использовать типичное имя пользователя/пароль для входа в систему и многое сделать. Документация Pyramid сделала довольно легким вырезать и вставить и добиться этого.Идентификатор/авторизация с временными URL-адресами в Pyramid

Тем не менее, теперь я хочу продлить ограничение (как по полномочию, так и по времени - разрешение истекает на определенную дату) возможность редактирования людям, с которыми я не хочу сталкиваться с каким-либо интерфейсом учетной записи/пароля. Я просто хочу отправить им по электронной почте ссылку, которую я создаю, и когда они нажимают на ссылку, я хочу, чтобы они приземлились на связанную страницу и узнали и разрешили внести некоторые ограниченные изменения.

Все очевидные вещи, такие как создание ссылки, сохранение ее в базе данных, сопоставление имени пользователя и даты истечения срока, не проблема. Он подключается к инфраструктуре Identity/auth Pyramid, и я не знаю, как это сделать. Я сделал это настолько далеко, не углубленно понимая их код, и надеюсь, что у кого-то есть пример кода того, что я хочу сделать, лежащего вокруг, что может позволить мне продолжать не погружаться в эту тему.

Или, если ответ прекратился, ленив и прочитал документацию, ну, это стоило мне немного спросить. :-)

+0

Другой способ взглянуть на это - любой пользователь _anonymous_, который имеет секретную ссылку, может редактировать страницу - ta-da, не нужно вообще прикасаться к машине Pyramid, вы просто публикуете «секретную» страницу публично, редактируемые. Если они знают ссылку, которую они могут редактировать. – Sergey

+0

Кажется, что головокружение очевидно, как только вы укажете его - спасибо @Sergey! Мой случай немного сложнее, но ваш вопрос все еще помогает очистить мой разум. –

ответ

1

Создайте случайное число и срок годности и сохраните их в базе данных. Создайте ссылку с этим номером и отправьте ее пользователю. Убедитесь, что при щелчке ссылки его сгенерированное случайное число соответствует одному в базе данных. Проверка подлинности пользователя Pyramid вручную:

from pyramid.security import remember, forget 

def authenticate_user(request, user) 

    if not user.can_login(): 
     raise AuthenticationFailure('This user account cannot log in at the moment.') 

    # get_session_token_from_user() is your custom function. 
    # It usually returns user.id - it's the key how session backend maps sessions 
    # back to authenticated user. 
    token = get_session_token_from_user(user) 

    headers = remember(request, token) 
    # assert headers, "Authentication backend did not give us any session headers" 

    if not location: 
     location = get_config_route(request, 'websauna.login_redirect') 

    # Send any custom events related to user login your appplication cares of 
    e = events.Login(request, user) 
    request.registry.notify(e) 

    # Redirect user to the post-login form location 
    return HTTPFound(location=location, headers=headers) 

Для конкретного случая использования делать одно время по электронной почте ссылку логины как провисает или Medium см websauna.magiclogin addon.

+0

Спасибо! Ваш код - довольно безболезненный способ узнать достаточно больше о Pyramid auth, чтобы делать то, что мне нужно. –

Смежные вопросы