2016-08-22 6 views
2

私はPyramidアプリケーションを構築しています。 「通常の」使用法では、ユーザーは一般的なユーザー名/パスワードを使用してログインする必要があります。ピラミッドのドキュメントでは、切り取りと貼り付けが簡単に行えるようになりました。Pyramidの一時URLを持つ認証/認証

しかし、私はアカウント/パスワードのUIを体験したくない人に制限付き(権限と時間の両方で権限の有効期限が切れる)の編集機能を拡張したいと考えています。私は生成したリンクを電子メールで送信したいのですが、リンクをクリックすると、関連するページに着信して特定の変更を行うことができます。

リンクを生成してデータベースに保存し、ユーザー名と有効期限を関連付けているような明白なものは問題ありません。これは、これをPyramid ident/authフレームワークに差し込んでいます。これは、わかりません。これまでのところ、コードを深く理解することなくこれまでのことをしてきました。誰かに、私がその周りに横たわってやりたいことのコード例があることを願って、私はその話題に没頭し続けることができました。

答えが怠けてドキュメントを読んでいない場合は、尋ねるのに少し費用がかかります。 :-)

+0

これを見るもう1つの方法は、秘密のリンクを持つ_anonymous_ユーザーがページを編集できることです。ピラミッドの認証機関には全く触れる必要はなく、単に「秘密」ページを公開するだけです。編集可能。彼らがリンクを知っている場合、彼らは編集することができます。 – Sergey

+0

あなたが一度それを指摘したら頭が叩かれているように見えます - ありがとう@Sergey!私の場合は、それより少し複雑ですが、あなたのポイントはまだ私の心をクリアするのに役立ちます。 –

答えて

1

乱数と有効期限を作成し、データベースに格納します。この番号のリンクを生成してユーザーに送信します。リンクがクリックされると、生成された乱数がデータベース内の乱数と一致することを確認します。手での認証ピラミッドのユーザー:スラックやミディアムなどの一回のメールリンクログインを行うための具体的なユースケースについては

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) 

websauna.magiclogin addonを参照してください。

+0

ありがとうございます!あなたのコードは、私が必要とすることを行うためにピラミッドの認証に関する十分な情報だけを学ぶためにかなり無痛な方法です。 –