電子メール アドレスの取得は簡単です。openid サーバーに要求するだけです。django-openid-auth はそのための設定を提供します:
OPENID_SREG_EXTRA_FIELDS = ['email']
私のプロジェクトでは、認証後に追加の作業も必要でした。シグナルで解決しました:
def register_login_signal():
from django.contrib.auth.signals import user_logged_in
from django.contrib.auth.models import User
user_logged_in.connect(your_function_name_here, sender = User)
def your_function_name_here(sender, **kwargs):
request = kwargs.get('request')
logout(request) if request.user.email not in your_list_of_authenticated_emails else pass
register_login_signal() をプロジェクトのinit .py ファイルのように使用される場所に配置することを忘れないでください
編集:
最初のコメント/質問。
追加フィールドの部分はドキュメントには記載されていません。また、github パッケージをスキャンすると、そのようなものは何もないことに気付くはずです。https://pypi.python.org/pypi/django-openid-auth/0.5の古いバージョンを使用しています。これをダウンロードして解凍し、django-openid-auth フォルダーにある views.py を開きます。OPENID_SREG_EXTRA_FIELDS を検索すると表示されます。settings.py で定義すると魅力的に機能します。
2番目の質問
非同期?いいえ、そうではありません。非同期は、現在の関数スタックの外で実行されるものになります-そのように説明できれば。これはそのようなものではありません。そのように想像してみてください-ログイン関数の最後に、ログイン関数の最後にフックされた関数があるかどうかのチェックがあります。そして、彼らは即座に実行されます。Djangoミドルウェアと同じくらい非同期です。まったくそうではありません。
しかし、それを行うのに適切な場所ですか?ユーザーが @login_required デコレータでログインしているかどうかを確認するようにサイトを設定していると思います-またはそのようなもの。
それでは、物事がどのように実行されるか見てみましょう:
1) openid サーバーは、最後の要求で要求したすべての情報を送信します
2) django-openid-auth login_complete ビューが引き継ぎ、バックエンドを使用してユーザーを認証します
3)そのプロセスの最後に、あなたが聞いている信号がトリガーされ、ユーザーの電子メールがリストに対してチェックされ、チェックが失敗した場合、彼は即座にログアウトされます。
4) ビューが完了すると、元のビューで "next" パラメータで指定された URL または設定で指定された LOGIN_REDIRECT_URL に自動的にリダイレクトされます。
5) そのビューの前に、すべてのミドルウェアとデコレーターが使用されます。@login_required デコレータのようなものを使用した場合 (これは、ログイン保護されたページごとに行うのが賢明です)、ユーザーを即座にログイン ページにリダイレクトします。シグナルで要求するために何らかのメッセージを追加することを気にした場合、メッセージが表示されます (ログイン/ログアウト ページがそれをサポートしている場合)。
そして最後に何か言いたいのですが、ログアウトするよりも強力な方法はありません。
/編集