2012-03-26 77 views
9

我有django社交认证安装(从omab),并且用户有一个电子邮件地址在数据库中,这是我想保留的,但当用户登录从facebook使用social-auth,他们的电子邮件被他们在facebook账户中的电子邮件取代。我不确定这些设置是否为默认设置,也无法找到如何阻止此行为。如何不设置用户的电子邮件地址在Django社会认证

回答

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应用程序中的解决方案?上面的代码应该去哪里? – 2013-04-04 15:07:36

+0

@ArpitRai如果你有一个相对较新版本的'social-auth',我建议你今天使用Zhe的答案(http://stackoverflow.com/a/16267281/556413) – glarrain 2014-04-21 21:51:23

9

你试过SOCIAL_AUTH_PROTECTED_USER_FIELDS? :)

从手册:

的update_user_details管线处理器将设置 用户对象的某些字段,如电子邮件。这组到字段列表,你只 要为新创建的用户设置:

SOCIAL_AUTH_PROTECTED_USER_FIELDS = [“邮件”,]

而且更多额外的价值将被保存,如果定义。有关此 设置的详细信息在下面的OpenId和OAuth部分中列出。

+0

我肯定会这样做的,但回到当天那是另一回事:)受保护的领域还没有引入。 – Bastian 2013-04-29 10:40:18

+0

是的,我知道。 昨天我试图解决它,我差点去glarrain的解决方案。然后我在手册中找到了这些设置。只是把它放在这里,以防有人TL; DR手册:) – 2013-04-29 11:22:17

+0

是的!给你+1 – Bastian 2013-05-09 23:51:35

相关问题