django-social-auth icon indicating copy to clipboard operation
django-social-auth copied to clipboard

create_user is not getting called

Open nilatti opened this issue 3 years ago • 1 comments

0

I have a django application that uses django social auth to authenticate users with Google. It was working just fine and then....suddenly it stopped. I have no clue why. I've tried everything I can think of.

Here's my social auth pipeline:

SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details',
    'social_core.pipeline.social_auth.social_uid',
    'myapp.custom_social_auth_pipeline.auth_allowed', 
    'social_core.pipeline.social_auth.social_user',
    'social_core.pipeline.user.get_username',
    'myapp.custom_social_auth_pipeline.create_user', <--- also tried with social auth's create user function
    'social_core.pipeline.social_auth.associate_user',
    'social_core.pipeline.social_auth.load_extra_data',
    'social_core.pipeline.user.user_details',
)

And here's the code on my custom_social_auth_pipeline:

from django.contrib.auth.models import Group, User
from django.shortcuts import redirect

USER_FIELDS = ['username', 'email']

def create_user(strategy, details, backend, user=None, *args, **kwargs):
    print("CREATE USER CALLED") <-- this is never called! :(
    if user:
        return {'is_new': False}

    fields = dict((name, kwargs.get(name, details.get(name)))
                  for name in backend.setting('USER_FIELDS', USER_FIELDS))

    try:
        if User.objects.get(email=fields['email']):
            return {'is_new': False, 'user': User.objects.get(email=fields['email'])}
    except:
        pass
    if not fields:
        return

    fields['is_staff'] = True
    user = strategy.create_user(**fields)
    staff = Group.objects.get(name='Staff')
    user.groups.add(staff)
    return {
        'is_new': True,
        'user': user
    }

def auth_allowed(backend, details, response, *args, **kwargs):
    print ("AUTH ALLOWED CALLED") <-- this prints in my logs
    print(details) <-- this returns the correct user
    if not backend.auth_allowed(response, details):
        return redirect('/')

It's not returning any error and it is not redirecting to our "error" url. It's just behaving like it does if no one is signed in (the app has a public-facing page that is for people who are not signed in, and if you try to go to another url, you get bounced back to that one). I feel like I must be missing something obvious, but I can't figure out what.

One other thing: it works perfectly on my local machine. On my server (AWS Lambda) it does not.

I'm just at a loss for what else to try, and would appreciate any guidance you can offer.

nilatti avatar Jun 09 '21 22:06 nilatti

I just wanted to drop an update here. I figured out that I had updated some things, and the issue was that social-auth-core had upgraded to 4.1.0. After I downgraded this to 3.3.3, the problem resolved.

I only was able to figure this out because my coworker was able to push a build from her computer that worked, and so we compared our pip-freeze output.

No clue why it worked locally but not on our staging instance (AWS Lambda deployed via Zappa). I'm just putting this here so others can find it.

nilatti avatar Jun 16 '21 11:06 nilatti