2012-03-26 4 views
9

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

答えて

5

私はpipelineにその責任が

social_auth.backends.pipeline.user.update_user_details 

で、それを見つけた私はパイプラインからそれを削除し、現在のメールアドレスと名前などの詳細を埋めるために、ユーザに委ねられています。

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() 
+0

こんにちは。私がDjangoアプリケーションに上記の投稿したソリューションを実装するにはどうすればいいですか?上記のコードはどこにあるべきですか? –

+0

@ArpitRaiあなたが 'social-auth'の比較的新しいバージョンを持っているなら、私はZheの答え(http://stackoverflow.com/a/16267281/556413) – glarrain

9

あなたはSOCIAL_AUTH_PROTECTED_USER_FIELDSを試してみましたか? :)マニュアルから

update_user_detailsパイプラインプロセッサは、電子メールなど ユーザーオブジェクト、上の特定のフィールドを設定します。 SOCIAL_AUTH_PROTECTED_USER_FIELDS = [「メール」、]

をまた、より多くの余分な値があれば保存されます:あなたが唯一の 新しく作成されたユーザーに対して設定したいフィールドのリストに設定します定義された。この の設定の詳細は、以下のOpenIdとOAuthセクションに記載されています。

+0

を今日お勧めしました。私は間違いなくそれをやるでしょうが、それは別の話だった:)保護フィールドはまだ導入されていない。 – Bastian

+0

ええ、私は知っています。 私は昨日それを解決しようとしていました。私はほとんどglarrainの解決策に出かけました。それから私はマニュアルでこの設定を見つけました。場合は、誰かのTLの;ここでそれを置くDRマニュアル: –

+0

うん!あなたに+1をくれました – Bastian

関連する問題