9

django social-authを(omabから)インストールしていて、ユーザーはデータベースに保持したいメールアドレスを持っていますが、ユーザーがsocial-authを使用してFacebookからログインすると、メールは自分のメールアドレスに置き換えられますFacebookアカウントで。設定がデフォルトの設定であるかどうかわからないため、この動作を停止する方法を見つけることができません。

4

3 に答える 3

9

SOCIAL_AUTH_PROTECTED_USER_FIELDSを試しましたか?:)

マニュアルから:

update_user_detailsパイプラインプロセッサは、電子メールなどのユーザーオブジェクトに特定のフィールドを設定します。これを、新しく作成されたユーザーにのみ設定するフィールドのリストに設定します。

SOCIAL_AUTH_PROTECTED_USER_FIELDS = ['email'、]

また、定義されている場合は、より多くの追加の値が格納されます。この設定の詳細は、以下のOpenIdセクションとOAuthセクションにリストされています。

于 2013-04-28T20:06:49.620 に答える
5

私はそれを見つけました、パイプラインでそれの責任は

social_auth.backends.pipeline.user.update_user_details

パイプラインから削除したところ、メールアドレスや名前などの詳細はユーザーに入力する必要があります。

于 2012-03-27T15:57:21.093 に答える
3

私は自分のソリューションを投稿しているので(ユーザーの詳細を更新し、上書きしないでください)、誰かを助けるかもしれません。pipeline.user.update_user_details私が以下をコーディングしたことに基づいています:

def fill_user_details(backend, details, response, user, is_new=False, *args,
                        **kwargs):
    """Fills user details using data from provider, without overwriting
    existing values.

    backend: Current social authentication backend
    details: User details given by authentication provider
    response: ?
    user: User ID given by authentication provider
    is_new: flag

    source: social_auth.backends.pipeline.user.update_user_details
    """
    # Each pipeline entry must return a dict or None, any value in the dict
    # will be used in the kwargs argument for the next pipeline entry.
    #
    # If any function returns something else beside a dict or None, the
    # workflow will be cut and the value returned immediately, this is useful
    # to return HttpReponse instances like HttpResponseRedirect.

    changed = False  # flag to track changes

    for name, value in details.iteritems():
        # do not update username, it was already generated
        if name in (USERNAME, 'id', 'pk'):
            continue

        # set it only if the existing value is not set or is an empty string
        existing_value = getattr(user, name, None)
        if value is not None and (existing_value is None or
                                  not is_valid_string(existing_value)):
            setattr(user, name, value)
            changed = True

    # Fire a pre-update signal sending current backend instance,
    # user instance (created or retrieved from database), service
    # response and processed details.
    #
    # Also fire socialauth_registered signal for newly registered
    # users.
    #
    # Signal handlers must return True or False to signal instance
    # changes. Send method returns a list of tuples with receiver
    # and it's response.
    signal_response = lambda (receiver, response): response
    signal_kwargs = {'sender': backend.__class__, 'user': user,
                     'response': response, 'details': details}

    changed |= any(filter(signal_response, pre_update.send(**signal_kwargs)))

    # Fire socialauth_registered signal on new user registration
    if is_new:
        changed |= any(filter(signal_response,
            socialauth_registered.send(**signal_kwargs)))

    if changed:
        user.save()
于 2012-06-01T20:45:09.873 に答える