10

私はdjango social-auth(http://django-social-auth.readthedocs.org/en/latest/index.html)を使用しており、ユーザーが複数のアカウントを関連付けることができるユーザープロファイルを作成しようとしています(Stackoverflowのように) .

現在、単一のユーザーが異なる認証プロバイダーを使用してログインできるようになっていますが、ログインごとに新しいユーザーが作成されます。すべてのユーザー アカウントを 1 つのアカウント (ユーザー プロファイルなど) に関連付けるにはどうすればよいですか?

また、django social-auth を使用する場合にユーザー プロファイル ページを作成するためのベスト プラクティスは何ですか?

4

2 に答える 2

11

DSA はすでに複数のアカウントの関連付けをサポートしています。秘訣は、ユーザーがログインしている必要があることです。ログインしていない場合、DSA は、既存のアカウントに関連付けられる必要があることを知りません。

プロファイルに関して、DSA に機能を追加する推奨される方法は、パイプラインを拡張することです。次のようなエントリを作成できます。

def create_profile(user, is_new=False, *args, **kwargs):
    if is_new:
        # create a profile instance for the given user
        create_user_profile(user)

次に、次のように設定に登録します。

SOCIAL_AUTH_PIPELINE = (
    'social_auth.backends.pipeline.social.social_auth_user',
    'social_auth.backends.pipeline.user.get_username',
    'social_auth.backends.pipeline.user.create_user',
    'social_auth.backends.pipeline.social.associate_user',
    'social_auth.backends.pipeline.social.load_extra_data',
    'social_auth.backends.pipeline.user.update_user_details',
    'myapp.pipeline.create_profile'
)

エントリは、その関数を取得するためのインポート パスです。

編集:ドキュメントへのリンクと設定の説明。

于 2013-04-15T17:46:50.047 に答える
1

複数のアカウントの関連付けを処理したい場合は、次の 2 つの選択肢があります。

    1. すべての ID プロバイダーが持つ固有の属性を見つけます。
    1. 基本認証を保持し、残りのすべての ID プロバイダーをそれにリンクします。

最初のアプローチには 2 つの欠点があります

  • すべての ID プロバイダーに存在する属性が存在しない可能性があります。過去に人々が行った一般的な実装の 1 つは、メールをこの属性として使用してユーザーを識別することですが、たとえば、Twitter はメールを共有しなくなりました。

  • 一貫性のない問題を見つける可能性があります。たとえば、人々は異なるプロバイダーでユーザー名または電子メールに異なる値を設定できます。

2 番目のアプローチを実装することをお勧めします。プライマリ ID プロバイダー (LDAP、データベース、またはクローズドで安全な認証) を設定します。また、ユーザーが「X ID プロバイダーをあなたのアカウントにリンクする」ことを希望するたびに、このプロバイダーが使用する属性を探し、プライマリ ID とその新しい ID の間のこの関係をテーブルに保存します。

データの衝突にも注意してください。データが間違っていたり期限切れになったりしないように、ローカル アカウントのデータを設定するときに優先するプロバイダーを設定します。(「保証レベル」について何かを読んでください)

これは古い議論なので、何かを実装するにはまず読み始めてください。この問題に関する多くの興味深いドキュメントがあります

django の特定の問題に関連しています。相違点djago social-auth apps間のこの比較をお読みください。django-socialprofileとこの古いスレッドも確認してください

于 2013-04-15T14:29:25.310 に答える